SQL Subquery

정한별·2024년 6월 15일
0

About Subquery

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

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

Subquery 종류

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

❗Subquery 사용시 주의

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

스칼라 서브쿼리 (Scalar Subquery)

SELECT 절에서 사용하는 서브쿼리.
결과는 하나의 Column 이어야 한다.

🗒️ 예제

서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회

    -> select distinct case_number, (select avg(case_number)
    -> from crime_status where crime_type like '강도' and status_type like '검거') avg
    -> from crime_status
    -> where police_station like '은평' and crime_type like '강도' and
    -> status_type like '검거';

인라인 뷰 (Inline View)

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

🗒️ 예제

경찰서 별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회

    -> select c.police_station, c.crime_type, c.case_number
    -> from crime_status c, (select police_station, max(case_number) count from crime_status where status_type like '발생' group by police_station) m
    -> where c.police_station =m.police_station and c.case_number =m.count;
    ```
    ![](https://velog.velcdn.com/images/quf277/post/1e2fc524-665e-48b8-842a-1b8c1532e611/image.png)

중첩 서브쿼리 (Nested Subquery)

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

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

Single Row Subquery

  • 하나의 행을 검색하는 서브쿼리
  • 서브쿼리가 비교연산자( =, >, >=, <, <=, <>, !=)와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 한다. (두개 이상인 경우 에러)

🗒️ 예제

select name from celeb where name = (select host from snl_show where id =1);

Multiple Row - IN

서브쿼리 결과 중에 포함 될때 하나 이상의 행을 검색하는 서브쿼리

🗒️ 예제

SNL에 출연한 영화배우를 조회

 select host from snl_show where host in (select name from celeb where job_title like '%영화배우%')

Multiple Row - EXISTS

  • 하나 이상의 열을 검색하는 서브쿼리
  • 서브쿼리 결과에 값이 있으면 반환

🗒️ 예제

범죄 검거 혹은 발생 건수가 2000건 보다 큰 경찰서 조회

-> select name from police_station p
-> where exits (select police_station from crime_status c
-> where p.name = c.reference and case_number > 2000);

Multiple Row - ANY

서브쿼리 결과 중에 최소한 하나라도 만족하면 (비교연산자 사용)

🗒️ 예제

SNL 에 출연한 적이 있는 연예인 이름 조회

    -> select name
    -> from celeb
    -> where name =any (select host from snl_show);
    ```
 ![](https://velog.velcdn.com/images/quf277/post/0f940236-80fd-4c94-8de9-6b0d09f42b4b/image.png)

Multiple Row - ALL

서브쿼리 결과를 모두 만족하면 (비교 연산자 사용)

🗒️ 예제

    -> select name
    -> from celeb
    -> where name =all(select host from snl_show where id =1);
    ```
![](https://velog.velcdn.com/images/quf277/post/21948b42-3050-4aad-b05c-5af27190b765/image.png)

Multi Column Subquery - 연관 서브쿼리

서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우.

🗒️ 예제

    -> select name, sex, agency
    -> from celeb
    -> where (sex,agency) in (select sex, agency from celeb where name ='강동원');

0개의 댓글

관련 채용 정보