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 |