SQL 서브쿼리

강희철·2022년 1월 15일
0

SQL

목록 보기
9/9

서브쿼리란?

서브쿼리 ( sub query ) 란 select 문 안에 다시 select 문이 기술된 형태의 쿼리 ( query ) 이다. 서브쿼리 ( 하위 select 문 )의 결과를 메인 쿼리 ( 상위 select 문 ) 에서 받아 처리하는 구조이기 때문에 중첩된 쿼리라고도 부른다. 서브쿼리의 결과는 메인 쿼리의 조건으로 사용된다.

select	열 이름1, 열 이름2,
from	테이블 이름
where	조건식 연산자
	( select	열 이름1, 열 이름2,
    	  from		테이블 이름
    	  where		조건식 ) --> 서브 쿼리

서브쿼리 사용 규칙

  • 서브쿼리는 괄호로 묶어서 사용. 메인쿼리는 괄호 필요 x
  • 메인 쿼리와 서브쿼리를 연결하기 위해 단일 행 연산자나 다중 행 연산자를 사용
  • 메인 쿼리와 서브쿼리의 연결 형태는 연산자에 따라 의미가 다름
  • 메인 쿼리는 연산자의 왼쪽에 기술하고 서브쿼리는 연산자의 오른쪽에 기술.
  • 서브 쿼리에서 메인 쿼리의 순서로 select 문이 실행
  • 서브 쿼리에서 서브쿼리를 추가하여 계속 중첩하여 SQL문을 작성할 수 있음.

서브쿼리의 종류!

종류 설명
단일 행 서브쿼리 하나의 행을 검색하는 서브 쿼리
다중 행 서브쿼리 하나 이상의 행을 검색하는 서브 쿼리
다중 열 서브쿼리 하나 이상의 열을 검색하는 서브 쿼리

서브쿼리의 종류에 따라 사용하는 연산자의 종류

연산자 종류 사용처
단일 행 연산자 =, >, >=, <, <=, <>, != 단일 행 서브쿼리, 다중 열 서브쿼리
다중 행 연산자 IN, NOT IN, EXISTS, ANY, ALL 다중 행 서브쿼리, 다중 열 서브쿼리

예제테이블1 ( user )

index name level salary
1 홍길동 3 600
2 고길동 5 300
3 아무개 3 200
4 루피 7 900
5 이기영 5 450
6 호빵맨 4 170
7 세균맨 4 1300

예제테이블2 ( user2 )

index name birth level weight salary
1 홍길동 990101 1 59 600
2 고길동 960303 2 95 300
3 아무개 020507 1 66 200
4 루피 950330 1 65 900
5 이기영 870604 2 73 450
6 호빵맨 900617 4 59 170
7 세균맨 901208 4 103 1300

단일 행 서브쿼리

서브쿼리 select 문에서 얻은 한 개 행의 결과값을 메인 쿼리로 전달하는 서브쿼리.

SELECT * FROM user WHERE salary > (SELECT MIN(salary) FROM user2 WHERE LEVEL = 2)
# user2의 level이 2인 데이터들 중 가장 작은 salary 보다 salary가 큰 user1 데이터들
index name level salary
1 홍길동 3 600
4 루피 7 900
5 이기영 5 450
7 세균맨 4 1300

다중 행 서브쿼리

다중 행 서브쿼리의 사용법은 단일 행 서브쿼리와 같다. 다중 행 서브쿼리는 하나 이상의 결과 행을 메인 쿼리에 전달하는 경우에 사용하며 다중 행 연산자를 사용

연산자 설명
IN 같은 값 IN(10, 20) => 10, 20을 포함
NOT IN 다른 값 NOT IN(10, 20) => 10이나 20을 포함하지 않음
ANY 최소한 하나라도 만족하는지 여부 ( OR ) ANY(10, 20) 10이나 20 포함
ALL 모두 만족하는지 여부 ( AND ) ALL(10, 20) => 10과 20을 모두 포함
SELECT * FROM user WHERE salary < ALL (SELECT salary FROM user2 WHERE LEVEL = 2)
# user2의 level이 2인 데이터들의 salary들 모두보다 salary가 작은 user1의 데이터들

이해를 돕기위한 서브쿼리 결과

SELECT salary FROM user2 WHERE LEVEL = 2
salary
300
450

결과

index name level salary
3 아무개 3 200
6 호빵맨 4 170
서브쿼리의 결과가 다중 행이면서 값이 여러개이다. 즉 서브쿼리를 사용한 메인 쿼리를 해석해보면

user1의 salary가 300보다 작고, 450보다 작은 데이터들이다. ( AND )


0개의 댓글