-
[SQL] 서브쿼리(Subquery)가 너무 어려워서 작성한 글내일배움캠프/SQL 2024. 7. 1. 21:07
할 게 없으면 미리 코드카타를 풀어보라는 튜터님의 말씀을 듣고 열심히 코드카타를 풀고 있습니다.
대부분 무난했지만 서브쿼리가 자꾸 저를 괴롭힙니다...
그래서 온라인 세션과 강의를 듣고 간단하게 요약해보았습니다...
서브쿼리란?
서브쿼리는 중첩된 쿼리로, 하나의 SQL 문장 안에 다른 SQL 문장이 포함된 형태를 말합니다.
목적
보통 다른 쿼리의 조건이나 결과를 기반으로 데이터를 조회하거나 계산할 때 사용합니다.
쿼리의 결과값을 가지고 추가 연산도 할 수 있습니다.
장점
여러 번 실행해야하는 쿼리문을 1번만 수행하게 합니다.
단계별로 복잡한 식을 풀어서 간단하게 표현할 수 있습니다.
방법
활용해야할 데이터를 서브쿼리로 만들어주고
이 데이터를 본 쿼리에 넘겨줍니다.
간단하게 데이터를 1차적으로 필터링해준다고 생각하면 됩니다.
종류
1. 중첩 서브쿼리
Where절에서 사용하여 마치 조건처럼 작용하는 서브쿼리입니다.
제가 문제를 풀면서 경험한 바로는...
최댓값 구하기, 가장 비싼 상품 찾기와 같은 문제 유형에
많이 사용된다는 것입니다..
2. 스칼라 서브쿼리
하나의 컬럼처럼 사용하는 서브쿼리입니다.
필요한 칼럼을 다른 테이블에서 가져오기 위해 사용합니다.
하나의 칼럼처럼 취급하기 때문에 select절에서 사용합니다.
3. 인라인 뷰
서브쿼리를 하나의 테이블처럼 취급해줍니다.
하나의 테이블처럼 취급해주므로 From절에서 사용합니다.
주의 사항으로
인라인 뷰는 다른 서브쿼리문과는 다르게
반드시 alias를 지정해줘야 한다는 것이 있습니다.
인라인 뷰 예제
select x.나이, x.직업, y.결제금액
from( select 나이, 직업, 이름
from basic.theglory
where 나이>=33
)as x, theglory2 y
WHERE x.이름 = y.이름;강사님이 추천해준 서브쿼리 작성 프로세스
쿼리를 작성하기 전에 흐름 적어보기
⬇️
구문으로 만들기
⬇️
전체 구조로 합치기
마지막으로 실제 서브쿼리 문제에서 어떻게 사용되는지 확인해보겠습니다!
1번 문제 임대 서비스에서 공간을 둘 이상 등록한 사람을 '헤비 유저'라고 합니다.
따라서 host_id를 count했을 때 2 이상이 나오는지 확인하면 됩니다!
먼저 '헤비 유저'를 찾아줍시다.
select host_id from places group by host_id having count(*) > 1
이제 이 '헤비 유저' 정보가 담긴 쿼리문을 통해
'헤비 유저'가 등록한 공간의 정보를 조회해봅시다.
공간의 정보를 조회할건데..
'헤비 유저'의 공간을 조회하라는 조건을 줘야하므로
중첩 서브쿼리를 사용해야합니다.
1번 문제 정답 오우야...
너무 깔끔하게 잘 나왔습니다.
한 문제만 더 풀어보도록 하겠습니다.
2번 문제 요약하자면 하나의 장바구니에 우유와 요거트가 모두 담겨있는지 확인하는 문제입니다.
우유와 요거트를 한 번에 구매하지 않고 나눠서 구매했기에
where name like '%우유%' and name like '%요거트%'를 사용하기 힘든 문제였습니다.
그러므로 먼저 우유나 요거트가 담긴 장바구니를 찾아주고
그 장바구니에서 나머지 상품이 담긴 장바구니를 찾아줘야 합니다.
select cart_id
from cart_products
group by cart_id, name
having name = 'Yogurt'먼저 요거트가 담긴 장바구니를 찾아주었습니다.
이 테이블에서 이제 우유가 담긴 장바구니를 찾으라는 조건을 주겠습니다.
2번 정답 즉, 요거트가 담긴 장바구니 서브쿼리를 하나의 테이블처럼 취급해
인라인 뷰로 사용해줬고,
우유가 담긴 장바구니 서브쿼리를 하나의 조건처럼 취급해
중첩 서브쿼리로 사용했습니다.
이처럼 서브쿼리를 응용해줄 수 있답니다.
앞으로 서브쿼리는 틀리지 않고 잘 풀 수 있을 것 같습니다!
^^
'내일배움캠프 > SQL' 카테고리의 다른 글
[SQL] Left Join (2) (0) 2024.07.05 [SQL] Left Join (1) (0) 2024.07.04 [SQL] 식품분류별 가장 비싼 식품의 정보 조회하기 (0) 2024.06.27 [DBeaver 실습] SQL Lv3. 이용자의 포인트 조회하기 (0) 2024.06.12 [DBeaver 실습] SQL Lv2. 날짜별 획득포인트 조회하기 (1) 2024.06.11