[SQL] 걷기반 7~last

양승우·2024년 9월 9일

코드카타

목록 보기
1/58

상위 N개 출력

mysql에서는 LIMIT 함수를 통해 상위 n개 조회가 가능
oracle에서는 이것이 불가능 ==> rownum을 통해 상위 n개를 조회

이 때 주의할 점이, sql은 아래의 순서로 진행된다는 점임
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

그렇기에 rownum을 그냥 사용하면 데이터의 정렬과 순서가 꼬여 원하는 데이터를 select하지 못할 수 있음
==> 서브쿼리를 사용하여 미리 데이터의 정렬을 끝내고, 그 후 rownum을 통해 상위 n개를 조회

select ID, user_name, satisfaction_score, feedback_date
from (
	select ID, user_name, satisfaction_score, feedback_date, row_number() over (partition by user_name order by feedback_date desc) rownumber
	from lol_feedbacks
    )
where rownumber = 1
order by ID;

(각 유저별로 최신 피드백 1건만 조회하는 경우)

날짜 데이터에서 년월일 추출하기

extract 함수를 사용하면 date 데이터에서 년/월/일을 쉽게 추출할 수 있음
extract (year from birth_date)

select count(*) as aaa
from patients
where extract (year from birth_date) between 1980 and 1989;

(생일이 1980년대인 환자를 조회하는 경우)

outer join

단순히 where a.id = b.id를 사용하면 이건 inner join으로 교집합을 조회
경우에 따라 한 쪽 그룹의 칼럼 전부를 함께 조회할 필요가 있음
이럴 때 outer join을 사용

from a left outer join b
on (join 조건)
where (조회 조건)

이 때 left/right는 '모든 칼럼을 조회할 그룹' 방향으로 적어주면 됨
위의 예시에서는 a의 모든 데이터 & a와 b의 교집합을 조회하는 경우

직원이 없는 부서 조회하기

outer join을 활용하면 직원이 없는 부서, 주문되지 않은 상품 등의 경우를 조회할 수 있음

select d.name dep_name
from employees e right outer join departments d
on e.department_id = d.id
where e.id is null;

예를 들어 위의 경우는 departments에 대한 outer join을 수행하고 있는데,
그렇기에 직원이 없는 부서는 departments 칼럼에만 데이터가 있고, employee 칼럼은 null값을 받게 됨

그 상황에서 where문을 통해 employee의 id가 null인 칼럼만 조회한다면 이것이 즉 직원이 없는 부서만 조회하는 상황

profile
어제보다 오늘 더

0개의 댓글