본문 바로가기
SQL/기초

SQL 정리 7일차 SubQUERY

by 유서담 2023. 8. 25.

7.1 SUBQERY의 개념

 

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

SubQUERY는 괄호로 묶여 있어야 한다

 

SubQUERY구문에서는 ORDER BY절 포함 불가

 

SubQUERY는 연산자의 오른쪽

 

SubQUERY에서 사용할 수 있는 연산자의 종류

단일행 연산자 = , > , >= , < , <=, <>
복수행 연산자 IN , NOT IN

 

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

 

7.2 Single Row SibQUERY

 

Single Row SibQUERY란 SubQUERY에서 Main QUERY로 전달되는 행이 단 하나인 경우

이런 경우는 단일행 연산자를 사용한다

SELECT name, title, dept_id
FROM s_emp
WHERE dept_id = ( SELECT dept_id
		   FROM s_emp
           	  WHERE name = '김정미');
              
-- s_emp 테이블에서 이름, 직책, 부서
-- 부서가 111인 사람들 중에
-- 이름이 '김정미' 인 사람을 출력

 

7.3 Multi Row SubQUERY

 

Multi Row SubQUERY란 SubQUERY에서 Main QUERY로 전달되는 행이 여러개인 경우

이런 경우는 다중행 연한자를 사용한다

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

 

7.4 Multi - column SubQUERY

 

Multi - column SubQUERY란 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);

 

7.5 FROM절에서의 SubQUERY

 

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;

한 테이블에 데이터의 양이 많은 경우에는 FROM절에 테이블 전체를 기술하여 사용하면 효율이 떨어질 수 있다

이럴 때는 일부의 행과 컬럼을 선택하여 FROM절에 SubQUERY로 효율적인 검색이 가능

이런 SubQUERY를 INLINE VIEW라고 부른다

 

7.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.7 CREATE절에서의 SubQUERY

 

CREATE TABLE emp_113 (id, name, mailid, start_date)
AS SELECT id, name, mailid, start_date
FROM s_emp
WHERE dept_id = 113;

테이블을 생성할 때 이미 만들어져 있는 기존의 테이블을 이용해서 특정 컬럼 또는 행만으로 원하는 테이블을 생성

데이터는 제외하고 테이블만 생성하려는 조건절이 항상 거짓이게 하면 된다

(생성할 테이블의 컬럼명을 생략하면, SELECT문의 컬럼명과 동일하게 된다)

 

7.8 DML문에서의 SubQUERY

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 s_emp
SET dept_id = (SELECT dept_id
		FROM s_emp
        	WHERE title = '사장' )
WHERE name = '안창환' ;

'SQL > 기초' 카테고리의 다른 글

SQL 정리 9일차 TRANSACTION CONTROL  (0) 2023.08.29
SQL 정리 8일차 CONSTRAINT  (0) 2023.08.27
SQL 정리 6일차 JOIN  (0) 2023.08.16
SQL 정리 5일차 GROUP BY, HAVING  (0) 2023.08.13
SQL 정리 4일차 -2- 날짜형 함수, 변환형 함수  (0) 2023.08.11