SQL Subquery

송영석·2023년 6월 6일
0

Subquery

Subquery 특징

  • 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 의미
  • 메인쿼리가 서브쿼리를 포함하는 종속적인 관계
    - 메인쿼리는 서브쿼리의 column 사용 불가
    • 서브쿼리는 메인쿼리의 column 사용 가능
  • 서브쿼리는 괄호로 묶어서 사용
  • 단일 행 or 복수 행 비교 연산자와 함께 사용 가능
  • 서브쿼리에서는 order by 사용불가

Subquery 종류

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

Scalar Subquery

  • SELECT절에서 사용하는 서브쿼리
  • 결과는 하나의 column이어야 함
SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;

Inline View

  • FROM 절에 사용하는 서브쿼리.
  • 메인쿼리에서는 Inline View에서 조회한 column만 사용가능
SELECT a.column, b.column
FROM table a, (SELECT column1, column2 FROM table2) b
WHERE codition;

Nested Subquery

  • WHERE절에서 사용하는 서브쿼리
[Single Row]
- 하나의 열을 검색하는 서브쿼리
- 서브쿼리가 비교연산자와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 함
SELECT column_names FROM table_name 
WHERE column_name = (SELECT column_name FROM table_name WHERE condition) 
OREDER BY column_name;
![](https://velog.velcdn.com/images/cjaeks6401/post/7e973420-f935-46d5-9b44-eff93cad03a4/image.png)

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

[Multiple Row - IN] 서브쿼리 결과중에 포함
SELECT column_names FROM table_name
WHERE column_name IN (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_names;

[Multiple Row - EXISTS] 서브쿼리 결과에 값이 있으면 반환
SELECT column_names FROM table_name
WHERE EXISTS (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_names;

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

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

Multi Column Subquery

  • 하나 이상의 행을 검색하는 서브쿼리
  • 서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우
    SELECT column_names FROM tablename a
    WHERE (a.column1, a.column2, ...) IN (SELECT b.column1, b.column2, ... FROM tablename b WHERE a.column_name = b.column_name)
    ORDER BY column_names;

실습

자료출처 : 제로베이스 데이터스쿨

profile
매일매일 작성!!

0개의 댓글