일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 데이터길이
- 10951
- algoritm
- 입출력
- Eclipse
- 2156
- 데이터베이스
- 소숫점처리
- 반복문
- ANSI JOIN
- Algorithm
- DP
- db
- SQL
- 그대로 출력하기
- Database
- Java
- 백준
- JOIN
- select
- darkest dark
- n x 2 타일링 2
- 자바
- 오라클
- 알고리즘
- 변수
- 동적계획법
- 문자열
- Dynamic Programming
- oracle
- Today
- Total
Cracking Code
SQL - SUB QUERY 본문
서브쿼리란 SELECT 문에 포함되어 있는 또 하나의 SELECT 문입니다.
위 그림 처럼 SELECT 문을 2번 수행하여 결과를 2번 얻는 것과 달리
SELECT 문을 한 번에 2번 입력 및 수행하여 결과를 얻을 수 있습니다.
바깥 쪽 쿼리는 메인 쿼리, 안 쪽 쿼리는 서브 쿼리라고 합니다.
서브 쿼리가 먼저 수행되고 메인 쿼리가 수행됩니다.
반드시 괄호로 묶어서 사용하며 서브쿼리에는 ORDER BY 절 사용 불가합니다.
SELECT column1, column2, ...
FROM table | [(SELECT ...)]
WHERE column ? [(SELECT ...)]
1. 단일 행 서브 쿼리
서브쿼리가 한 개의 행을 리턴합니다.
반드시 단일 행 연산자(=, >, <, >=, <=, !=)를 사용합니다.
사원 테이블에서 SCOTT의 급여보다 많은 사원의 사원 번호, 이름, 직업, 급여를 출력해봅시다.
SELECT EMPNO, ENAME, JOB, SAL
FROM EMP
WHERE SAL > (
SELECT SAL
FROM EMP
WHERE ENAME = 'SCOTT'
);
서브 쿼리는 HAVING 절에서도 사용할 수 있습니다.
사원 테이블에서 20번 부서의 최소 급여보다 최소 급여가 많은 모든 부서를 출력해봅시다.
SELECT DEPTNO
FROM EMP
GROUP BY DEPTNO
HAVING MIN(SAL) > (
SELECT MIN(SAL)
FROM EMP
WHERE DEPTNO = 20
);
2. 복수 행 서브 쿼리
서브 쿼리가 여러 개의 행을 리턴합니다.
반드시 복수 행 연산자를 사용합니다.
사원 테이블에서 직업 별로 최소 급여를 받는 사원의 번호, 이름, 직업, 고용일, 급여, 부서 번호를 출력해봅시다.
SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO
FROM EMP
WHERE SAL IN (
SELECT MIN(SAL)
FROM EMP
GROUP BY JOB
);
직업 별로 최소 급여를 포함하면 값이 여러 개가 됩니다.
예전에 익혔던 IN 연산을 통해 그 중 하나라도 포함되면 출력하는 것으로
복수 행 서브 쿼리를 수행할 수 있습니다.
복수 행 서브 쿼리에는 ALL, ANY, EXISTS 연산이 있습니다.
2.1 ALL
ALL 은 서브 쿼리의 모든 행에 대해 조건이 일치하여야 합니다.
사원 테이블에서 직업이 MANAGER인 사원들의 최소 급여 보다 적은 급여를 받는 사원들의 이름과 급여를 검색해봅시다.
SELECT ENAME, SAL
FROM EMP
WHERE SAL < (
SELECT MIN(SAL)
FROM EMP
WHERE JOB = 'MANAGER'
);
모두 MANAGER의 최소 급여인 2450 보다 낮은 사원인 것을 확인할 수 있습니다.
2.2 ANY
ANY는 서브 쿼리에서 반환되는 행들 중 어느 하나라도 만족하면 리턴합니다.
사원 테이블에서 업무가 MANAGER인 사원의 최소 급여 보다 많은 급여를 받는 사원들의 번호와 이름, 급여를 검색해봅시다.
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE SAL > ANY (
SELECT MIN(SAL)
FROM EMP
WHERE JOB = 'MANAGER'
);
2.3 EXISTS
서브 쿼리의 결과가 존재하는지 확인합니다.
하나라도 존재하면 메인 쿼리를 수행합니다.
사원 중에서 COMM을 받는 사원이 있으면 모든 사원의 정보를 출력해봅시다.
SELECT *
FROM EMP
WHERE EXISTS (
SELECT *
FROM EMP
WHERE COMM IS NOT NULL
);
'Database' 카테고리의 다른 글
SQL - UPDATE (0) | 2020.07.20 |
---|---|
SQL - INSERT INTO (0) | 2020.07.20 |
SQL - JOIN (ANSI) (0) | 2020.07.19 |
SQL - JOIN (ORACLE) (0) | 2020.07.19 |
SQL - GROUP BY, HAVING (0) | 2020.07.19 |