ORACLE [oracle] sub-query 서브쿼리

2020.05.03 00:33

졸리운_곰 조회 수:1625

[oracle] sub-query 서브쿼리

서브쿼리

 


 

 

하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 경우 사용하는 서브쿼리

SQL 문장의 하부 절에 쿼리문을 사용 즉, 메인쿼리의 SELECT문 하부의 WHERE절이나 FROM절에서 사용되는 쿼리를 서브쿼리라고 한다

 

주의사항 연산자의 오른쪽에 위치 해야하며 괄호로 묶어주어야 한다

 

 

 

 

 

 

 

서브쿼리의 위치에 따른 명칭

● SELECT 문에 있는 서브쿼리 : 스칼라 서브쿼리

● FROM절에 있는 서브쿼리 : 인라인 뷰

● WHERE절에 있는 서브쿼리 : 서브쿼리

메인쿼리 서브쿼리

※ 수정 : SELECT DEPNO => DEPTNO

 

 

1
SELECT DNAME FROM DEPT WHERE DEPTNO = 20;
cs

 

 

 

 

1
2
SELECT DNAME FROM DEPT WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME='SCOTT');
 
cs

 

EMP 테이블에는 부서번호만 있지, 부서명은 없다, 부서명은 DEPT에 있다.

 

 

 

● 서브쿼리는 하나의 SELECT 문장의 절 안에 포함 된 또 하나의 SELECT 문장이다.

그렇기에 서브쿼리를 포함하고 있는 쿼리문을 메인 쿼리, 포함 된 또 하나의 쿼리를 서브쿼리라 한다.

 

● 서브쿼리는 비교 연산자의 오른쪽에 기술 해야 하고 반드시 괄호로 둘러 쌓아야 한다.

● 서브쿼리는 메인쿼리가 실행되기 이전에 한 번만 실행이 된다.

서브쿼리문을 먼저 실행하고, 메인쿼리가 실행하게 된다.

 


 

 

단일행 서브쿼리

 

 하나의 로우만을 반환되는 서브 쿼리의 결과를 메인 쿼리에 보내지게 되는데 메인 쿼리의 WHERE 절에서는 단일행 비교 연산자인 =,>,>=,<.<=,<>를 사용한다.

즉, 서브쿼리의 결과 1개의 값만 나오고 이 값을 메인쿼리로 전달 하는 것

 

● 단일행 서브쿼리에서는 단일행 비교 연산자인 =, <>, <, >등의 연산자를 사용 할 수 있다

 

 

예제) 

● DALLAS에서 근무하는 사원의 이름, 부서 번호를 출력 해보자.

사원의 이름과 부서 번호는 EMP 테이블에서 가지고 올 수 있으며 근무지 DALLAS는 DEPT 테이블에 있다.

 

1
SELECT ename, deptno  from emp where deptno = (select deptno from dept where loc='DALLAS');
cs

 

 

● SALES(영업) 부서에 근무하는 모든 사원의 이름과 급여를 출력 해보자.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

마찬가지로 사원의 이름과 급여는 EMP 테이블에서 가지고 올 수 있으며 영업부는 DEPT 테이블에서 확인 할 수 있다.

 

1
select ename, sal from emp where deptno = (select deptno from dept where dname='SALES')

cs

 

 

● 직속 상관이 KING인 사원의 이름과 급여를 출력 해보자

1
select ename , sal from emp where mgr = (select empno from emp where ename = 'KING');
cs

 

 

 

다중행 서브쿼리

서브쿼리에서 반환 되는 결과가 하나 이상의 행일 때 사용하는 서브쿼리

결과가 2개 이상 구해지는 쿼리문을 서브쿼리로 기술 할 경우에는 다중행 연산자와 함께 사용

 

다중행 서브쿼리에서 사용 할 수 있는 다중행 비교 연산자

● IN : 같은 값을 찾음

● >ANY : 최소값을 반환

● <ALL : 최소값을 반환

● <ANY : 최대값을 반환

● >ALL : 최대값을 반환

● EXIST : 서브쿼리 값이 있을 경우 반환

 

IN 연산자는 단일행 비교 연산자 " = "과 비슷한 용도로 사용한다.

서브쿼리의 반환이 1행 이상일 때 그 행들의 값을 넘겨준다.

 

 

----------------------------------------------------------보류---

● 10번 부서에 근무하는 사원의 이름과 10번 부서의 부서명을 출력 해보자

 

다중행 서브쿼리, ( )의 서브 쿼리 결과를 d라고 부른다.

그 후 JOIN이 들어간다

1
2
3
select e.ename , d.dname from emp e,
(select deptno, dname from dept where deptno = 10) d
where e.deptno = d.deptno;
cs

 

JOIN만을 통해서 구할 수도 있다.

1
2
select e.ename, d.dname from emp e, dept d
where e.deptno = d.deptno and d.deptno = 10;
cs

 

-------------------------------------------------------------------

 

 

예제)

● 부서별로 가장 급여를 많이 받는 사원의정보(사원 번호, 사원 이름, 급여, 부서번호)를 출력 해보자

 

