다중 행 서브 쿼리
SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM 테이블
WHERE 컬럼 다중_행_연산자 (SELECT 문장 : Sub query문)
- 다중 행 연산자
. IN : 나열된(검색된) 값 중에 하나만 일치하면 참이다.
. ANY : 나열된(검색된) 값 중에 조건에 맞는 것이 하나 이
예제 1. 20번 부서원들과 동일한 관리자로부터 관리 받는 사원을 검색한다.
SELECT eno 사번, ename 이름
FROM emp
WHERE mgr IN (SELECT mgr
FROM emp
WHERE dno = '20')
AND dno != '20'; // 20번 부서원이 검색되는 것을 막기 위한 조건
사번 이름
------- ----------
1001 문시현
1003 양선호
2001 남궁연호
2003 정의찬
예제 2. 10번 부서원들보다 급여가 낮은 사원을 검색한다.
SELECT eno 사번, ename 이름, dno 부서번호
FROM emp
WHERE sal < ALL (SELECT sal
FROM emp
WHERE dno = '10');
사번 이름 부서번호
------- ---------- ---------
2008 윤고은 40
2007 이초록 30
2002 제갈민 20
0702 김민지 02
0309 김선유 02
SELECT eno 사번, ename 이름, dno 부서번호
FROM emp
WHERE sal < ALL (SELECT MIN(sal)
FROM emp
WHERE dno = '10');
사번 이름 부서번호
------- ---------- ---------
2002 제갈민 20
2007 이초록 30
2008 윤고은 40
0309 김선유 02
0702 김민지 02
* 다중 행 연산자와 그룹함수
다중 행 연산자인 ALL이나 ANY는 다음과 같이 그룹 함수를 이용 표현할 수 있다. 그룹 함수는 [19장
그룹 함수]에서 자세히 설명한다.
* 컬럼 > ALL → 컬럼 > MAX() : 가장 큰 값보다 크다
* 컬럼 < ALL → 컬럼 < MIN() : 가장 작은 값보다 작다.
* 컬럼 > ANY → 컬럼 > MIN() : 가장 작은 값보다 크다.
* 컬럼 < ANY → 컬럼 < MAX() : 가장 큰 값보다 작다.
다중 열 서브 쿼리
SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM 테이블
WHERE (컬럼1, 컬럼2, ... ) IN (SELECT 문장 : Sub query문)
예제 3. 손하늘과 동일한 관리자의 관리를 받으면서 업무도 같은 사원을 검색한다.
SELECT eno 사번, ename 이름, mgr 관리자, job 업무
FROM emp
WHERE (mgr, job) IN (SELECT mgr, job
FROM emp
WHERE ename = '손하늘')
AND ename != '손하늘';
사번 이름 관리자 업무
------- ---------- -------- -------
0201 안영숙 0001 지원
손하늘이 두 명 이상이라면 수정이 불가능하다.
SELECT eno 사번, ename 이름, mgr 관리자, job 업무
FROM emp
WHERE mgr = (SELECT mgr FROM emp WHERE ename = '손하늘')
AND job = (SELECT job FROM emp WHERE ename = '손하늘')
AND ename != '손하늘';
사번 이름 관리자 업무
------- ---------- -------- -------
0201 안영숙 0001 지원
예제 4. 김선유와 부서 및 업무가 동일한 사원을 검색한다.
SELECT eno 사번, ename 이름, dno 부서번호, job 업무
FROM emp
WHERE (dno, job) IN (SELECT dno, job
FROM emp
WHERE ename = '김선유')
AND ename != '김선유';
사번 이름 부서번호 업무
------- ---------- --------- -------
0301 이승철 02 회계
0302 박선경 02 회계
0702 김민지 02 회계
0269 권나현 10 분석
SELECT eno 사번, ename 이름, dno 부서번호, job 업무
FROM emp
WHERE dno in (SELECT dno FROM emp WHERE ename = '김선유')
AND job in (SELECT job FROM emp WHERE ename = '김선유')
AND ename != '김선유';
사번 이름 부서번호 업무
------- ---------- --------- -------
0301 이승철 02 회계
0302 박선경 02 회계
0702 김민지 02 회계
0801 천유정 02 분석
0401 김진성 10 회계
0269 권나현 10 분석
SELECT ename, dno, job
FROM emp
WHERE ename = '김선유';
ENAME DNO JOB
---------- ------- -------
김선유 02 회계
김선유 10 분석
실습
1. 화학과 학생과 평점이 동일한 학생들을 검색한다.
SELECT sno 학번, sname 이름, major 전공
FROM student
WHERE avr IN (SELECT avr FROM student WHERE major = '화학')
AND major != '화학';
학번 이름 전공
------- ---------- -------
948209 유태지 식영
924505 서찬호 물리
913904 이호란 생물
933903 정승동 생물
915605 강은혜 유공
924502 은정현 물리
935604 권석현 유공
학번 이름 전공
------- ---------- -------
945605 오경운 유공
943905 유태지 생물
943903 유지아 생물
944512 서동조 물리
945603 정백영 유공
2. 화학과 교수와 부임일이 같은 직원을 검색한다.
SELECT eno 학번, ename 이름, hdate 부임일자
FROM emp
WHERE hdate IN (SELECT hiredate FROM professor WHERE section = '화학');
학번 이름 부임일자
------- ---------- ----------
0201 안영숙 1991/02/01
1001 문시현 1991/02/01
3. 화학과 학생과 같은 학년에서 평점이 동일한 학생들을 검색한다. (다중열 서브쿼리)
SELECT syear 학년, sno 학번, sname 이름, major 전공, avr 평점
FROM student
WHERE (syear, avr) IN (SELECT syear, avr FROM student WHERE major = '화학')
AND major != '화학';
학년 학번 이름 전공 평점
---------- ------- ---------- ------- ----------
1 945605 오경운 유공 2.99
4. 10번 부서 사원들보다 년봉을 많이 받는 사원을 검색한다.
SELECT eno 사번, ename 이름, sal*12+NVL(comm,0) 연봉, dno 부서번호
FROM emp
WHERE (sal*12+NVL(comm,0)) > (SELECT MAX(sal*12+NVL(comm,0)) FROM emp WHERE dno = 10)
AND dno != 10;
사번 이름 연봉 부서번호
------- ---------- ---------- ---------
0001 안영희 57600 01
5. 10번 부서 사원들과 업무와 성별이 동시에 일치하는 사원을 검색한다.
SELECT eno 사번, ename 이름, job 업무, sex 성별
FROM emp
WHERE (job, sex) IN (SELECT job, sex FROM emp WHERE dno = 10)
AND dno != 10;
사번 이름 업무 성
------- ---------- ------- ---
1003 양선호 모델링 남
2002 제갈민 개발 남
2003 정의찬 개발 남
2007 이초록 개발 남
3002 권아현 분석 여
0801 천유정 분석 여
0301 이승철 회계 남
사번 이름 업무 성
------- ---------- ------- ---
0309 김선유 회계 남
0702 김민지 회계 남
'SQL 공부 기록' 카테고리의 다른 글
SQL 13 - 단일 행 함수 : 문자 함수 (0) | 2021.11.12 |
---|---|
SQL 12 - 집합 연산자 (0) | 2021.11.12 |
SQL 10 - 서브 쿼리 : 단일 행 서브 쿼리 (0) | 2021.11.05 |
SQL 9 - 조인 : 자기 참조 조인(Self join)과 외부조인(Outer join) (0) | 2021.11.04 |
SQL 8 - 조인 : 등가 조인(Equi join)과 비등가 조인(Non Equi-join) (0) | 2021.11.01 |