[SQL] - SQL 서브쿼리 정리(단일행 서브쿼리, 다중행 서브쿼리)

# 서브쿼리(sub query) : select 안에 select가 존재, 서브쿼리의 결과는 무조건 1줄이 와야하며

                               1줄 이상이 올 경우 다중행 서브쿼리로서  in, any, all 등을 사용하게 된다.

 

1. 단일행 서브쿼리

예제1. 직원 중 이순철 보다 급여가 많은 직원을 출력하라

SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE ename='이순철')

예제2. 연봉이 제일많은 직원을 출력하라

SELECT * FROM emp
   WHERE salary = (SELECT MAX(salary) FROM emp)

예제3. 사원의 평균급여보다 급여가 작은 사람의 이름과 급여를 출력, 단 사원이 매달 바뀌어도

정상적으로 출력되도록 하라

SELECT ename, salary FROM emp
   WHERE salary < (SELECT AVG(salary) FROM emp WHERE job='사원');

2. 다중행 서브쿼리 : 서브쿼리의 결과값이 여러개의 row인 서브쿼리

                         : =, <, > 등의 비교 불가하며 in, any, all 등을 사용

 

예제3. 1학년 학생의 키와 같은 2학년 학생의 이름과 키를 출력하라

SELECT NAME, height FROM student WHERE grade =2 AND height IN (SELECT height FROM student WHERE grade =1);

 

예제4. 2학년 학생 중 키가 가장작은 학생보다 키가 큰 학생의 이름과 키를 출력하라

ANY : 서브쿼리 결과 중 하나라도 만족하는 결과

SELECT NAME, height FROM student WHERE height > ANY(SELECT height FROM student WHERE grade=2) # 방법1

사실 위와 같이 ANY 구문을 사용해서 다중행 서브쿼리는 아래의 단일행 서브쿼리보다 비교연산을 더 많이 하기 때문에 비효율적이다. 

SELECT NAME, height FROM student WHERE height > (SELECT min(height) FROM student WHERE grade=2)# 방법 2 : 이게 더 직관적임

위와 같은 방법2가 코드를 봐도 더 직관적이고 연산횟수도 적기 때문에 더 빠르다.

 

예제5. 2학년 학생 중 키가 가장큰 학생보다 키가 큰 학생의 이름과 키를 출력하라

ALL : 서브쿼리 결과 모두를 만족

SELECT NAME, height FROM student WHERE height > All(SELECT height FROM student WHERE grade=2)

 

예제5도 마찬가지로 아래와 같이 단일행 서브쿼리로 작성하는 것이 더 직관적이고 연산횟수가 적다

SELECT NAME, height FROM student WHERE height > (SELECT max(height) FROM student WHERE grade=2);

 

'DB + SQL' 카테고리의 다른 글

[DB] 데이터베이스 정규화란?  (0) 2021.12.09
[DB] 데이터 모델링이란?  (0) 2021.12.09
[SQL] - SQL Join 정리  (0) 2020.08.25
[SQL] - SQL 그룹집계 함수  (0) 2020.08.24
[SQL] - SQL IF문, 중첩 IF문, CASE 문  (0) 2020.08.24