본문 바로가기

프로그래밍/SQL

[SQL 요약 정리] 1-7. SUBQUERY

7. SUBQUERY


1) SubQUERY

- 하나의 SELECT문 안에 포함된 또 다른 SELECT문

- 제한: 연산자 좌측 괄호 내에 위치, ORDER BY절 포함 불가

- 사용 가능 연산자: =, >, >=, <, <=, <> / IN, NOT IN

- 문형

SELECT 대상 컬럼

FROM 테이블명

WHERE 형식 연산자 (SELECT 대상 컬럼 FROM 테이블명...);


2) Single Row SubQUERY

- Main Query로 전달되는 행이 단 하나인 경우(단일 행 연산자 사용)

- 예시

SELECT name, title, dept_id

FROM s_emp

WHERE dept_id = ( SELECT dept_id FROM s_emp WHERE name= '김정미');


3) Multi Row SubQUERY

- Main Query로 전달되는 행이 여러개인 경우(다중 행 연산자 사용)

- 예시

SELECT name, dept_id

FROM s_emp

WHERE dept_id IN ( SELECT id FROM s_dept WHERE region_id = 3);


4) Multi-column SubQUERY

- WHERE절에서 여러개의 칼럼을 비교하는 경우(pair-wise)

- 예시

SELECT name, dept_id, salary

FROM s_emp

WHERE (salary, dept_id) IN

(SELECT MIN(salary), dept_id FROM s_emp GROUP BY dept_id);


5) FROM절에서의 SubQUERY

- 테이블 일부의 행과 컬럼 선택(INLINE VIEW)

- 예시

SELECT e.name, e.title, d.name

FROM (SELECT name, title, dept_id FROM s_emp WHERE title = '사원' ) e, s_dept d

WHERE e.dept_id = d.id;

6) HAVING절에서의 SubQUERY

- 예시

SELECT dept_id, AVG(salary)

FROM s_emp

GROUP BY dept_id

HAVING AVG(salary) > (SELECT AVG(salary) FROM s_emp WHERE dept_id = 113);


7) CREATE절에서의 SubQUERY

- 기존 테이블을 이용해서 원하는 테이블 생성시 사용

- 컬럼명 생략시 SELECT문의 컬럼명과 동일(제외 조건을 이용해서 컬럼명 복사 가능)

- 예시

CREATE TABLE emp_113 (id, name, mailid, start_date)

AS SELECT id, name, mailid, start_date

FROM s_emp

WHERE dept_id = 113;


8) DML문에서의 SubQUERY

- INSERT 예시

INSERT INTO emp_113(id, name, mailid, start_date)

SELECT id, name, mailid, start_date

FROM s_emp

WHERE start_date < '16/01/01' ;


- UPDATE 예시

UPDATE s_emp

SET dept_id = (SELECT dept_id FROM s_emp WHERE title = '사장' )

WHERE name = '안창환';