728x90
서브쿼리란?
: SELECT문 안에 다시 SELECT문이 기술된 형태의 쿼리로 두 번 작성해서 결과를 출력해야 하는 SELECT문을 한 번만 작성해서 처리할 수 있도록 함
SELECT 열 이름1, 열 이름 2, ... FROM 테이블 이름 WHERE 조건식 연산자 ( SELECT 열 이름1, 열 이름 2, ... FROM 테이블 이름 WHERE 조건식 ) ; |
1. 단일 행 서브쿼리
: 하나의 행을 검색하는 서브쿼리
: 조건식인 WHERE절에 기술되는 열의 개수, 데이터 타입은 메인 쿼리와 서브쿼리가 같아야 함
EX ) employees 테이블의 first_name이 'Jason'인 직원과 salary가 동일한 직원에는 누가 있는가?
SELECT* FROM employees A WHERE A.salary = ( SELECT salary FROM employees WHERE first_name='Jason' ); |
[실행결과]
2. 다중 행 서브쿼리
: 하나 이상의 행을 검색하는 서브쿼리
다중 행 연산자의 종류
다중 행 연산자 | 설명 |
IN | 같은 값 |
NOT IN | 같은 값이 아님 |
EXISTS | 값이 있으면 반환함 |
ANY | 최소한 하나라도 만족하는 것 <.= 와 같은 비교 연산자와 같이 사용 |
ALL | 모두 만족하는 것 <.= 와 같은 비교 연산자와 같이 사용 |
EX) employees 테이블에서 department_id별로 가장 높은 salary가 얼마인지 찾고,
해당 salary에 해당하는 직원이 누구인가?
SELECT * FROM employees A WHERE A.salary IN( SELECT MAX(salary) FROM employees GROUP BY department_id ) ORDER BY A.salary DESC; |
[실행결과]
3. 다중 열 서브쿼리
: 하나 이상의 열을 검색하는 서브쿼리
: 쿼리 내에 비교되는 열이 여러 개 들어갈 수 있음
SELECT 열 이름 FROM 테이블 이름 WHERE (열 이름1, 열 이름2, ...) IN (SELECT 열 이름1, 열 이름2, ...) FROM 테이블 이름 WHERE 조건식 ); |
EX) employees 테이블에서 department_id별로 가장 낮은 salary가 얼마인지 찾고
찾아낸 department_id별 salary에 해당하는 직원은?
SELECT * FROM employees A WHERE (A.department_id, A.salary) IN ( SELECT department_id, MIN(salary) FROM employees GROUP BY department_id) ORDER BY A.salary desc; |
[실행결과]
4. FROM 절 서브쿼리
: SELECT문을 간결하게 작성할 수 있으며 인라인뷰라고도 불림
SELECT 열 이름1 FROM 테이블 이름 별칭 1, (SELECT 열 이름2 FROM 테이블 이름 WHERE 조건식) 별칭 2 WHERE 별칭1.열 이름1=별칭 2. 열 이름2 |
EX) 직원 중에서 department_name이 Finance인 직원의 정보 출력하기
SELECT* FROM employees A, (SELECT department_id FROM department WHERE department_name='Finance') B WHERE A.department_id=B.department_id; |
[실행결과]
'직장인 자기계발 > SQL' 카테고리의 다른 글
SQL : 조인 (0) | 2021.01.22 |
---|---|
SQL : 그룹 함수 (0) | 2021.01.21 |
SQL : 단일 행 함수 (0) | 2021.01.20 |
SQL : DDL (CREATE / ALTER/TRUNCATE/DROP) (0) | 2021.01.18 |
SQL : DML (INSERT/UPDATE/DELETE) 방법 (0) | 2021.01.17 |