오늘 나는 (TIL)

[TIL 240624] Where 문과 Subquery, With 문

thebuck104 2024. 6. 24. 21:06

오늘은 첫 개강 날.

 

첫 OT를 듣고, 팀원 분들과 통성명을 하고 이런저런 아이스 브레이킹 타임을 가진 후에

 

SQL 문제 풀이에 돌입했다!

그러면서 학습 한 것들은 아래와 같다.


1. 정규 표현식 - Regular Expression (regexp)

 

예시)

where column_name regexp “A|B|C”

where column_name in ("A","B","C")

 

파이썬과 마찬가지로 정규 표현식을 활용할 수 있었다. 

위의 표현식은 "A or B or C 가 있다면" 이 된다.

 

2. Round 와 Truncate 함수

예시)

select round(column_name, 2) from table

select truncate(column_name, -4) from table

 

round 는 올림, truncate는 버림이다.

소수점을 중심으로 +와 - 로 나뉘어 쓸 수 있다.

 

3. date_format 함수

예시)

where date_format(date_column, “%Y-%m-%d”) = "2024-06-24"

 

" " 속 알파벳은 대문자와 소문자 가능.

예)
%Y : 2024

%y : 24

%M : June

%m : 06

%D : 24th

%d : 24

 

4. where (column1, column2) in Subquery

예시)

select FOOD_TYPE, REST_ID, REST_NAME, FAVORITES from rest_info

where (food_type, favorites) 

in

(select food_type, max(favorites)
from rest_info
group by 1)

order by 1 desc

 

오늘 학습 한 내용 중 가장 중요한 부분

 

max 나 min 같은 함수는 단 하나의 값을 가진다.

그러므로 food_type 별로 max 값을 찾을 수는 있으나,

위 처럼 rest_name 같은 다른 변수가 개입하면 

group by를 할 때 max 값이 아니어도 rest_name (등 중복값이 있는 column)의 순서대로

"가장 위에 있는 값이 select 될 수 있다".

 

그래서 서브 쿼리를 활용해서 food_type 별로 "max 값을 제대로 select 해 놓고",

메인 쿼리에서 rest_id, rest_name 등을 같이 select 하고

"서브 쿼리에 활용된 두 가지 변수를 in 으로 다시 대응시켜 준다".

 

5. with 서브쿼리 문

예시)

with temp as 
(select category, max(price) price
from food_product
group by category)

select p.category, p.price, p.product_name
from food_product p inner join temp t on

(p.category = t.category and p.price = t.price)

where p.category in ("과자","국","김치","식용유")
order by t.price desc;

 

정말 신기한 with 문

python의 with open ~ as 와 비슷하다고 생각하며 외우면 될 것 같다.

 

1. with 문을 작성해서 내가 원하는 카테고리 별 max/min 값을 구해놓고, temp 로 저장한다.

2. 내가 원하는 column들을 select 하면서, 이를 temp와 inner join 한다.

3. inner join 하기 때문에, temp와 겹치는 애들만 남기 때문에 max 값을 온전히 구할 수 있다.

 

여기서 특이한 점은 "inner join ~ on 을 and 로 두 번 해준다".

1. 내가 찾는 카테고리

2. 내가 찾는 max/min 값

 

항상 서브쿼리를 쓸 때 서브가 안에 있고 메인이 밖에 있는 구조라

아래에서 위로 코딩을 하는 게 아주 불편하다고 생각했는데

with 문을 활용한다면 그런 불편도 없어질 듯 하다.

 

with 문은 가독성을 높여주고, 유지보수에 더 이점을 가진다고 한다.