COUNT
count함수는 null을 세지 않는다. count(*)와 count(null이 있는 속성)시에는 결과가 다르다.
CASE
SQL에서의 case문은 조건 충족 시 break 없어도 멈춘다.
SELECT
CASE
WHEN false THEN '참입니다'
ELSE
'거짓입니다'
END
as 대신 then 사용한다.
EXTRACT
hour, dayofweek, minute, second 등 다양한 정보를 빼낼 수 있다.
select
extract(YEAR FROM created_at) as year
from `thelook_ecommerce.users`
Join 없이 where로 Join인척 하기
select from a, b where a.user_id = b.id
select from a join b on a.user_id = b.id
위의 SQL문은 같은 결과를 보여주지만 실제로는 a의 행당 b 테이블이 붙어 카디션 곱만큼의 로우가 생성된다.
따라서 왠만하면 JOIN을 쓰자
비정규화
자주 사용되는 조인 테이블을 유지하는 것이 정처기 때 달달 외웠던 비정규화이다.
트랜잭션 데이터와 마스터 데이터
트랜잭션 데이터는 트랜잭션 데이터는 다양한 애플리케이션에서 일상적인 비즈니스 프로세스를 실행하거나 지원할 때 생성되는 데이터이고 마스터 데이터는 착실히 쌓이면서 트랜잭션 데이터에서 참고되는 데이터이다. 조인시에 외래키를 가지는 테이블이 트랜잭션 데이터, PK에 해당하는 테이블이 마스터 데이터이다. 조인을 할때는 트랜잭션 데이터 이후에 마스터 데이터를 이용한다.
User, Product, Order(User_Product) Table이 있을 때 보통은 다음과 같이 사용한다.
select
orders.order_id,
users.name,
orders.created_at
from order as orders
join user as users on orders.user_id = users.id
WITH
서브쿼리를 변수에 저장하듯이 임시결과를 저장해 단계적으로 처리하면서 전체 데이터 추출과정을 가독성있게 단순화 시킬 수 있다.
사용법
WITH CTE명 AS ( 쿼리 표현식 )
WITH user_order_counts AS (
select user_id, count(order_id) as order_count
from orders
group by user_id
)
select * from user_order_counts
order by order_count DESC
WINDOW 함수
현재 행과 관련이 있는 일련의 테이블 행에 대한 계산을 수행한다. 행 그룹에 대해 하나의 결과를 반환하는 집계 함수와는 다르게 각 행 마다 단일 값을 반환한다. 매 행마다 계산하기 때문에 속도적으로 느릴수 있으나, 계산의 범위가 달라지는 특성을 이용할 때 사용한다.
자주 쓰는 RANK,를 포함해 탐색함수, 번호 지정 함수, 집계 분석 함수(집계 함수 + OVER())등 이있다.
select
id,
first_name,
last_name,
country,
age,
RANK() OVER ( ORDER BY age ) AS rank_number_in_all,
from `thelook_ecommerce.users`
where id between 1 and 20
order by age