미루고 미루던 SQL 공부를 시작했다.
모든 강의가 그렇듯 초반부는 SELECT로 원하는 컬럼만 뽑는 정도라 쉬운 줄 알았는데,
뒤로 갈수록 조건을 조합하고 카테고리별로 묶어서 계산하는 부분에서 생각보다 헤맸다.
select 뭘 → from 어디서 → where 어떤 조건으로 → group by 어떤 단위로 → order by 어떤 기준으로
SWFGO 로 일단 구조화했다.
1. WHERE: 조건에 맞는 행만 걸러낸다
2. 비교연산자 / BETWEEN / IN / LIKE: WHERE 안에서 조건을 다양하게 쓰는 방법
3. 컬럼 선택과 별명: 필요한 컬럼 고르고, 보기 편하게 이름을 바꾸기
4. GROUP BY: 카테고리 단위로 묶어서 집계 함수를 적용한다
5. ORDER BY: 결과를 원하는 기준으로 정렬한다
이 다섯 개가 각각 따로 노는 게 아니라, 같은 순서로
"어떤 테이블 - 어떤 컬럼 - 어떤 조건 - 어떤 함수"를 정리하고 나서 쿼리를 짜는 방식이 반복됐다.
이 틀 자체가 오늘 배운 것 중 제일 중요한 것이지 않을까하는 생각.
WHERE 절
select * from 테이블 where 조건 구조. 숫자는 그냥 쓰고 문자는 작은따옴표로 감싼다.
큰 따옴표로 해도 문제없이 실행될 때도 있는데 이유는 몰?루
where age=21
where gender='female'
비교연산자, BETWEEN, IN, LIKE
= 같다
<> 같지 않다
> 크다, >= 크거나 같다
< 작다, <= 작거나 같다
이건 평범한 사칙연산 수준 개념
여기에 세 가지 표현이 추가된다.
between a and b: 두 값 사이. 예) where age between 10 and 20
in (a, b, c): 여러 값 중 하나에 해당. 예) where cuisine_type in ('Korean', 'Japanese')
like '패턴': 부분적으로 일치. %가 와일드카드 역할을 한다.
- '김%' : 김으로 시작
- '%임' : 임으로 끝
- '%Next%' : Next를 포함
% 와 같이 실생활에서 거의 쓰지 않는 수식들이나 표현들이 컴퓨터 속에서 의미를 가질 때
익히기가 익숙치 않은 건 당연한 수순이지 않을까...하는 생각이 듬. 오히려 외우기 쉬울지도??
컬럼 선택과 별명
전체 컬럼(*) 대신 필요한 컬럼만 골라서 쓸 수 있다.
select order_id, restaurant_name
from food_orders
별명은 두 가지 방식으로 지정 가능하다.
컬럼1 as 별명1
컬럼2 별명2
영문/언더바는 그냥 적고, 특수문자나 한글이 들어가면 큰따옴표로 감싸야 한다.
select order_id as ord_no,
restaurant_name "식당 이름"
from food_orders
GROUP BY
카테고리 컬럼을 지정 후 group by를 붙이면,
where로 조건을 수십 번 나눠서 쿼리를 짜는 대신 한 번에 카테고리별 집계가 가능하다.
select cuisine_type,
sum(price) sum_of_price
from food_orders
group by cuisine_type
group by는 "어떤 기준으로 묶을지"를 정하는 거고, 그 옆에 sum, max, avg, count 같은 집계 함수가 같이 와야 의미가 생긴다는 점이 처음엔 헷갈렸다. 그냥 group by만 쓰면 아무 의미가 없다.
ORDER BY
정렬은 기본 오름차순,
내림차순을 원한다면 desc를 붙이기.
select cuisine_type,
sum(price) sum_of_price
from food_orders
group by cuisine_type
order by sum(price) desc
order by에는 집계 함수(sum(price) 같은) 자체를 기준으로 넣을 수 있다는 게 신기했다.
select 절에 있는 컬럼이 아니어도 계산식을 그대로 정렬 기준으로 쓸 수 있다는 뜻.
종합 실습 패턴
예제 1: 30,000원 이상 주문 건수
select count(order_id) count_of_orders
from food_orders
where price>=30000
예제 2: 한국 음식 평균 가격
select avg(price) as average_price
from food_orders
where cuisine_type='Korean'
두 예제 모두 where로 먼저 걸러내고 나서 집계 함수를 적용하는 순서였다.
group by 없이도 조건만 걸면 전체에 대한 집계가 가능.
오늘 제일 걸렸던 부분은 GROUP BY다. select 절에 그냥 컬럼을 나열하는 감각으로 접근했다가, "카테고리 컬럼 + 집계 함수" 조합이 아니면 에러가 난다는 걸 몸으로 느꼈다.
그리고 select - from - where - group by - order by 순서로 쿼리를 쓰지만,
머릿속에서 생각하는 순서(어떤 조건 → 어떤 단위로 묶고 → 어떻게 정렬할지)와 실제로 코드를 치는 순서가 달라
순서를 헷갈렸다.
IF문이랑 REPLACE 관련 부분은 다음 TIL에서 정리가 필요할 듯.
지금 기억으로는 조건별로 값을 다르게 반환하는 로직(IF/CASE 계열)과 문자열 치환(REPLACE) 쪽에서
문법 자체보다 "어디에 넣어야 하는지" 위치를 잡는 게 헷갈렸던 것 같다.
WHERE절의 LIKE 패턴에서 %의 위치에 따라 결과가 완전히 달라지는 부분도 한 번 더 짚고 넘어가야 할 것 같다. 시작/포함/끝 세 가지를 헷갈리지 않으려면 손으로 몇 번 더 써봐야 할 듯.
where로 조건을 걸러내고, 비교연산자와 between/in/like로 조건을 표현.
select에서 필요한 컬럼만 고르고 별명(as 나 공백)을 붙여 가독성을 높인다.
group by는 반드시 집계 함수와 짝을 이뤄야 의미가 있고, 카테고리별 연산을 한 번에 처리해준다.
order by는 desc로 내림차순을 지정하며, 집계 함수 결과 자체를 기준으로도 정렬할 수 있다.
쿼리를 짜기 전에 "어떤 테이블 - 어떤 컬럼 - 어떤 조건 - 어떤 함수"를 먼저 말로 정리하는 습관이 실수를 줄이는 데 제일 효과적.