13 서브쿼리

jedo5000·2023년 12월 4일
0

DataBase

목록 보기
13/13

13.1 서브쿼리(SUB QUERY)

다른 쿼리 내부에 포함되어 있는 SELECT 쿼리를 의미, 보다 다양한 데이터를 출력하는 방법을 제공 → “ 실무에서 많이 사용되는 기술 ”

앞서 이미 서브쿼리를 사용해봤다.


FROM절 안에 들어있는게 서브쿼리이다.

13.2 스칼라 서브쿼리

SELECT 에서 사용되는 서브쿼리로 하나의 컬럼에 대해 하나의 행만 반환하는 특징을 가진다. 출력되는 하나의 값이 없다면 NULL 값 반환

이 서브쿼리가 하나의 COLUMN역할을 한다.

  • 순차적으로 쿼리를 실행함. (많은 정보가 필요하지 않을때는 JOIN으로 합칠 필요가 없다. 따라서 JOIN에 비해 성능이 장점이 된다.)
  • 스칼라서브쿼리는 아우터 조인으로 변경이 가능함.

13.3 중첩서브쿼리

WHERE 에서 주로 사용되는 서브쿼리로 메인쿼리와 관계가 있는지에 따라 상관 서브쿼리와 비상관 서브쿼리로 나눔

비상관 서브쿼리 : 메인 쿼리의 컬럼을 사용하지 않는 서브쿼리
→ 서브쿼리가 먼저 실행되고 메인 쿼리 실행

SELECT *
FROM 직원
WHERE 연봉 >= (SELECT AVG(연봉)
FROM 직원 ) ;(SELECT AVG(연봉)
	FROM 직원) 
    // 독단적인 쿼리이므로 한 번의 실행으로 정답 도출됨.

상관 서브쿼리 : 메인 쿼리의 컬럼을 사용하는 서브쿼리
→ 메인쿼리가 먼저 실행되고 서브 쿼리 실행

SELECT *
FROM 직원 A
WHERE 연봉 = ( SELECT MIN(연봉)
FROM 직원
WHERE 부서ID = A.부서ID ) ;
-- 상관 서브쿼리는 메인 쿼리의 컬럼과 연관되어 있어 값이 정해지지 않음

13.4 단일행/다중행 연산자

WHERE 절에서 서브쿼리 결과를 받을 때
1. 단일행을 받을 수 있는 연산자 ( =, =< , !=, > 등등..)
2. 다중행을 받을 수 있는 연산자 ( IN, ANY, ALL, EXIST 등등..)

WHERE 절에서 서브쿼리 결과로 2개 이상의 행을 출력했을 때는 단일행 연산자를 사용할 수 없다.( 다중행 연산 필요!)

13.4.1 다중행 연산자 < IN >

  • 입력된 다중 행 중에서 일치하는 값들은 모두 출력

13.4.2 다중행 연산자 < ANY >

  • 입력된 다중 행 중에서 하나라도 일치하면 출력(OR로 조건들을 잇는다.)

13.4.3 다중행 연산자 < ALL >

  • 입력된 다중 행 중에서 값이 모두 일치해야 출력(AND로 조건들을 잇는다.)

13.4.4 다중행 연산자 < EXISTS >

입력된 다중 행 중에서 일치하는 행의 존재 여부를 확인 → 존재하면 TRUE 반환(서브쿼리를 꼭 사용해야 하는 연산자)

  • EXIST 와 IN의 차이점
    IN은 일치하는 모든 것을 출력하기 위해 테이블의
    모든 튜플에 접근한다.
    → 출력한 내용을 눈으로 확인해야 할 때 사용

    EXISTS는 일치하는 튜플이 있는 순간 해당 작업 중지
    → 해당 내용이 존재 하는지 확인되기만 하면 테이블의 다른 정보를 보여주고 싶을 때 ( 속도 및 성능 우위 )

13.4.5 다중행 연산자 < NOT EXISTS >

입력된 다중 행 중에서 일치하는 행의 존재 여부를 확인→ 존재하면 FALSE 반환(조건과 일치하지 않는 내용에 대해 TRUE 출력)7

0개의 댓글