티스토리 뷰
1️⃣ 서브쿼리 란?
하나의 쿼리 안에 포함된 또 하나의 쿼리 메인 쿼리가 서브쿼리를 포함하는 종속적인 관계
- 알려지지 않은 기준을 이용한 검색에 유용하다.
- 메인 쿼리가 실행되기 이전에 한 번만 실행한다.
- 한 문장에서 여러 번 사용 가능하다.
SELECT * FROM employee
WHERE 급여 >
(SELECT 급여 FROM employee WHERE 이름=‘elice’);
서브쿼리 사용 시 주의사항
- 서브쿼리는 괄호와 함께 사용되어야 한다.
- 서브쿼리 안에서 ORDER BY 절은 사용할 수 없다.
- 서브쿼리는 연산자의 오른쪽에 사용되어야 한다.
- 서브쿼리는 오로지 SELECT문으로만 작성 할 수 있다
2️⃣ 반환에 따른 서브쿼리 분류
단일행 서브쿼리 (Single-Row Subquery)
: 결과가 한 행만 나오는 서브쿼리 서브쿼리가 결과를 1개의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리
SELECT * FROM employee
WHERE 급여 >
(SELECT 급여 FROM employee WHERE 사원번호 = 1);
-- 사원번호는 기본적으로 1개만 있으므로 한 개의 행만 반환함 = 단일 행
단일행 서브쿼리 연산자
= | 같다 |
<> | 같지 않다 |
> | 크다 |
>= | 크거나 같다 |
< | 작다 |
<= | 작거나 같다 |
다중행 서브쿼리 (Multiple-Row Subquery)
: 결과가 한 행만 나오는 단일 행 서브쿼리와는 다르게 서브쿼리가 결과를 2개 이상 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리
SELECT * FROM employee
WHERE 급여 IN (
SELECT max(급여) FROM employee GROUP BY 부서번호);
-- 급여가 가장 큰 사람은 1명일수도 여러명일 수도 있다 = 다중행
다중행 서브쿼리 연산자
IN | 하나라도 만족하면 반환 |
ANY | 하나라도 만족하면 반환 (비교 연산 가능) 내부적으로 모두 or 연산을 함 |
ALL | 모두 만족하면 반환 (비교 연산 가능) 내부적으로 모두 and연산을 함 |
<any, >all : 최댓값
>any, <all : 최솟값
예시)
-- emp테이블에서 각 부서별 급여를 제일 많이 받는 사원 조회
select * from emp where sal =any (select max(sal) from emp group by deptno);
-- emp테이블에서 각 부서별 나이가 제일 많은 사원의 모든 컬럼을 조회
select * from emp where birthdate in (select min(birthdate) from emp group by deptno);
-- salaries테이블에서 from_date가 2000-12-31 이전인 사람들의 급여 중 하나의 급여 보다 더 적은 급여를 받은 직원 조회 조회
select * from salaries
where salary <any
(select salary from salaries where from_date < '2000-12-31');
-- salaries테이블에서 from_date가 2000-12-31 이전인 사람들의 급여 중 모든 급여보다 적은 급여를 받은 직원 조회
select * from salaries
where salary <all
(select salary from salaries where from_date < '2000-12-31');
3️⃣ 위치에 따른 서브쿼리 분류
일반적인 서브쿼리의 형태
: WHERE 절에 사용되는 서브쿼리
- 가장 일반적인 형태의 서브쿼리
SELECT * FROM employee
WHERE 급여 >
(SELECT 급여 FROM employee WHERE 이름=‘elice’);
스칼라 서브쿼리
: SELECT 절에서 사용하는 서브쿼리
- 스칼라 서브쿼리는 오로지 한 행만 반환한다.
- 마치 JOIN을 사용한 것과 같은 결과를 나타낸다.
SELECT students.name, (
SELECT math
FROM middle_test as m
WHERE m.student_id = students.student_id
) AS middle_avg
FROM students;
-- salaries테이블에는 한 직원의 연도별 급여들이 들어있다.
-- 각 직원별 직원의 평균급여를 조회
select distinct emp_no,
(select avg(salary) from salaries as a where a.emp_no = b.emp_no) as avg_salary
from salaries as b;
이 글은 엘리스의 AI트랙 5기 강의를 들으며 정리한 내용입니다.
'개발공부 > 🛢️ SQL' 카테고리의 다른 글
[SQL] 다수의 테이블 제어하기 (0) | 2022.09.16 |
---|---|
[SQL] SQL과 함수 (0) | 2022.09.15 |
[SQL] 데이터를 제어하는 DML (데이터 조작어) (0) | 2022.09.15 |
[SQL] SQL이란 무엇인가? (0) | 2022.09.13 |
프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그