[SQL] 기본 문법 복습과 서브쿼리(Subquery)
Updated:
2월에 진행되는 데이터리안 SQL 강의를 결제했다. SQL 복습도 하고 사이드 프로젝트도 해볼 겸 신청했다. 강의는 매주 월요일 저녁 (총 4일)에 온라인으로 진행된다.
-
기간: 2022.2.7일(월) ~ 2.28일
-
범위: 서브쿼리, 윈도우함수, 개인 프로젝트
SQL 기본 문법 복습
n년만에 SQL하려니까 select, from, where 말고 기억이 안 나서 데이터리안에서 추천해준 책 SQL 첫걸음 참고해서 감을 되살리는 중! 예전에 면접 봤을 때 이 정도만 복습하고 갔어도 훨씬 대답을 잘 했을텐데 싶었다.
SELECT column1 as new_name1, column2
-- *은 전체 column 의미
-- max, min , sum, count 등 집계함수 사용 가능
-- column1 new_name1 이렇게 칼럼 이름을 alias로 정의할 수 있음
FROM table1 t1
JOIN table2 t2 on t1.key = t2.key
WHERE condition1
-- 참조할 table에 조건 걸기
-- SELECT에서 정의한 칼럼 이름 사용 불가
-- 연산 처리 가능
GROUP BY
-- 그룹을 묶을 때
-- SELECT에서 정의한 칼럼 이름 사용 가능 (MYSQL)
HAVING
-- GROUP BY에 조건 걸기
ORDER BY
-- 정렬하기
-- 디폴트는 ASCENDING, 내림차순으로 바꾸고 싶으면 ORDER BY OOO DESC
-- 칼럼 여러개 지정하면 순서대로 정렬됨
LIMIT
-- 결과로 반환되는 행 개수 제한
-- SELECT문의 마지막에 지정
-- 표준 SQL은 아님. SQL Server에서는 SELECT TOP 사용**FROM 절 서브쿼리**
- 예약어(
SELECT
,FROM
등)와 DB 객체명은 대소문자 구별 안 함 - 서로 다른 값인지 비교할 땐
<>
- NULL 값 검색은
IS NULL
,IS NOT NULL
- 반올림은
ROUND(input, decial_point)
- CASE문:
CASE WHEN 조건식1 THEN 값1 ELSE 값2 END
- ELSE 지정 안하면 ELSE NULL이 들어감
- IF문:
IF(condition1, value_when_true, value_when_false)
예시
Q. 아래 테이블에서 id별로 1월, 3월 매출 합이 9000 이상인 결과만 출력하기
id | revenue | month |
1 | 8000 | Jan |
2 | 9000 | Jan |
3 | 10000 | Feb |
1 | 7000 | Feb |
1 | 6000 | Mar |
A:
select id, sum(revenue) as revenue_sum
from Department
where month = 'Jan' or month = 'Mar'
group by id
having revenue_sum > 9000
서브쿼리 (Subquery)
서브쿼리는 SQL 쿼리 안에 들어가는 SELECT 문을 의미한다. WHERE
구, FROM
구와 함께 쓸 수 있다.
예시 - Department Table
id | revenue | month |
1 | 8000 | Jan |
2 | 9000 | Jan |
3 | 10000 | Feb |
1 | 7000 | Feb |
1 | 6000 | Mar |
WHERE구 서브쿼리
1. 스칼라 값을 반환하는 경우
query가 스칼라값을 반환하기 때문에 비교연산자 사용
--Q. Department 테이블에서 매출이 평균보다 많이 발생한 부서의 id와 month를 출력하시오
select id, month
from department
where revenue > (
select avg(revenue)
from department
)
2. 칼럼 N개, 열 1개를 반환하는 경우
query가 여러 개의 행을 반환하기 때문에 in, not in 사용
--Q. Department 테이블에서 월별 매출이 15000 이상인 달의 결과만 출력하시오
select *
from department
where month in (
select month
from department
group by month
having sum(revenue) > 15000
)
3. 칼럼 N개, 열 N개를 반환하는 경우
-- Q.부서 id별로 가장 높은 매출을 기록한 경우를 출력하시오
select *
from department
where (id, revenue) IN (
select id, MAX(revenue)
from department
group by id
)
FROM구 서브쿼리
FROM
에 서브쿼리를 쓸 땐 alias를 반드시 써줘야한다.
--- Q. 월별 매출 중 가장 높은 값을 출력하시오
select max(sum_rev)
from (select month, sum(revenue) as sum_rev
from department
group by month ) as max_rev
같은 테이블을 계속 써야할 땐 WITH
로 작성할 수 있다.
--- Q. 월별 매출 중 가장 높은 값을 출력하시오
with max_rev as (
select month, sum(revenue) as sum_rev
from department
group by month
)
select max(sum_rev)
from max_rev
1주차 리뷰
강의에서 과제로 내 준 Leetcode, Hackerrank, solvesql 문제 풀다보니까 조금씩 익숙해지는 것 같다. 혼자서 먼저 풀어보고 나중에 해설을 확인하는데, 내 코드는 길고 지저분한데 해설은 깔끔한 경우가 많다. 내 코드도 짧고 이해하기 쉽게 쓰려고 노력해야겠다.
SQL 문제를 보면 R이나 Python으로 풀 방법이 먼저 떠오른다. 이 문제는 함수를 쓰면 편할 것 같다거나 결과값을 변수에 저장하고 싶다거나… SQL에 더 적응하면 덜 그러겠지?
SQL 배워서 내 github page를 분석해보면 재밌을 것 같다. 이번에 ‘데이터 분석을 위한 SQL 레시피’라는 책을 샀는데 분석에 실제로 적용해볼 만한 내용이 많아 보인다. 강의 들으면서 틈틈이 따라해봐야겠다.