[제로베이스]SQL_16. SQL Subquery

새봄·2024년 1월 25일
post-thumbnail

1. SQL Subquery

1) About Subquery

하나의 SQL문 안에 포함되어 있는 다른 SQL문을 말한다.

메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.

  • 서브쿼리는 메인쿼리의 칼럼 사용 가능
  • 메인쿼리는 서브쿼리의 칼럼 사용 불가

2) Subquery 사용시 주의

  • Subquery는 괄호로 묶어서 사용
  • 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
  • subquery에서는 order by를 사용 X

3) Subquery 종류

  • 스카라 서브쿼리(Scalar Subquery) : SELECT 절에 사용
  • 인라인 뷰(Inline View) : FROM 절에 사용
  • 중첩 서브쿼리(Nested Subquery) : WHERE 절에 사용

4) 스칼라 서브쿼리(Scalar Subquery)

SELECT 절에서 사용하는 서브쿼리

결과는 하나의 column 이어야 한다.

SELECT column1m (SELECT column2 FROM table2 WHERE condition)
FROM table
WHERE conditionb;

5) 인라인 뷰(Inline View)

FROM 절에서 사용하는 서브쿼리

메인쿼리에서는 인라인 뷰에서 조회한 column만 사용가능하다.

SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2) b
WHERE condition;

6) 중첩 서브쿼리(Nested Subquery)

WHERE 절에서 사용하는 서브쿼리

  • Single Row : 하나의 열을 검색하는 서브쿼리
  • Multiple Row : 하나 이상의 열을 검색하는 서브쿼리
  • Multiple Column : 하나 이상의 행을 검색하는 서브쿼리

(1) Single Row Subquery

  • 서브쿼리가 비교연산자(=, >, >=, <, <=, <>, !=)와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야한다. (두 개 이상인 경우 에러)
SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;

(2) Multiple Row Subquery - IN

  • 서브쿼리 결과 중에 포함 될 때
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name FROM table_name WHERE condition)
ORDER BY column names;

(3) Multiple Row Subquery - EXITS

  • 서브쿼리 결과에 값이 있으면 반환
SELECT column_names
FROM table_name
WHERE EXITS (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_names;

(4) Multiple Row Subquery - ANY

  • 서브쿼리 결과 중에 최소한 하나라도 만족하면 (비교연산자 사용)
SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_names;

(5) Multiple Row Subquery - ALL

  • 서브쿼리 결과를 모두 만족하면 (비교연산자 사용)
SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_names;

(6) Multiple Column Subquery - 연관 서브쿼리

  • 서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우
SELECT column_names
FROM table_name a
WHERE (a.column1, a. column2, ...) IN (SELECT b.column1, b.column2, .. FROM table_name b WHERE a.column_name = b.column_name)
ORDER BY column_names;

0개의 댓글