Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바의정석
- 항해99
- 알고리즘
- 가상컴퓨팅
- 문자열
- Java
- 개발자취업
- javascript
- 공개키 암호화
- 생성자
- generic class
- dbms
- dfs
- Queue
- 코테
- 코딩테스트준비
- js
- Algorithm
- 암호학
- sql
- DB
- 자료구조
- python
- 코딩테스트
- BFS
- JPA
- 크루스칼
- jsp
- data structure
- spring
Archives
- Today
- Total
PLOD
[SQL] SUB QUERY 본문
SUB QUERY (서브 쿼리)
하나의 SQL문 안에 포함되는 또 다른 SQL 문을 의미한다.
SELECT ENAME, SAL -- MAIN QUERY(OUTER QUERY)
FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'JONES') -- SUB QUERY(INNER QUERY)
SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT 문을 의미하며 INNER QUERY라고도 부른다. 반대로 서브 쿼리의 결과 값을 사용하여 기능을 수행하는 맨 바깥쪽에 있는 쿼리를 MAIN QUERY라고 부른다.
서브쿼리는 연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 소괄호 ()로 묶여 사용한다. 또 where 절이나 having 같은 조건절에서 서브쿼리를 사용할 때 비교 대상과 같은 자료형과 같은 개수로 지정해야 한다. 서브쿼리는 일반저긍로 기본 질의 실행 전에 한번 실행된다.
서브쿼리는 single row subquery와 multiple row subquery가 있다. single row subquery는 >,>=,=,<=,<> 같은 row operator와 함께 사용한다. multiple row subquery는 any , all, in,EXISTS과 같은 row operator와 함께 사용하는 특징이 있다.
1) 단일 행 서브 쿼리(single-row-subquery)
-- 사원번호가 7566인 사원의 급여보다 높은 사원의 데이터 출력
select ename, sal
from emp
where sal > (select sal from emp where empno = 7566);
-- EMP 테이블에서 사원번호가 7521인 사원과 업무가 같고 급여가 7934인 사원보다 많은 사원의 사원번호, 이름, 담당업무, 입사일자, 급여를 조회하라
select empno,ename,job,hiredate,sal
from emp
where job = (select job from emp where empno = 7521) and
sal > (select sal from emp where empno = 7934);
2) 다중 행 서브 쿼리(multiple-row-subquery)
다중행 연산자 | 설명 |
IN | 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 TRUE |
ANY,SOME | 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나이상이면 TRUE |
ALL | 메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 TRUE |
EXISTS | 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) TRUE |
---multiple row subquery
SELECT empno ,ename ,sal, deptno
FROM emp
WHERE sal in ( SELECT MAX(sal)
FROM emp
GROUP BY deptno)
-- 업무가 SALESMAN인 최소 한 명 이상의 사원보다 급여를 많이 받는 SALESMAN이 아닌 사원 정보 출력
select ENAME,SAL,JOB
from emp
where job != 'SALESMAN'
AND SAL > ANY(SELECT SAL FROM EMP WHERE JOB = 'SALESMAN');
-- 업무가 SALESMAN인 모든 사원보다 급여를 많이 받고 SALESMAN이 아닌 사원 정보 출력
SELECT ENAME,SAL,JOB
FROM EMP
WHERE JOB != 'SALESMAN'
AND SAL > ALL(SELECT SAL FROM EMP WHERE JOB = 'SALESMAN');
subquery에는 그룹함수를 사용할 수 있다.
-- 평균보다 급여가 높은 회사원 정보 출력
SELECT empno, ename, job, sal, deptno
FROM emp
WHERE sal < (SELECT avg(sal)
FROM emp);
-- EMP 테이블에서 부서별 최소급여가 20번 부서의 최소 급여보다 많은 부서를 조회하라
select deptno, min(sal)
from emp
group by deptno
having min(sal) > (select min(sal) from emp where deptno = 20);
'개발 공부 > Database' 카테고리의 다른 글
[DB] Redis (0) | 2024.08.20 |
---|---|
[SQL] GROUP 함수 (0) | 2023.02.13 |
[SQL] SQL 함수 (0) | 2023.02.05 |
[DB]Concurrency Control (0) | 2022.12.11 |
[DB]Transaction (0) | 2022.12.11 |
Comments