본문 바로가기
IT/SQL

SubQUERY

by 봉즙 2019. 6. 7.

SUBQUERY : 하나의 SELECT문 안에 포함되어있는 또 다른 SELECT문장이다.

1
2
3
SELECT 검색할 칼럼들
FROM 테이블명
WHERE 형식 연산자 (SELECT 검색할 컬럼들, FROM 테이블명 ...);

- subquery는 괄호로 묶여있어야한다.

- ORDER BY절을 구문에서 포함할수 없다.

- 연산자의 오른쪽에 나타나야한다.

-사용가능한 연산자 종류 (단일행 연산자 :  =, >, >=, <, <=, <>    복수행 연산자 : IN, NOT IN)

Single row subquery : subquery에서 main query로 전달되는 행이 단 하나인 경우, 단일행 연산자를 사용한다.

1
2
3
SELECT name, title, dept_id
FROM s_emp
WHERE dept_id = (SELECT dept_id FORM s_emp WHERE name = '김정미');

Multi Row Subquery : subquery에서 Main query로 전달되는 행이 여러개인 경우, 다중행 연산자를 사용한다.

1
2
3
4
5
6
7
SELECT name, dept_id
 
FROM s_emp
 
WHERE dept_id IN (SELECT id FROM s_dept WHERE regoin_id = 3);
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

Multi-column SubQuery : subQUERY구문 작성시 WHERE절에서 비교하는 컬럼이 하나가 아니라 여러 개의 컬럼을 동시에 비교하는 경우를 말하며 이러한 경우를 pair-wise되었다 한다.

1
2
3
4
5
6
7
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);
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

FROM절에서의 SubQUERY : 한 테이블에 데이터의 양이 많은경우 FROM절에 테이블 전체를 기술하여 사용하면 효율이 덜어지기에 일부 행과 칼럼을 선택하여 FROM절에 subQuery로 효율적인 검색이 가능하다. 이것을 INLINE VIEW라한다.

HAVING절에서의 SubQUERY 

1
2
3
4
5
6
7
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);

 

예제)

1
2
3
4
5
6
7
8
9
--Q9. 가장 적은 평균급여(min salary)를 받는 직책(title)에 대해 그 직책과 평균급여를 나타내시오 --d오류
SELECT TITLE, avg(salary)
FROM s_emp
group by title
HAVING avg(salary) = (select min(a) from
(SELECT title, avg(salary) a
FROM s_emp 
group by title) );
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

CREATE절에서의 subQuery : 테이블 생성시 기존의 테이블을 잉요해 특정 컬럼이나 행만으로 원하는 테이블을 생성, 데이터는 제외하고 테이블만 생성하려면 조건절을 항상 거짓이게한다.(생성시 테이블의 컬럼명을 생략하게 되면 SELECT문의 컬럼명과 동일하게 생성된다.)

1
2
3
4
5
CREATE TABLE emp_113 (id, name, mailid, start_date)
AS SELECT id, name, mailid, start_date
FROM s_emp
WHERE dept_id = 113;
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

DML문에서 subQUERY : 조건에 맞는 데이터는 들어가지만 없는 경우 테이블 생성

1
2
3
4
INSERT INTO emp_113 (id, name, mailid, start_date)
SELECT id, name, mailid, start_date
FROM s_emp
WHERE start_date M '16/01/01';

 

1
2
3
 
UPDATE s_emp
SET dept_id = (SELECT dept_id FROM s_emp WHERE title = '사장')
WHERE name = '안창환';

 

'IT > SQL' 카테고리의 다른 글

TRANSACTION CONTROL  (0) 2019.06.08
Constraint  (0) 2019.06.07
SET연산자  (0) 2019.06.07
JOIN  (0) 2019.06.07
Developer 설치  (0) 2019.06.07

댓글