안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

데이터베이스 (Database)

[SQL] 서브쿼리 (Subquery)

피그브라더 2020. 1. 7. 11:05

1. 서브쿼리 (Subquery)

SQL 쿼리문의 하부 절에 또 다른 SQL 쿼리문을 중첩하여 사용하는 기법을 말한다. 주의할 점은, 서브쿼리는 항상 연산자의 우측에 존재해야 하며 반드시 괄호로 묶어줘야 한다는 것이다. 서브쿼리는 다음과 같이 간단히 분류해볼 수 있다.

 

대분류 소분류
위치에 따른 분류 SELECT 문에 존재하는 서브쿼리
FROM 절에 존재하는 서브쿼리
WHERE 절에 존재하는 서브쿼리
반환 값에 따른 분류 단일 행 서브쿼리 (단일 행 + 단일 열)
다중 행 서브쿼리 (다중 행 + 단일 열)
다중 열 서브쿼리 (다중 행 + 다중 열)

 

2. 서브쿼리의 분류

2-1. 단일 행 서브쿼리 (Single Row Subquery)

단일 행 비교 연산자인 =, <, >, <=, >= 등을 사용할 수 있다.

EX) 이름이 SMITH인 직원의 부서에 속한 직원들의 이름/부서번호를 출력

 

SELECT name, dept_no
FROM employee
WHERE dept_no = (SELECT dept_no FROM employee WHERE name='SMITH');

 

2-2. 다중 행 서브쿼리 (Multiple Row Subquery)

다중 행 비교 연산자인 IN, > ANY, < ALL, < ANY, > ALL, EXIST 등을 사용할 수 있다.

EX) 직업이 PRESIDENT인 직원의 부서들에 속한 직원들의 이름/직업/부서번호를 출력

 

SELECT name, job, dept_no
FROM employee
WHERE dept_no IN (SELECT dept_no FROM employee WHERE job='PRESIDENT');

 

2-3. 다중 열 서브쿼리 (Multiple Column Subquery)

대응하는 컬럼의 개수가 반드시 같아야 한다.

EX) 부서별로 봉급이 최소인 직원들의 부서번호/이름/봉급을 출력

 

SELECT dept_no, name, salary
FROM employee
WHERE (dept_no, salary) IN (SELECT dept_no, MIN(salary) FROM employee GROUP BY dept_no);

 

2-4. 스칼라 서브쿼리 (Scala Subquery)

SELECT 문에서 사용하는 서브쿼리로, 1행만 반환한다.

EX) 직업이 MANAGER인 직원들의 이름/부서이름/직업을 출력

 

SELECT name, (SELECT d_name FROM department d WHERE d.dept_no = e.dept_no) dept_name, job 
FROM employee e 
WHERE job='MANAGER';

 

2-5. 상호연관 서브쿼리 (Correlated Subquery)

메인쿼리의 값을 서브쿼리에게 전달하고 서브쿼리를 수행한 뒤, 그 결과를 다시 메인쿼리로 돌려주고 메인쿼리를 수행하는 것이다.

EX) 자신이 속한 부서의 봉급 평균보다 많은 봉급을 받는 직원들의 이름/부서번호/봉급을 부서 번호순으로 출력

 

SELECT name, dept_no, salary
FROM employee e1
WHERE salary > (SELECT AVG(salary) FROM employee e2 WHERE e2.dept_no=e1.dept_no)
ORDER BY dept_no;

 

 

 

 

 

 

본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.

https://ttend.tistory.com/619?category=391739

'데이터베이스 (Database)' 카테고리의 다른 글

[Database] 인덱스 (Index), B-Tree  (0) 2020.06.23
[Database] 트랜잭션 (Transaction)  (0) 2020.06.18