TIL_[SQL] 합집합, 교집합, 차집합, RANK 함수

김희정·2023년 12월 5일

TIL

목록 보기
6/57
post-thumbnail

합집합

select 컬럼이름
from 테이블 a
UNION
select 컬럼이름
from 테이블 b

교집합

select 컬럼이름
from 테이블 a AS a
inner join 테이블 b AS b 
on a.컬럼1 이름=b.컬럼1 AND ... a.컬럼n 이름=b.컬럼n 이름

차집합

select 컬럼이름
from 테이블 a AS A
left join 테이블 b AS b
on a.컬럼1 이름=b.컬럼1 이름 AND ... a.컬럼n 이름=b.컬럼n 이름
where b.컬럼이름 IS NULL

코테문제에서 차집합 문제가 나왔다.

join 해야하는건 알겠는데 차집합을 어떻게 표현할지 고민하다 left join으로 합치고 b값이 널인걸 거르면 된다는걸 깨달았다.
스스로 풀었는데 정답이 나와서 매우 기분 좋았다 🥳

오랜 기간 보호한 동물

Q. 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 
보호 시작일을 조회하는 SQL문 작성하시오.
결과는 보호 시작일 순으로 조회
(정답)
SELECT a.name "NAME", a.datetime "DATETIME"
from animal_ins a left join animal_outs b
on a.animal_id=b.animal_id
where b.datetime is null
order by datetime
limit 3

윈도우 함수(Window Function)

  • 각 행의 관계를 정의하기 위한 함수로, 그룹 내 연산이 용이함
  • 순위 관련 함수
    - RANK, DENSE_RANK, ROW_NUMBER
  • 집계 관련 함수
    - SUM, MAX, MIN, AVG, COUNT
  • 행 순서 관련 함수(SQL server 지원 X)
    - FIRST_VALUE, LAST_VALUE, LAG, LEAD
  • Window Function 기본 구조
window_function(argument) over (partition by 그룹 기준 컬럼 order by 정렬 기준)

- window_function : 기능 명 사용 (sum, avg 등)
- argument : 함수에 따라 작성하거나 생략함
- partition by : 그룹을 나누기 위한 기준. group by절과 유사
- order by : window function 을 적용할 때 정렬 할 컬럼 기준

Rank 함수 적용하기

Q. 음식 타입별로 주문 건수가 가장 많은 상점 3개씩 조회하기
select cuisine_type,
       restaurant_name,
       order_count,
       rn "순위"
from
(
select cuisine_type,
       restaurant_name,
       rank() over (partition by cuisine_type order by order_count desc) rn,
       order_count
from
(
select cuisine_type, restaurant_name, count(1) order_count
from food_orders
group by 1, 2
) a
) b
where rn<=3
order by 1, 4



RANK 특징 및 종류

  • 특징
    - 항상 order by와 함께 사용
    - SELECT 절에 사용
    - 정렬된 순서에 순위를 붙인 새로운 컬럼을 보여줌 (실제 데이터에 영향 X)

  • 종류
    - RANK : 동일한 값에 동일한 순위 부여, 그 다음 순위 건너뜀
    철수 95점 (1등)
    유리 90점 (2등)
    맹구 90점 (2등)
    짱구 80점 (4등)


    - DENSE_RANK : 동일한 값에 동일한 순위 부여, 순위 안건너뜀
    철수 95점 (1등)
    유리 90점 (2등)
    맹구 90점 (2등)
    짱구 80점 (3등)


    - ROW_NUMBER : 동일한 값이라도 고유한 순위
    철수 95점 (1등)
    유리 90점 (2등)
    맹구 90점 (3등)
    짱구 80점 (4등)
profile
데이터 애널리스트가 되고 싶은

0개의 댓글