본문 바로가기
코딩 공부/web & Java

[SQL] Sub Query

by 현장 2022. 9. 22.

Sub Query

SQL문 내에서 하위에 존재하는 쿼리 ( SQL문 안에 SQL )

 

예시

SELECT 
	*
FROM  
	tb_goods AS g
WHERE
	g.g_price > (
	SELECT 
		AVG(subgs.g_price)
	FROM
		tb_goods AS subgs
	);

 

1. 스칼라 서브쿼리 (Scalar Sub Query)

SELECT문에 있는 서브쿼리( 1행만 반환)

 

예시

SELECT 
	*,
	(
		SELECT
			AVG(subg.g_price)
		FROM 
			tb_goods AS subg
	) AS avg_price
FROM
	tb_goods AS g;

2. 인라인 뷰 (Inline view)

FROM 절에 있는 서브쿼리

 

예시

SELECT 
	*
FROM
	tb_goods AS g
	JOIN
	(
		SELECT
			AVG(subg.g_price) AS check_price
		FROM
			tb_goods AS subg
	) AS avgp
WHERE
	g.g_price > avgp.check_price;

 

3. 서브 쿼리 (Sub Query)

WHERE 절에 있는 서브쿼리 (맨 위 서브 쿼리 예시랑 같음)

 

Inline view와 같이 FROM절에 사용하는 것을 가장 추천하며, Sub Query인 WHERE절까지가 상한선이다. 특정 상황에서만 SELECT문에 서브쿼리를 사용하는 Scalar Sub Query를 사용한다.


단일행 서브 쿼리 (Single Row SubQuery)

리턴값이 1개 이하인 서브쿼리, 단일행 비교연산자와 사용한다. (ex. =, <, <=, >=, >, <>)

 

예시

SELECT
	*
FROM
	tb_member AS m
WHERE
	m.level_num = (
		SELECT
			l.level_num
		FROM
			tb_member_level AS l
		WHERE
			l.level_name = '관리자'
	);

다중행 서브 쿼리 (Multiple Row SubQuery)

리턴값이 여러행, 다중행 비교연산자와 사용한다.

 

종류

연산자 설명
IN 리턴되는 값 중에서 조건에 해당하는 값이 있으면 참
ANY, SOME 서브쿼리에 의해 리턴되는 각각의 값과 조건을 비교하여 하나 이상을 만족하면 참
ALL 값을 서브쿼리에 의해 리턴되는 모든 값과 조건 값을 비교하여 모든 값을 만족해야만 참
EXISTS 메인 쿼리의 비교 조건이 서브쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참

1. IN

SELECT
	m.*
FROM
	tb_member AS m
WHERE
	m.level_num IN (
		SELECT
			l.level_num
		FROM
			tb_member_level AS l
	);

2. ANY, SOME

SELECT
	m.*
FROM
	tb_member AS m
WHERE
	m.level_num > ANY ( /* ANY 또는 SOME */
		SELECT
			l.level_num
		FROM
			tb_member_level AS l
	);
    
 /* 아래와 같다 */
 SELECT
	m.*
FROM
	tb_member AS m
WHERE
	m.level_num > 1
	OR 
	m.level_num > 2
	OR 
	m.level_num > 3;

3. ALL

SELECT
	m.*
FROM
	tb_member AS m
WHERE
	m.level_num > ALL (
		SELECT
			l.level_num
		FROM
			tb_member_level AS l
	);
    
 /* 아래와 같다 */
 SELECT
	m.*
FROM
	tb_member AS m
WHERE
	m.level_num > 1
	AND 
	m.level_num > 2
	AND 
	m.level_num > 3;

4. EXISTS

SELECT
	m.*
FROM
	tb_member AS m
WHERE
	EXISTS (
		SELECT 
			l.level_num
		FROM 
			tb_member_level AS l
		WHERE
			l.level_num = m.level_num
			AND
			l.level_num = 1
	);

다중컬럼 서브 쿼리 (Multiple Column SubQuery)

비교칼럼 갯수가 같아야 함

SELECT
    *
FROM
    tb_member AS m1
WHERE
    (m1.m_id, m1.level_num) IN (
    SELECT
        m2.m_id,
        MIN(m2.level_num)
    FROM
    	tb_member AS m2 
    );

 

'코딩 공부 > web & Java' 카테고리의 다른 글

[SQL] View  (0) 2022.09.23
[SQL] Union  (0) 2022.09.22
[JSP, JAVA] JDBC  (0) 2022.09.21
[JAVA] EAR, WAR, JAR  (0) 2022.09.20
[JSP] Session  (0) 2022.09.20