[DB] MySQL - 서브쿼리

aseol·2023년 8월 9일
0

MySQL

목록 보기
12/18
post-thumbnail

서브쿼리

쿼리 안에 들어가는 또 다른 쿼리로 주 질의(main query)와 구분되는 부속 질의(sub query)이다.
➕ JOIN과 비교하였을 때, JOIN은 테이블을 합쳐서 조회하는 반면 서브쿼리는 필요한 데이터만을 조회하기 때문에 더 효율적일 수 있다.

작성 방법

  • 괄호 안에 사용한다.
  • 서브쿼리에는 세미콜론을 붙이지 않는다.

종류

🔹 스칼라 서브쿼리 ⏩ SELECT절에서 사용

scalar : 한 방향의 ↔ vector

단일값[단일 열, 단일 행]을 반환
➡ 결괏값이 다중 행ㆍ다중 열인 경우, 에러가 발생
➡ 결과가 없다면 NULL
반복적인 SELECT로 인해 성능이 저하될 수 있다.

❔ 고객별 총 구매금액과 고객의 이름 조회

SELECT
    (SELECT	
     FROM  	
   	 WHERE )
FROM

🔹 인라인 뷰 ⏩ FROM절에서 사용

서브쿼리 조회 결과를 뷰 형태(기존 테이블로부터 일시적으로 만들어진 가상의 테이블)로 반환하기 때문에, FROM절에서 사용하는서브 쿼리의 결과를 하나의 테이블처럼 사용한다고 생각하면 된다.
스칼라 서브쿼리와 달리 다중 행 다중 열을 반환할 수 있다.

❔ 회원 레벨 2인 회원들 중 판매하는 상품의 가격이 60만 원 이상인 판매자의 id, 이름, 상품명, 각 상품의 가격을 조회하고 내림차순으로 정렬하기 🔽

❔ city table에서 인구수가 2번째로 많은 도시의 id, name을 조회 / 순위 조회시 내장함수 rank() 사용하기 🔽

SELECT 
	별명.조회할 컬럼 
FROM
	(SELECT
    FROM
    WHERE) AS '별명'
     

🔹 중첩 질의 ⏩ WHERE절에서 사용

  • 주로 어떤 데이터의 존재 유무를 파악하기 위해 사용
  • 작성 방법 🔽
    SELECT
    FROM
    WHERE 연산자 서브쿼리

💡 단일행 서브쿼리 : 실행 결과가 1건 이하인 서브쿼리
➡ 일반 비교 연산자 ( =, <, > 등 ) 사용 가능

결괏값이 1개인 경우이기 때문에 연산자 '>' 사용이 가능한 모습

💡 다중행 서브쿼리 : 실행 결과로 다수의 ROW를 반환하는 서브쿼리
➡ 일반 비교 연산자 ( =, <, > 등 ) 사용 불가

➕ 다중행 서브쿼리의 추가 연산자

IN / NOT IN

: IN 연산자에 입력된 값 중에서 하나라도 일치하는 것이 있으면/없으면 리스트에 조회된다.

EXISTS / NOT EXISTS

: 서브쿼리 결과 중에서 만족하는 값이 하나라도 존재하면/ 존재하지 않으면 참

ALL

: 서브쿼리의 결과가 모두 참이면 참 ( = AND 조건 )

최종적으로 4보다 커야 하기 때문에 만족하는 데이터가 없다. 

ANY

: 서브쿼리의 결과 중에서 하나라도 참이면 참 ( = OR 조건 )

OR 조건이므로 최종적으로 2보다 큰 번호를 조회하는 것이기 때문에, 만족하는 데이터로는 3과 4가 나오게 된다 

❔ city table에서 국가코드가 USA인 도시 중, ULSAN 의 인구수보다 하나라도 큰 도시의 이름과 인구수를 조회

ULSAN의 인구수 확인해 보기 

ULSAN의 인구수보다 큰 결괏값들로 잘 나왔는지 확인해 본다 

이미지 출처
https://dev.to/sharanjeet710/sql-sub-queries-3epc 

0개의 댓글