본문 바로가기
부트캠프(LIKELION AIS7)/수업

[AI스쿨 7기, 1주차] SQL 기초

by aimaimee 2023. 4. 8.

데이터리안의 SQL 강의. 1교시(~12:00) SQL 기초 문법 실습. / 2교시(~15:30) 인프런 SQL 강의 / 3교시(~17:50) DB 기본 이론 (행과 열, DQL, DML, 논리연산자, 비교연산자, LIKE, IN, BETWEEN, IS NULL, 문자열 자르기, 반올림 등)
데이터리안 강의

220923

SQL 첫걸음

시작하기 전

입문으로는 JOIN까지. RFM Segmentation은 고객 분석(실무에 활용할 수 있다고 해서 기대된다.)

Pandas Join 함수 잘 기억이 안나는데 다시 찾아보기


데이터 분석가를 하고 싶다면, 수업 끝나고서라도 서브쿼리, 윈도우 함수 같은 것은 개인적으로 공부하기!

  • 실행 단축키 ctrl+enter , 주석처리 단축키 ctrl+/ (주석 처리는 -- 또는 문장 전체 주석처리 /* + */)
  • 테이블은 행(row, 가로로 한 줄, 데이터), 열(column, 세로로 한 줄, 데이터 특성) 파이썬이랑 판다스 하면서 행, 열이 혼란스러웠는데 제대로 기억되었다!
  • 파이썬은 코드 윗줄부터 순서대로 실행하지만, SQL은 전체 코드를 읽어보고 실행할 데이터 순서를 출력한다.
  • 쿼리 결과 저장을 csv, xlsx 형식으로 다운 가능
  • 대소문자 구분
  • SELECT는 DQL(Data Query Language) 질의어
  • INSERT, UPDATE, DELETE는 DML(Data Manipulation Language) 조작어

SELECT, FROM, LIMIT, 대소문자, AS

SELECT *(아스타, asterisk) 모든 데이터 출력

  • 일부 열만 가져오기
    • SELECT name, address 에 해당 컬럼을 가져오도록.
  • 일부 행만 가져오기
    • 특정 조건을 만족하는 데이터 가져오기.
      SELECT *
      FROM 장소
      WHERE local = "특정장소"
  • 대소문자 구분
    • WHERE type = "LCD" 하면 출력되지만 WHERE type = "lcd' 하면 데이터가 나오지 않음.
  • 별칭(AS), Alias
    • SELECT name AS station_name 과 같이 출력하는 컬럼에 별칭을 넣을 수 있음. --name을 station_name으로 출력하고 싶다.
    • AS 생략 가능 : SELECT name station_name
    • 별칭에 띄어쓰기 : SELECT name AS 'station name'

논리 연산자 AND, OR, IN, 비교 연산자 >

AND, OR, IN (논리 연산자)

WHERE local IN ('지역1', '지역2')
WHERE local = '지역1' OR local = '지역2'
WHERE local = '지역1' OR '지역2' 이렇게는 안됨
or은 합집합 / and 는 교집합 계속 틀리는데 혼동하지 말기

>, >=, <, <=, =, !=(<>) (비교 연산자)

  • 숫자만 아니라 문자도 비교 가능. WHERE CustomerName < 'B' 이름이 A로 시작하는 사람이 나열됨.
  • 위도(숫자)보다 북쪽에 위치한 정류소 중에, '지역1'에 위치한 정류소.
    WHERE 위도 > 숫자
    AND local = '지역1'

ORDER BY, DESC, ASC

ORDER BY updated_at DESC, station_id
ASC는 생략 가능. DESC는 내림차순, ASC는 오름차순
DESC는 100->1, 큰 것부터/ ASC 는 1->100, 작은 것부터
DESC는 최근 업데이트 / ASC는 옛날 업데이트
가장 비싼 물건 보고 싶다. (cf. 가장 싼 물건은 price ASC/ 비싼 상위 3개는 price DESC 하고 LIMIT 3)


해커스 랭크 문제

https://www.hackerrank.com/

  • Select All
  • Weather Observation Station 1

LIKE, IN, BETWEEN, IS NULL

  • WHERE country LIKE 'BR%' --BR로 시작하는 브라질을 찾아준다. % 뒤에 어떤 것이 와도 상관 없다.
  • LIKE 'r%' 앞 뒤는 상관 없고, r 이 들어가 있는 자료를 찾아준다.
  • %는 와일드카드라고도 함.
  • __WHERE country LIKE 'Brazil' 보다 WHERE country = 'Brazil'이 훨씬 속도가 빠르다.
  • WHERE country LIKE 'B_' 하면 Belgium이 없어지고 Brazil만 나온다. _를 다섯 개 써줘서 글자수를 정했기 때문.
  • _는 한 글자 와일드카드라고도 함.
  • % 자체를 찾고 싶다면, \%를 써주면 된다. ex) 두 자릿 수 할인을 받는 사람 찾고 싶다->WHERE discount LIKE '__\%'
  • %는 예약어지만 \를 넣어줌으로써 이스케이프. 예약어를 탈출한다.
  • 검색 팁 postgresql, mssql, redshift -> redshift like % escape로 검색하면 다른 환경에서 어떻게 사용하는 지 찾을 수 있다.
  • WHERE customerID BETWEEN 3 AND 5
    는 WHERE customerID >= 3 AND customerID <= 5와 동일
  • WHERE customerID IS NULL
  • 하지만 WHERE customerID = NULL 하면 작동하지 않음
  • NULL, NaN(Not a Number)

해커스 랭크 문제

  • Revising the Select Query I
  • Select By ID
  • Weather Observation Station 6\
    SELECT city
    FROM station
    WHERE city LIKE 'a%'
    OR city LIKE 'e%'
    OR city LIKE 'i%'
    OR city LIKE 'o%'
    OR city LIKE 'u%'

SELECT DISTINCT city 는 duplicate 중복 값 제거

  • Weather Observation Station 12
    aeiou로 시작하지 않으면서 aeiou로 끝나지 않은 값.
    SELECT DISTINCT city
    FROM station
    WHERE city NOT LIKE 'a%'
    AND city NOT LIKE 'e%'
    AND city NOT LIKE 'i%'
    AND city NOT LIKE 'o%'
    AND city NOT LIKE 'u%'
    AND city NOT LIKE '%a'
    AND city NOT LIKE '%e'
    AND city NOT LIKE '%i'
    AND city NOT LIKE '%o'
    AND city NOT LIKE '%u'
    AND, OR 헤깔린다
  • Employee Names
  • Employee Salaries AND 랑 OR 또 틀렸따!!!! 분노!!!!
    SELECT name
    FROM Employee
    WHERE salary >= 2000 AND months < 10
    ORDER BY employee_id ASC

MySQL 문자열 자르기

LEFT(), RIGHT(), SUBSTRING=SUBSTR

  • Higher Than 75 Marks
    SELECT Name
    FROM Students
    WHERE Marks > 75
    ORDER BY RIGHT(name, 3) ASC, ID ASC ORDER BY 두가지 조건 , 로 이어주는거 잊지 말기!

CEIL(), FLOOR(), ROUNG()

CEIL() 올림. 5.5->6
FLOOR() 내림. 5.5->5
ROUND() 반올림. ROUND(5.556901, 4) ->5.5569

  • Weather Observation Station 15
    SELECT ROUND(LONG_W, 4)
    FROM station
    WHERE LAT_N < 137.2345
    ORDER BY LAT_N DESC
    LIMIT 1

댓글