Sub Query

Pasted image 20241114092549.png

특징

Tip

  • 하나의 쿼리 내 포함된 또 하나의 쿼리를 의미한다.
  • 서브 쿼리는 반드시 괄호 안에 있어야 합니다.
  • SELECT, FROM, HAVING, ORDER BY 절에 사용 가능합니다.
  • INSERT, UPDATE, DELETE 문에도 사용 가능합니다.
  • 서브 쿼리에는 ; 세미콜론을 붙이지 않아도 됩니다.

SELECT Sub Query

문법

SELECT [컬럼 이름],
	(
		SELECT [컬럼 이름]
		FROM [테이블 이름]
		WHERE 조건식
	)
FROM [테이블 이름]
WHERE 조건식;

예제

Pasted image 20241114094019.png

SELECT number, name
	( SELECT height FROM ability WHERE number=25) AS height
FROM mypokemon
WHERE name='pikachu'
SELECT 절의 서브 쿼리는 반드시 결과 값이 하나의 값

FROM 절의 서브 쿼리

예제

SELECT number, height_rank
FROM 
	(
		SELECT number, rank(), OVER(ORDER BY height DESC) AS height_rank
	)
WHERE height_rank=3;

Pasted image 20241114103601.png

WHERE 절의 서브 쿼리

Tip

  • 중첩 서브쿼리 라고도 합니다.
  • WHERE 절의 서브 쿼리는 반드시 결과 값이 하나의 컬럼 이어야 합니다.(EXISTS)
    • 하나의 컬럼에는 여러 개의 값이 존재할 수 있습니다.
  • 연산자와 함께 사용합니다.
    • 보통 WHERE [컬럼 이름][연산자][서브쿼리] 형식으로 사용합니다.

문법

SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE [컬럼 이름][연산자] (
	SELECT [컬럼 이름]
	FROM [테이블 이름]
	WHERE 조건식
)
연산자 활용 의미
= A = [서브 쿼리] A와 [서브쿼리]의 결과 값이 같다
!= A != [서브 쿼리] A와 [서브쿼리]의 결과 값이 같지 않다
> A > [서브 쿼리] A와 [서브쿼리]의 결과 값보다 크다
>= A >= [서브 쿼리] A와 [서브쿼리]의 결과 값 보다 크거나 작다
< A < [서브 쿼리] A와 [서브쿼리]의 결과 값 보다 작다
<= A <= [서브 쿼리] A와 [서브쿼리]의 결과 값보다 작거나 같다
비교 연산자만 사용 시, WHERE절의 서브 쿼리는 반드시 결과 값이 하나의 값이어야 한다.

주요 연산자

Pasted image 20241114110849.png

Note

  • 주요 연산자 사용 시, WHERE절의 서브 쿼리는 반드시 결과값이 하나의 컬럼이어야 합니다.
  • 단, EXISTS 는 단독으로 사용하며, 결과 값이 여러 컬럼이어도 됩니다.

예제1

SELECT number
FROM ability
WHERE height < ( SELECT AVG(height) FROM ability);

Pasted image 20241115143144.png

결과

! 200

예제2

SELECT number
FROM ability
WHERE attack < ALL(SELECT attack FROM ability WHERE type='electric');

Pasted image 20241115143504.png

ALL

  • < 작다 와 사용 : [서브 쿼리] 최솟값보다 작은 지 확인하는 연산자
  • > 크다 와 사용 : [서브 쿼리] 최댓값보다 큰지 확인하는 연산자

예제3

SELECT number
FROM ability
WHERE defense > ANY(SELECT attack FROM ability WHERE type='electric');

Pasted image 20241115144656.png

ANY

  • < 와 사용 : [서브 쿼리]의 최댓값보다 작은 지 확인하는 연산자
  • >와 사용 : [서브 쿼리]의 최솟값보다 큰 지 확인하는 연산자

예제4

SELECT number
FROM ability
WHERE EXISTS(SELECT * FROM ability WHERE type='bug');

#SQL