1. TRUNC
- 숫자나 날짜 값을 특정 정밀도로 잘라내는 데 사용
1) 숫자
TRUNC(number, decimal_places)
* decimal_places: 잘라낼 소수점 이하 자리 수 (생략 가능, 기본값은 0)
ex) Trunc(123.456,2) → 123.45
Trunc(123.456,-1) → 120
2) 날짜
TRUNC(date,format)
* format: 잘라낼 단위 (생략 가능, 기본값은 'DD')
ex) Trunc(2024-05-31,'YYYY') → 2024-01-01
Trunc(2024-05-31,'MM') → 2024-05-01
2. 그룹화
- 조건이 있는 상황에서 그룹화를 해야한다면 먼저 조건절에 해당하는 테이블을 먼저 만들어 둔 뒤 Where 을 통해서 합칠 것
Q: REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류,
ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요.
이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
A :
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 food_type)
group by 1
order by FOOD_TYPE desc
오답 : 이렇게 되면 즐겨찾기 수와 식당 이름이 일치하지 않게 됨
SELECT FOOD_TYPE, REST_ID, REST_NAME, max(FAVORITES)
from REST_INFO
group by 1
order by FOOD_TYPE desc
3. Substring
SUBSTRING(string, start, length)
*string: 원본 문자열
*start: 추출을 시작할 위치(1부터 시작)
*length: 추출할 문자열의 길이
ex) SELECT SUBSTRING('Hello, World!', 8, 5) → World만 출력
4. Join
- 3개 이상 테이블 조인할때 key 값이 존재한다면 join과 on으로 계속 연결해도 됨
ex)
select *
from BOOK A
join AUTHOR
on A.BOOK_ID = B.BOOK_ID
join SALES C
on B.AUTHOR_ID = C.AUTHOR_ID
5. 조건절
- 조건에 해당하는 column을 잘 읽고 where 절에서 우선적으로 조건에 해당하는 테이블 만들어두기
Q: 물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력
A:
select ID, FISH_NAME, LENGTH
from FISH_INFO A
join FISH_NAME_INFO B
on A.FISH_TYPE = B.FISH_TYPE
where (A.FISH_TYPE,LENGTH) in
(select FISH_TYPE, max(LENGTH)
from FISH_INFO
group by 1)
order by 1
* "물고기 종류"별로 "가장 큰" 물고기 → where 절에서 FISH_TYPE, max(LENGTH)로 우선적으로
조건 만들어두기!