본문 바로가기

SQL

[MYSQL] Subquery

Subquery 란?

  • SELECT문 안에 다시 SELECT문이 기술된 쿼리
  • 상위 SELECT문 안에 하위 SELECT문이 포함된 형태라 중첩된(nested) 쿼리라고도 부름
  • 다른 테이블에서 조회한 데이터 값(서브쿼리)을 메인 쿼리에서 조건으로 사용한다쿼리문 구조

Subquery의 종류

1. 중첩 서브쿼리(Nested Subquery) : WHERE절에 나타나는 서브 쿼리

  • 단일 행 서브 쿼리(Single Row Subquery) : 하나의 행을 검ㅅ색하는 서브 질의
  • 다중 행 서브 쿼리(Multiple Row Subquery) : 하나 이상의 행을 검색하는 서브 질의
  • 다중 열 서브 쿼리(Multiple Column Subquery) : 하나 이상의 열을 검색하는 서브 질의 

2. 인라인 뷰(Inline View): FROM절에 나타나는 서브쿼리

3. 스칼라 서브 쿼리(Scalar Subquery): SELECT절에 나타나는 서브쿼리

 

Subquery의 규칙

  • 서브 쿼리는 괄호로 묶어서 사용
  • 단일 행 연산자 또는 다중 행 연산자로 서브쿼리 연결
  • 서브쿼리를 실행한 다음에 메인 쿼리가 실행된다.
  • 여러 서브 쿼리를 중첩해서 사용 가능

 

<단일 행 서브쿼리>

  • 서브쿼리 select 절에서 단일 행 결과를 메인 쿼리에 전달
  • where에 사용되는 열의 개수와 데이터 타입 일치 필요
  • 단일 행 연산자 사용 (위의 표 참고)

 

<다중 행 서브쿼리>

  • 서브쿼리 select절에서 다중 행 결과를 메인쿼리에 전달
  • 단일 행 연산자는 사용할 수 없고, 다중 행 연산자만 사용 
다중 행 연산자 설명 
IN 서브쿼리 결과 중 같은 값이 포함되어 있으면 TRUE 
NOT IN 서브쿼리 결과 중 같은 값이 포함되어 있지 않았으면 TRUE 
EXISTS 서브쿼리 결과가 존재하면 TRUE 
ANY(SOME) 서브쿼리 결과값이 메인쿼리의 WHERE 조건에 하나라도 만족하면 출력
ALL 서브쿼리 결과값 모두가 메인쿼리의 WHERE 조건에 만족해야 출력

 

 

 

 

<실습>

 

💫 IN, NOT IN 예제

( DBeaver - database - logi)

rel_unit_cnt가 1500을 초과하는 데이터를 서브쿼리로 조회

 

 

💫 EXISTS 연산자 예제

: WHERE 다음에 바로 EXISTS (서브쿼리) 구조로 사용

 

1. 서브쿼리 결과값이 존재함


2. 서브쿼리 결과값이 존재하지 않음

 

 

 

💫 ANY  연산자 예제

any 연산자가 없다면 오류가 발생 (메인쿼리 단일 연산자 사용으로)

 


 

 

 

 

 

 

메인쿼리 where의 비교 연산자 ' > '로 인해

서브쿼리 결과값의 문자열을 비교 조건으로 사용하여 

cate2 가 '식육제품/기타' 이후의 문자열로 시작하는 데이터들을 출력한다.

 

 

 

 

 

 

 

서브쿼리 결과값

 


 

 

 

 

 

 

 

 

 

 

 

 - 서브쿼리는 메인쿼리의 조건을 만들기위한 쿼리일뿐 메인쿼리의 결과에 항상 포함되지 않는다 - 

서브쿼리 결과값

 

 

 

💫 ALL  연산자 예제

weight_standard_kg이 (0.25 , 1, 500) 모두 초과하는 데이터 출력
서브쿼리 결과값

 

 

<Inline View>

 

'SQL' 카테고리의 다른 글

[MYSQL] 프로그래머스 SQL 문제풀기  (0) 2024.03.18
[MYSQL] LEFT,MID,RIGHT/ SUBSTR  (0) 2024.03.14
[MYSQL] GOALESCE(), 소수점 처리, DATEDIFF(), TIMESTAMPDIFF()  (0) 2024.02.16
[MYSQL] DATE_FORMAT()  (0) 2024.02.14
[MYSQL] JOIN 연산  (0) 2023.12.20