티스토리 뷰

개발공부/🛢️ SQL

[SQL] 서브쿼리

2022. 9. 16. 12:20

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기 강의를 들으며 정리한 내용입니다.

반응형
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그