1
2
3
4
5
6
7
8
9
SQL> SELECT deptno, ename, sal FROM emp
  2  WHERE sal IN (SELECT max(sal) FROM emp group by deptno);
 
    DEPTNO ENAME             SAL
---------- ---------- ----------
        30 BLAKE            2850
        20 SCOTT            3000
        10 KING             5000
        20 FORD             3000
cs

 

 

 

● 직급(JOB)이 MANAGER인 사람의 속한 부서의 부서 번호와 부서명과 지역을 출력 해보자

1
2
3
4
5
6
7
8
SQL> SELECT deptno, dname, loc FROM dept
  2  WHERE deptno IN(SELECT deptno FROM emp WHERE job='MANAGER' );
 
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
cs

 

● >ANY 예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> SELECT ename, sal FROM emp
  2  WHERE sal >ANY(SELECT sal FROM emp WHERE job='SALESMAN');
 
ENAME             SAL
---------- ----------
KING             5000
FORD             3000
SCOTT            3000
JONES            2975
BLAKE            2850
CLARK            2450
ALLEN            1600
TURNER           1500
MILLER           1300
cs

 

서브 쿼리를 보자, SELECT sal FROM emp WHERE job='SALESMAN'

SALESMAN을 기준으로 월급(sal)의! 최소값(>ANY)을 조건(WHERER)로 하였다

 

1
2
3
4
5
6
7
8
SQL> SELECT ename, sal FROM emp WHERE job='SALESMAN';
 
ENAME             SAL
---------- ----------
ALLEN            1600
WARD             1250
MARTIN           1250
TURNER           1500
cs

그렇다면 SALESMAN의 최소값을 확인 해보자

1250이다.

그렇기에 1250을 최소값으로 반환 하여

1250보다 높은 SAL들이 나온 것을 확인 할 수 있다

 

[출처] https://samdo0812.tistory.com/66

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86755
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 79070
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95833
46 [데이터분석 & 데이터 사이언스] 수많은 데이터 사이언티스트들이 직장을 떠나는 이유는 무엇인가? file 졸리운_곰 2025.03.09 907
45 [데이터분석][파이썬][python] 한글 글꼴 사용 (matplotlib) 졸리운_곰 2024.04.18 1360
44 [데이터분석 & 데이터 사이언스] 데이터에 관한 꼭 알아야 할 오해와 진실 12가지 졸리운_곰 2024.01.17 1317
43 [데이터분석][파이썬][python] Awesome Dash Awesome file 졸리운_곰 2021.07.10 2344
42 [데이터분석][파이썬][python] ???? Introducing Dash ???? file 졸리운_곰 2021.07.10 1609
41 [dataset] (한글) 욕설 감지 데이터셋 file 졸리운_곰 2021.05.12 1560
40 [데이터분석][python] Dash를 사용하는 초보자 및 기타 모든 사용자를위한 Python의 대시 보드 file 졸리운_곰 2021.04.14 1764
39 [데이터분석][python] Dash를 사용하는 초보자 및 기타 모든 사용자를위한 Python의 대시 보드 file 졸리운_곰 2021.04.14 1605
38 [데이터분석][데이터 사이언스][python][Dash] Python, Dash 및 Plotly를 사용하여 COVID-19 사례 데이터 시각화 file 졸리운_곰 2021.03.28 1503
37 [데이터분석][머신러닝] When not to use machine learning or AI Adventures in wishful thinking, nonstationarity, and pattern-finding / 기계 학습 또는 AI를 사용하지 않아야하는 경우 희망찬 사고, 비정상 성, 패턴 찾기의 모험 file 졸리운_곰 2021.03.28 21624
36 [MSA][머신러닝] 쿠버네티스 기반의 End2End 머신러닝 플랫폼 Kubeflow #1 - 소개 file 졸리운_곰 2021.03.21 1138
35 [데이터사이언스] 데이터 과학자를위한 3 가지 훌륭한 디자인 패턴, 3 Great Design Patterns for Data Scientists file 졸리운_곰 2021.03.04 782
34 [데이터분석] 시계열 데이터에 AI를 사용하는 이유는 무엇입니까? file 졸리운_곰 2021.02.28 1194
33 [데이터분석] AI 예측 및 이상 탐지를위한 시계열 데이터 전처리 file 졸리운_곰 2021.02.28 1034
32 [데이터분석] bitcoin analysis 비트 코인 시계열 데이터에 대한 AI 이상 탐지 file 졸리운_곰 2021.02.27 1600
31 [데이터분석 & 데이터 사이언스] How To Create a Data Science Portfolio Website file 졸리운_곰 2021.02.14 1829
30 [데이터수집4] 오픈 API 데이터 수집 (소셜미디어 데이터 수집) file 졸리운_곰 2020.06.12 1954
29 [데이터수집3] 관계형 데이터베이스 데이터 수집 file 졸리운_곰 2020.06.12 1320
28 [데이터수집2] 분산시스템 로그 수집 (빅데이터 수집) file 졸리운_곰 2020.06.12 1496
27 [데이터수집1] 웹 크롤링, 웹 스크래핑 file 졸리운_곰 2020.06.12 1806
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED