SQL Subquery

yeoni·2024년 1월 12일
0

SQL

목록 보기
8/11

1. About Subquery

  • 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 말한다.
  • 메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
    • 서브쿼리는 메인쿼리의 칼럼 사용 가능
    • 메인쿼리는 서브쿼리의 칼럼 사용 불가

Subquery 사용시 주의

  • Subquery 는 괄호로 묶어서 사용
  • 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
  • subquery 에서는 order by 를 사용X
  • JOIN과 효율성을 따지면서 적절히 사용

2. 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 절에 사용하는 서브쿼리
  • 메인쿼리에서는 인라인 뷰에서 조회한 Column만 사용가능하다.
  • 예시) 경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2 WHERE condition) b
WHERE condition;

중첩 서브쿼리 (Nested Subquery: Single Row, Multiple Row, Multiple Column)

  • 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: 서브쿼리 결과 중에 포함 될때(리스트 형태)
  • EXISTS: 서브쿼리 결과에 값이 있으면 반환
  • ANY: 서브쿼리 결과 중에 최소한 하나라도 만족하면 (비교연산자 사용)
  • ALL: 서브쿼리 결과를 모두 만족하면 (비교 연산자 사용)
# IN
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;

# EXISTS
SELECT column_names
FROM table_name
WHERE column_name EXISTS (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;

# ANY
SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;

# ALL
SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name FROM table_name WHERE condition)
ORDER BY column_name;

3) 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_name;

# 강동원과 성별, 소속사가 같은 연예인의 이름, 성별, 소속사를 조회
SELECT name, sex, agency
FROM celeb
WHERE (sex, agency) IN (SELECT sex, agency FROM celeb WHERE name = '강동원');

Reference
1) 제로베이스 강의자료

profile
데이터 사이언스 / just do it

0개의 댓글