[SQL] Subquery

곽민호·2024년 7월 9일

제로베이스 DS

목록 보기
5/5

서브쿼리까지 안 보고 할 줄 알면 sql 문법은 어느정도 다룰 수 있게 될거같다.
서브쿼리는 개념이 조금 말장난 같은 느낌이라 한 번에 이해되지 않았음..

  • 서브쿼리는 메인쿼리 칼럼 사용 가능
  • 메인은 서브꺼 못 씀 (파이썬에서 차일드클래스가 상속해서 가져오는거랑 같은 개념으로 생각하면 될듯?)

서브쿼리 주의 사항

  • 서브쿼리는 괄호로 묶어서 쓰기만 하면됨.
  • 서브쿼리에서는 order by를 못 쓴다.

서브쿼리 종류

  • scalar 서브쿼리 : select절
  • inline view : from절
  • nested 서브쿼리 : where절

원하는 값을 추출할 때, 구조적으로 추출을 못 하는 경우에 서브쿼리를 사용해주는 것 같다.
언제 사용해야 되는지, 어떻게 사용해야 되는지를 구분해서 사용하는데 익숙해져야겠다.


Scalar Subquery

  • 스칼라 서브쿼리 조건 2가지
  1. select 절에서 사용해야 한다.
  2. 결과는 하나의 칼럼이어야 한다.
select col1, 
	(select col2 from table2 where condition)
from table1
where condition;

스칼라 서브쿼리로 추출한 값은 위와 같이 하나의 칼럼으로 나온다.


Inline View

  • 인라인뷰 조건 2가지
  1. from 절에서 사용해야 한다.
  2. 메인쿼리에서는 인라인뷰에서 조회한 컬럼만 사용가능. (이거도 말장난 같은게.. 원래 메인은 서브 칼럼 사용 못함. 그런데 조회는 가능하다는건가 싶다.)
select a.col, b.col
from table1 a, 
     (select col1, col2 from table2) b
where condition;

메인쿼리는 인라인뷰에서 조회한 칼럼 case_number를 사용한건가 싶다. 아닌가? 이게 헷갈림(사용 못한다 했다가 조회한건 사용한다니까..)

  • 그리고 테이블을 다루는 from절에서 사용하는거라 결과값도 테이블 형태로 나온다.
    (스칼라는 1개 칼럼 값)

Nested Subquery

중첩 서브쿼리는 where절에서 사용하는데 3가지를 알아야 하고, 멀티플 로우에서 사용하는 3가지를 또 알아둬야한다.

  • 싱글 로우 : 말 그대로 1개 행
  • 멀티플 로우 : 말 그대로 여러개 행
  • 멀티 컬럼 : 여러개 열

검색 결과를 <1개냐 여러개냐> and <행이냐 열이냐> 구분해서 가져오게 된다.


Single Row

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

select col_name
from table_name
where col_name = (select col_name
				  from table_name
                  where condition)
order by col_name;


에러가 나는 이유는 2개 이상이기 때문이다.
우선 메인쿼리랑 서브쿼리를 나눠서 출력해보고 비교해보자.

➡️ 메인쿼리

➡️ 서브쿼리

➡️ celeb 테이블과 snl_show 테이블 join

➡️ 서브쿼리에 id=1인 값만 호출 (결과값 1개)

📍where 절에서 사용할 수 있는 싱글 로우 서브쿼리는 메인쿼리가 서브쿼리의 모든 값과 일치하는 값을 불러온다.


Multiple Row

  • in : 서브쿼리 결과 중에 포함 될때
  • exists: 서브쿼리 결과에 값이 있으면 반환
  • any : 서브쿼리 결과 중 최소한 하나라도 만족하면
  • all : 서브쿼리 결과를 모두 만족하면

➡️ 구조

select col1
from table1
where col1 멀티플 로우(in,exists,any,all)
				(select col2
                 from table2
                 where condition)
order by col_name;

경우에 따라 join이 더 효율적일 수 있다.
<멀티플 로우>는 <싱글 로우>와 달리 여러 행의 값을 반환할 수 있다.
any와 all은 교집합, 합집합 대충 이런식으로 생각하면 될듯?

- exists는 col_name 없이 바로 쓴다.

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

Multi column

  • 싱글로우나 멀티플로우는 서브쿼리에 메인쿼리 컬럼을 같이 사용하지 않았음.
  • 멀티 컬럼에서는 서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우 사용.

➡️ 구조

select col
from table a
where (a.col1, a.col2, ...) 
   in (select b.col1, b.col2, ...
       from table b
       where a.col = b.col)
order by col;

각각의 서브쿼리를 언제 사용할지는 많이 다뤄봐야 개념이 잡힐듯하다. 이렇게만 봐가지고는 어떻게 쓰는지는 알겠는데 언제 쓰는지는 모르겠다.
그래도 기본적으로 SQL을 다룰 수 있게 되었으니 이것저것 찾아보고 실제로 적용하면서 익숙해져야겠다.


  • 이 글은 제로베이스 강의 자료 일부를 발췌하여 작성했습니다.

0개의 댓글