컴퓨터 과학/[프로그래머스] SQL DB Essentials

Chapter 09 DML : 서브쿼리(Subquery)

계란💕 2022. 3. 20. 22:29

  Def) 서브 쿼리: SQL문 (주로 SELECT문) 안에 포함되는 SELECT문

  - 질의문 / 갱신문 위치에 사용가능하다. 

 

 

1. 주의 사항

  1) 컬럼참조 시 주의 사항: 메인쿼리에서 볼 때, 서브쿼리는 블랙 박스

  - inline view(FROM절 서브쿼리)의 경우, 메인쿼리는 inline view의 컬럼을 자유롭게 참조한다.

  2) ORDER BY절 사용 제한

  - WHERE절 서브쿼리에서는 ORDER BY절을 사용하지 못한다.

  - inline view의 경우, 사용 가능.

 

  - WHERE절 서브쿼리

    1) 단일값 서브쿼리 (scalar sunquery)

    2) 다중값 서브쿼리 (column subquery): ANY | SOME | ALL

    3) 다중행 서브쿼리 (table subquery): 여러 개의 투플이 나온다.

      Ex) 다중행 서브쿼리 

      - [NOT] IN: 서브쿼리 결과에 존재하는 투플과 동일한 투플의 존재 여부를 확인 ( "=ANY", "=SOME" 대체가능)

      - [NOT] EXISTS: 서브쿼리 결과를 만족하는 투플의 존재 여부 확인, 조건을 만족하는 투플을 최초 1개만 찾는다.

        -> EXISTS는 항상 연관 서브쿼리

 

  - 동작하는 방식에 따른 분류

    1) 비연관 서브쿼리 (uncorrelated subquery): 메인쿼리와 서브쿼리의 테이블이 다르다.

    2) 연관 서브쿼리 (correlated subquery): 서브쿼리에 메인 쿼리 테이블의 컬럼이 사용된다. 메인쿼리 테이블의 부분 집합이다.

 

    Ex) 비연관 다중값 서브쿼리: SELECT문이 단일값의 집합일 경우, 반드시 그 앞에 ANY / SOME/ ALL 중 하나를 써야한다.

 

    Ex) 비연관 다중행 서브쿼리

 

    Ex) 연관 다중값 서브쿼리: 메인쿼리 테이블 각각의 투플마다 "조인 조건으로 선택(filtering)된 서브쿼리 투플 집합"에 대해 서브쿼리를 실행한다. 

 

  Note) 교집합, 차집합(AND / AND NOT)은 연산 서브쿼리로 나타낼 수 있다.

 

 

2. 연관 서브쿼리와 조인의 차이

  - 조인은 두 테이블의 Cartesian product의 부분 집합을 리턴한다.

    -> 두 테이블이 대등한 관계이므로 select절에서 컬럼을 자유롭게 사용 가능

  - 연관 서브 쿼리를 포함한 메인쿼리는 메이쿼리 테이블의 부분 집합을 리턴한다.

 

 

3. WHERE절 이외의 서브쿼리

 

  1) Scalar Subquery (SELECT절 서브쿼리) : 새로운 컬럼을 생성하기위해 사용한다.

  2) Inline View (FROM절 서브쿼리) : 임시 테이블을 생성한다.

  - 다중행 서브쿼리

  - WITH절과 기능이 동일하다.

  - FROM절 안에 ORDER BY절을 사용가능하다.

  - MySQL에서는 FROM절 서브쿼리에 반드시 Alias를 사용해야한다.

  3) HAVING 절 서브쿼리

 

 

4.  질의문(SELECT문) 서브쿼리의 용도

 

  1) 테이블 필터로 사용 (WHERE절 서브쿼리)

  2) 새로운 컬럼을 생성 (SELECT절 서브쿼리)

  3) 임시테이블을 생성 (FROM절 서브쿼리)

 

 

 

 

 

 

 

 

 

 

 

본 게시글은 프로그래머스의 "학교 밖에서 듣는 전공 필수SQL/DB Essentials" 강의 내용을 토대로 업로드 했습니다.

(코드리뷰 개선 과정)

 

 

[스터디/2기] 학교 밖에서 듣는 전공필수 SQL/DB Essentials

⏰마지막 할인 중 2기 일정이 맞지 않다면 오픈 알림 신청하고 최저가에 수강하세요! 오픈 알림 신청 개발자에게 데이터베이스를 이해하는 능력은 필수! 데이터베이스의 기본 개념부터 ERD를 읽

programmers.co.kr

https://programmers.co.kr/learn/courses/13484