DB + SQL
[SQL] - SQL 서브쿼리 정리(단일행 서브쿼리, 다중행 서브쿼리)
dev_SiWoo
2020. 8. 25. 12:10
# 서브쿼리(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);