본문 바로가기

[SQL] 서브쿼리 쓰는 법

@xuv22025. 7. 16. 12:11

서브쿼리란 쉽게 생각해서 SELECT 문법 안에 SELECT 문법을 한번 더 쓰는 것이다.

SQLD 딸때는 진짜 이거때문에 너무 고생했는데, 쉽게 공부하니 사실 생각보다 크게 별거 없었다.

 

이번에도 롤로 예제를 만들어보자

만약 다음과 같은 요구 사항이 있다.

items 테이블에서, 아이템의 평균 가격보다 비싼 아이템만 출력하고 싶다.

우리는 원래대로라면 두가지 쿼리를 작성해야한다.

// 아이템 평균 가격 구하기
SELECT AVG(item_price) FROM items;

// 위 쿼리의 결과 값이 1000 이라고 가정하자

// 위 데이터를 이용하여 아이템 평균 가격 < 아이템 출력하기
SELECT * FROM items WHERE item_price > 1000;

이 쿼리의 단점은 첫번째 쿼리의 실행결과를 그대로 복붙 하여서 두번째 쿼리를 작성해야한다는 점이다.

서브쿼리는 쉽게 생각해 두 쿼리를 합친다고 생각하면 편하다.

SELECT * FROM items 
WHERE item_price > (SELECT AVG(item_price) FROM items);

이렇게 작성하면 소괄호 안에 데이터를 먼저 처리하고, 이후 출력 쿼리를 실행한다.

 

주의 사항

서브쿼리는 문자나 숫자등의 자료가 들어갈 수 있는 곳에만 사용이 가능하다.

또한 () 소괄호로 반드시 묶어야하고, 여러 행이 출력되는 SELECT 문에는 사용할 수 없다 (ANY 이런게 있긴 한데 일단 생략)


서브쿼리 응용

칼럼명에 사칙연산을 할 수 있었는데, 서브쿼리의 결과로도 사칙연산이 가능하다.

SELECT (SELECT AVG(item_price) FROM items) - item_price AS 평균값과의차이 FROM items;

IN() 안에도 서브쿼리 가능

 

IN() 문법 안에서는 서브쿼리가 하나의 숫자나 문자만 뱉지 않아도 된다. -> 집합을 뱉어도 됨

 

이번엔 실제로 롤을 플레이하는 user 테이블이 하나 있다고 가정하고, 정지를 먹은 유저를 관리하는 blacklist테이블이 또 하나 있다고 가정하자.

그리고 정지 먹은 유저 A,B,C 가 있다고도 가정하자.

 

만약 user 테이블에서 정지 먹은 유저가 누군지 검색하고 싶다면? 다음과 같이 작성하자

SELECT user_name FROM users
WHERE user_name IN (SELECT user_name FROM blacklist);

 

근데 이럴땐 JOIN을 쓰자 ㅋㅋ

xuv2
@xuv2 :: xuvlog

폭싹 늙었수다

목차