오늘은 첫 개강 날.
첫 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 문은 가독성을 높여주고, 유지보수에 더 이점을 가진다고 한다.
'오늘 나는 (TIL)' 카테고리의 다른 글
[TIL 240701] datediff, window function, cominations & permutations (0) | 2024.07.01 |
---|---|
[TIL 240628] Pivot Table, Window Function (0) | 2024.06.28 |
[TIL 240627] union, update, insert, delete, multiple_join (0) | 2024.06.27 |
[TIL 240626] Where 절과 Having 절, Inline View, Scalar Subquery (0) | 2024.06.26 |
[TIL 240625] Map 과 Lambda, 그리고 수의 진수 바꾸기 (0) | 2024.06.25 |