select * from emp;
select * from dept;
select e.ename, d.dname, e.deptno
from emp e, dept d
where e.deptno(+)=d.deptno;
select e.ename, d.dname, e.deptno
from emp e left outer join dept d
on e.deptno=d.deptno;
/*
서브쿼리(Sub Query) : 서브 쿼리는 하나의 SELECT 문장의 절 안에 포함된 또 하나의 SELECT 문장
SQL 문장 = Query 문 = Query = 질의 = SELECT
서브 쿼리는 하나의 SELECT 문장의 절 안에 포함된 또 하나의 SELECT 문장.
그렇기에 서브 쿼리를 포함하고 있는 쿼리문을 메인 쿼리, 포함된 또 하나의 쿼리를 서브 쿼리라 함
서브 쿼리는 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호로 둘러쌓아야 함
서브 쿼리는 메인 쿼리가 실행되기 이전에 한번만 실행이 됨
서브쿼리를 써야되는 이유
* 조회하려는 대상을 알지 못할 때
* 조회하려는 대상이 너무 많을 떄
* 조회하려는 대상이 유동적일 때 사용함
출처: http://javannspring.tistory.com/42 [지경's 공부공간]
-- SCOTT의 부서명
-- 쿼리간 결합(중첩)
S1(S2)
하나의 테이블(쿼리S2)에서 검색한 결과를
다른 테이블(쿼리S1)에 전달하여 새로운 결과를 검색
S2가 서브쿼리(SQ)
*/
select (1 + 3) * 5 from dual;
-- 1. 실행결과(20)를 사용자에게 리턴
select deptno
from emp
where ename='SCOTT';
-- 2. 20을 주면 실행결과(RESEARCH)를 사용자에게 리턴
select dname
from dept
where deptno=20;
-----------------------------------------------------------------
-- 2. 서브쿼리(하위질의, 부질의))를 주면 실행결과(20)를 메인쿼리(상위질의, 주질의)에게 리턴
-- 메인커리가 최종 실행결과(RESEARCH)를 사용자에게 리턴
-- 서브쿼리는 메인쿼리가 필요한(참조) 값을 제공(리턴)
-- 서브쿼리 : 테이블을 결합하는 방식이 아닌 쿼리결합
select dname
from dept
where deptno = (select deptno
from emp
where ename='SCOTT');
-- 조인이 서브쿼리보다는 속도, 성능 우위...
-- 반드시 그렇다는 것은 아님 - 퍼포먼스
select ename, deptno
from emp
where deptno = (select deptno
from emp
where ename='SCOTT')
and ename <> 'SCOTT';
-- 조인방식
select e.ename, e.deptno
from emp e, emp m
where e.deptno='20' and m.ename='SCOTT' and e.ename <> m.ename;
-- SCOTT와 동일한 직급을 가진 사원을 출력하는 SQL 문을 작성
-- 서브쿼리
select *
from emp
where job = (select job
from emp
where ename='SCOTT');
-- SCOTT의 급여와 동일하거나 더 많이 받는 사원 명과 급여를 출력
-- 메인 쿼리 조건 컬럼과 서브쿼리의 선택 컬럼이 같아야 함
-- 서브쿼리
select ename, sal
from emp
where sal >= (select sal from emp where ename='SCOTT');
-- DALLAS에서 근무하는 사원의 이름, 부서 번호를 출력하시오.
select * from emp;
select * from dept;
select ename, deptno
from emp
where deptno=(select deptno
from dept
where loc='DALLAS');
select ename, deptno
from emp
where deptno=(select deptno
from dept
where loc= UPPER(:loc));
-- SALES(영업부) 부서에서 근무하는 모든 사원의 이름과 급여를 출력
select * from emp;
select * from dept;
select ename, sal
from emp
where deptno = (select deptno
from dept
where dname='SALES');
-- 소문자를 입력할 경우 대문자로 변환 시키는 함수 사용
select ename, sal
from emp
where deptno = (select deptno
from dept
where dname=UPPER(:loc));
----------------------------------------------------------
이정봉 샘이 정리 하신 내용
--SCOTT의 부서명
-- 쿼리간 결합(중첩)
/*
S1(S2)
하나의 테이블(쿼리S2)에서 검색한 결과를
다른 테이블(쿼리S1)에 전달하여 새로운 결과를 검색
S2가 서브쿼리(SQ)
*/
SELECT DNAME
FROM DEPT
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE ENAME='SCOTT');
SELECT (1 + 3) *5
from dual;
--1. 실행결과(20)를 사용자에게 리턴
SELECT DEPTNO
FROM EMP
WHERE ENAME='SCOTT';
--2. 20을 주면 실행결과(RESEARCH)를 사용자에게 리턴
SELECT DNAME
FROM DEPT
WHERE DEPTNO =20;
-----------------------------
--2. 서브쿼리(하위질의,부질의)을 주면 실행결과(RESEARCH)를 메인쿼리(상위질의,주질의))에게 리턴
-- 메인쿼리가 최종 실행결과(RESEARCH)를 사용자에게 리턴
-- 서브쿼리는 메인쿼리가 필요한(참조)값을 제공리턴
SELECT DNAME
FROM DEPT
WHERE DEPTNO =(SELECT DEPTNO
FROM EMP
WHERE ENAME='SCOTT');
-- 조인이 서브쿼리보다 속도,성능 우위
-- 내부조인 > 외부조인
SELECT ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = ( SELECT DEPTNO
FROM EMP
WHERE ENAME='SCOTT')
AND ENAME <> 'SCOTT';
SELECT e.ENAME, e.DEPTNO
FROM EMP e,EMP c
WHERE e.DEPTNO =c.DEPTNO
AND e.ENAME='SCOTT'
AND e.ENAME <>c.ENAME ;
-- 메인쿼리 조건컬럼과 서브쿼리 선택컬럼은 동일
SELECT ENAME, SAL
FROM EMP
WHERE SAL >=(SELECT SAL
FROM EMP
WHERE ENAME ='SCOTT');
SELECT ENAME, DEPTNO
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO
FROM DEPT
WHERE LOC = :loc);
--------------------------------------------------------
SELECT ENAME, SAL
FROM EMP
WHERE DEPTNO = (SELECT DEPTNO
FROM DEPT
WHERE DNAME='SALES');
SELECT EMPNO, ENAME , SAL, HIREDATE
,(SELECT D.DNAME FROM DEPT D WHERE D.DEPTNO = E.DEPTNO) DNAME
FROM EMP E
WHERE SAL >= 2000;
SELECT ENAME, SAL
FROM EMP
WHERE SAL >=(SELECT SAL
FROM EMP
WHERE ENAME ='SCOTT');
--------------------------------------
--서브쿼리 조인 변환
--메인쿼리 WHERE뒤의 DEPTNO는 조인조건컬럼으로 이동
--서브쿼리 테이블이 메인쿼리 FROM으로 이동
--서브쿼리 WHERE DNAME='SALES'행조건컬럼으로 이동
SELECT ENAME,SAL
FROM EMP
WHERE DEPTNO =(SELECT DEPTNO
FROM DEPT
WHERE DNAME='SALES');
SELECT E.ENAME,E.SAL
FROM EMP E , DEPT D
WHERE D.DEPTNO = E.DEPTNO
AND DNAME='SALES';
- ANSI 표준
SELECT E.ENAME,E.SAL
FROM EMP E INNER JOIN DEPT D
ON D.DEPTNO = E.DEPTNO
WHERE DNAME='SALES';
-- 6. 직속상관이 KING인 사원의 이름과 급여를 출력
select * from emp;
select * from dept;
-- ★★화면에 노출시킬 테이블 하나의 테이블에 있으면 서브쿼리
-- ★★여러개의 컬럼이 서로 다른 테이블로 나눠져 있으면 조인쿼리
-- 공통컬럼은 항상 같을수는 없음
SELECT ENAME, SAL
FROM EMP
WHERE MGR=(SELECT EMPNO
FROM EMP
WHERE ENAME='KING');
-- 사원테이블에서 최대급여금액와 최대급여를 받는 사원명을 출력
SELECT ENAME, SAL
FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP);
--평균 급여를 구하는 쿼리문을 서브 쿼리로 사용하여
--평균 급여보다 더 많은 급여를 받는 사원을 검색하는 문장은 다음과 같습니다.
SELECT ENAME, SAL
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP);
--WHERE 에는 그룹함수 X
SELECT ENAME, SAL
FROM EMP
WHERE SAL > AVG(SAL);
--다중 행 서브 쿼리
/*
다중 행 서브 쿼리는 서브 쿼리에서 반환되는 결과가
하나 이상의 행일 때 사용하는 서브 쿼리입니다.
다중 행 서브 쿼리는 반드시 다중 행 연산자(Multiple Row Operator)와
함께 사용해야 합니다.
결과가 2개 이상 구해지는 쿼리문을 서브 쿼리로
기술할 경우에는 다중 행 연산자와 함께 사용해야 합니다.
*/
/* 문제 ##########
주어진 문제가 3000 이상 받는 사원이 소속된
부서(10번, 20번)와 동일한부서에서 근무하는 사원이기에 서브쿼리의 결과 중에서
하나라도 일치하면 참인 결과를 구하는 IN 연산자와 함께 사용되어야 합니다.
*/
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (SELECT DISTINCT DEPTNO
FROM EMP
WHERE SAL>=3000);
--성능향상
--WHERE 뒤의 DEPTNO는 내부서브쿼리의 조인컬럼으로 이동
--메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참
--하나라도 참이면 비교연산 종료
--EXITS : 서브 쿼리의 WHERE절의 조건이 하나라도 참이면 실행종료
--하나라도 참이면 비교연산(부서번호가 존재한다면 참) 종료
--EXITS(값목록) X EXITS(서브쿼리) 0
--EXITS(서브쿼리 + 조인절)
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS (SELECT DISTINCT DEPTNO
FROM EMP
WHERE DEPTNO=e.DEPTNO
AND SAL>=3000);
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS (SELECT DISTINCT DEPTNO
FROM EMP
WHERE DEPTNO=30);
select * from emp;
select * from dept;
/* 30번 부서가 보이기 때문에 14개 행 출력
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS (SELECT DISTINCT DEPTNO
FROM EMP
WHERE DEPTNO=10
AND SAL>=3000);
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS (SELECT DISTINCT DEPTNO
FROM EMP
where SAL>=3000);
*/
/*
부서별로 가장 급여를 많이 받는 사원의 정보(사원 번호, 사원이름, 급여, 부서번호)를 출력
(IN 연산자 이용)
*/
select * from emp;
SELECT EMPNO, ENAME, SAL, DEPTNO --사원 번호, 사원이름, 급여, 부서번호
FROM EMP
WHERE SAL IN( SELECT MAX(SAL) --부서별로 가장 급여를 많이 받는 사원의 정보
FROM EMP
GROUP BY DEPTNO);
/*
직급(JOB)이 MANAGER인 사람의 속한 부서의 부서 번호와 부서명과 지역을 출력하시오.
*/
select * from emp;
select * from dept;
SELECT DEPTNO, DNAME,LOC
FROM DEPT
WHERE DEPTNO IN (SELECT DEPTNO
FROM EMP
WHERE JOB='MANAGER');
-- ALL 연산자
/*
찾아진 값에 대해서 AND 연산을 해서 모두 참이면 참이 되는 셈
> ALL 은 “모든 비교값 보다 크냐”고 묻는 것이 되므로
최대값보다 더 크면 참이 됩니다.
> ALL : 모든 값보다 크냐고 묻는 것이 되므로 최대값보다 더 크면 참
< ALL : 모든 값보다 작냐고 묻는 것이 되므로 최소값보다 더 작으면 참
> ANY : 임의의 비교값 보다 크냐 묻는 것이 되므로 최소값보다 더 크면 참
< ANY : 임의의 비교값 보다 작냐 묻는 것이 되므로 최대값보다 더 작으면 참
*/
/*
30번 소속 사원들 중에서 급여를 가장 많이 받는 사원보다
더 많은 급여를 받는 사람의 이름, 급여를 출력하는 쿼리문을 작성해 봅시다.
*/
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL
FROM EMP
WHERE DEPTNO =30);
/*
위의 서브 쿼리만 실행 시 아래 결과 출력
sal
=====
1600
1250
1250
2850
1500
950
*/
/*
전체 실행시
ENAME, SAL
========
jones, 2975
scott, 3000
ford, 3000
king, 5000
*/
/*
다음은 부서번호가 30번인 사원들의 급여 중
가장 작은 값(950)보다 많은 급여를 받는 사원의
이름, 급여를 출력하는 예제를 작성해 봅시다.
*/
-- 임의의 비교값 보다 크냐 묻는 것이 되므로 최소값 950보다 더 크면 참
-- ANY = SOME
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY(SELECT SAL
FROM EMP
WHERE DEPTNO =30);
/*
*/
/*
ANY 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상만 일치하면 참입니다.
ANY는 찾아진 값에 대해서 하나라도 크면 참이 되는 셈이 됩니다.
그러므로 찾아진 값 중에서 가장 작은 값 즉, 최소값 보다 크면 참이 됩니다.
*/
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY (SELECT SAL
FROM EMP
WHERE DEPTNO = 30);
SELECT * FROM EMP WHERE DEPTNO=30;
SELECT ENAME, SAL FROM EMP WHERE SAL > '950';
굵은 글자들은 서로 같은 값을 출력
/*
ENAME, SAL
===========
ADAMS 1100
MARTIN 1250
WARD 1250
MILLER 1300
TURNER 1500
ALLEN 1600
CLARK 2450
BLAKE 2850
JONES 2975
SCOTT 3000
FORD 3000
KING 5000
*/
SELECT * FROM emp;
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (
SELECT DISTINCT DEPTNO
FROM EMP
WHERE SAL>=3000);
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO='10';
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO='20';
/*
ENAME, SAL, DEPTNO
==============
SCOTT, 3000, 20
KING, 5000, 10
FORD, 3000, 20
*/
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (
SELECT DISTINCT DEPTNO
FROM EMP
WHERE SAL>=3000);
/*
전체(메인쿼리 + 서브쿼) 실행시
ENAME, SAL, DEPTNO
==============
FORD, 3000, 20
ADAMS, 1100, 20
SCOTT, 3000, 20
JONES, 2975, 20
SMITH, 800, 20
MILLER, 1300, 10
KING, 5000, 10
CLARK, 2450, 10
서브쿼리 실행시
DEPTNO
=====
20
10
*/
=============================== 다시정리
/*
Exists 와 IN 차이점
- EXISTS : 단지 해당 row가 존재하는지만 확인하고, 더 이상 수행되지 않는다.
- IN : 실제 존재하는 데이터들의 모든 값까지 확인한다.
*/
-- IN = AND
/*
위에서 보신바와 같이 서브쿼리의 결과값은 1800, 2200, 3000만원 이었습니다.
여기에 IN을 사용하게 되면 서브쿼리의 결과 값과 같은 값을 갖는 모든 데이터를 조회하게 됩니다.
같은 항목이 한개인 것만 조회를 할 경우에는 '='을 사용하고 여러개일 경우에는 'IN'을 사용하게 되는 것이죠.
*/
SELECT * FROM EMP ORDER BY DEPTNO;
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (
SELECT DISTINCT DEPTNO
FROM EMP
WHERE SAL>=3000);
/*
위의 코드와 아래 코드는 같은 결과이다.
메인쿼리에서 WHERE가 'DEPTNO' 이기 떄문에
서브쿼리에서 'SAL>=3000'에 해당하는 'DEPTNO'를 보여준 후
메인에 있는 WHERE 절의 'DEPTNO'를 실행한다.
즉 서브에서 3000이상인 값이
DEPTNO에서 10과 20에만 각각 들어가 있으므로
'10과 20을 몽땅 출력함
*/
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO=10 OR DEPTNO=20;
/*
ENAME, SAL, DEPTNO
===================
FORD 3000 20
ADAMS 1100 20
SCOTT 3000 20
JONES 2975 20
SMITH 800 20
MILLER 1300 10
KING 5000 10
CLARK 2450 10
*/
SELECT DISTINCT DEPTNO
FROM EMP
WHERE SAL>=3000;
/*
DEPTNO
=======
20
10
*/
SELECT *
FROM EMP
WHERE SAL>=3000;
/*
EMPNO, ENAME, JOB, MRG, HIREDATE, SAL, COMM, DEPTNO
======================================================
7788 SCOTT ANALYST 7566 82/12/09 3000 20
7839 KING PRESIDENT 81/11/17 5000 10
7902 FORD ANALYST 7566 81/12/03 3000 20
*/
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO='10';
/*
ENAME, SAL, DEPTNO
===================
CLARK 2450 10
KING 5000 10
MILLER 1300 10
*/
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO='20';
/*
ENAME, SAL, DEPTNO
===================
SMITH 800 20
JONES 2975 20
SCOTT 3000 20
ADAMS 1100 20
FORD 3000 20
*/
select ename, sal, deptno
from emp
where sal IN (select MIN(sal)
from emp
group by deptno);
-- 위의 쿼리문은 각 DEPTNO의 번호별로 최저 급여를 구하는 쿼리문
/*
ENAME, SAL, DEPTNO
===================
SMITH 800 20
JAMES 950 30
MILLER 1300 10
*/
SELECT MIN(sal)
FROM emp
GROUP BY deptno;
/*
MIN(SAL)
==============
950--------30번
800--------20번
1300-------10번
*/
SELECT * FROM EMP
ORDER BY DEPTNO;
/*
EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
======================================================
7782 CLARK MANAGER 7839 81/06/09 2450 10
7839 KING PRESIDENT 81/11/17 5000 10
7934 MILLER CLERK 7782 82/01/23 1300 10
7566 JONES MANAGER 7839 81/08/02 2975 20
7902 FORD ANALYST 7566 81/12/03 3000 20
7876 ADAMS CLERK 7788 83/01/12 1100 20
7369 SMITH CLERK 7902 80/12/17 800 20
7788 SCOTT ANALYST 7566 82/12/09 3000 20
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7900 JAMES CLERK 7698 81/12/03 950 30
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
*/
-- EXISTS : ① 존재하다 ② 있다 ③ 살다 ④ 나타나다
/*
EXISTS의 의미는 '존재하다' 입니다.
즉 WHERE문에서 존재하면 '참', 존재하지 않는다면 '거짓'이 되죠.
EXISTS의 부정은 NOT EXISTS 을 사용합니다.
NOT EXISTS을 사용하면 서브쿼리의 결과값이 존재하지 않는경우 출력을 하지 않고,
존재한다면 출력을 합니다.
*/
SELECT *
FROM EMP
WHERE EXISTS (
SELECT * FROM EMP);
-- 말그대로 exists의 서브쿼리에 데이타가 존재하면 그 값(조건)에 해당하는 테이블의 데이타를 출력하라는 뜻입니다.
복잡한 느낌을 간단하게 생각하면 될것 같습니다.이것도 참고 http://20140501.tistory.com/57
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS (SELECT DISTINCT DEPTNO
FROM EMP
WHERE DEPTNO=10 AND SAL>=3000);
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS ( SELECT DISTINCT DEPTNO
FROM EMP
WHERE DEPTNO=e.DEPTNO
AND SAL>=3000);
/*
아래 코드는 위와 같은 결과 출력
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS (SELECT DISTINCT DEPTNO FROM EMP where SAL>=3000);
*/
-- 메인쿼리
SELECT ENAME, SAL, DEPTNO
FROM EMP e
WHERE EXISTS DEPTNO=10 AND SAL>=3000;
/*
ENAME, SAL, DEPTNO
===================
KING, 5000, 10
*/
-- 서브쿼리
SELECT DISTINCT SAL, DEPTNO
FROM EMP
WHERE DEPTNO=10 AND SAL>=3000;
/*
DEPTNO, SAL
============
10, 5000
*/
SELECT SAL, DEPTNO
FROM EMP
WHERE DEPTNO=10 AND SAL>=3000;
SELECT DISTINCT * FROM EMP ORDER BY DEPTNO, SAL;
-- > ALL
--SALESMAN의 모든 값보다 큰 값. 즉 SALESMAN의 SAL 중 최대값인 1600이 조건이 된다.
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN')
ORDER BY SAL;
SELECT ENAME, SAL FROM EMP
WHERE SAL > 1600;
SELECT sal FROM emp WHERE JOB = 'SALESMAN';
-- > ALL
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL(SELECT SAL
FROM EMP
WHERE DEPTNO =30);
SELECT SAL FROM EMP WHERE DEPTNO = 30;
SELECT * FROM EMP WHERE DEPTNO = 30;
-- < ALL
--SALESMAN의 모든 값보다 작은 값, 즉 SALESMAN의 SAL 중 최소값인 1250이 조건이 된다.
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ALL (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN')
ORDER BY SAL;
SELECT ENAME, SAL FROM EMP
WHERE SAL < 1250;
SELECT sal FROM emp WHERE JOB = 'SALESMAN';
-- > ANY
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN');
select ename, sal from emp
where sal > 1250;
/*
ENAME, SAL
============
ALLEN 1600
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
FORD 3000
MILLER 1300
*/
select sal from emp where job = 'SALESMAN';
/*
SAL
====
1600
1250
1250
1500
*/
-- > ANY
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY (SELECT SAL
FROM EMP
WHERE DEPTNO = 30);
SELECT * FROM EMP WHERE DEPTNO=30;
SELECT ENAME, SAL FROM EMP WHERE SAL > '950';
/*
ENAME, SAL
===========
ADAMS 1100
MARTIN 1250
WARD 1250
MILLER 1300
TURNER 1500
ALLEN 1600
CLARK 2450
BLAKE 2850
JONES 2975
SCOTT 3000
FORD 3000
KING 5000
*/
=========여기서 부터 아래는 다른 예제 스크랩 및 설명 추가함=============
출처 - http://ttend.tistory.com/291
select * from emp order by deptno;
select ename, sal, deptno
from emp
where sal IN (select MIN(sal)
from emp
group by deptno);
/*
EMP 테이블의 DEPTNO 컬럼에서
- 10인 경우의 최소 값이 1300
- 20인 경우의 최소 값이 800
- 30인 경우의 최소 값이 950
*/
/*
전체(메인쿼리+서브쿼리) 실행시
ENAME, SAL, DEPTNO
===============
SMITH, 800, 20
JAMES, 950, 30
MILLER, 1300, 10
서브 쿼리 실행시
MIN(SAL)
=======
950
800
1300
*/
select * from emp order by deptno;
select ename, sal, deptno
from emp
where sal IN (select MAX(sal)
from emp
group by deptno);
/*
EMP 테이블의 DEPTNO 컬럼에서
- 10인 경우의 최대값이 5000
- 20인 경우의 최대값이 3000
- 30인 경우의 최대값이 2850
*/
/*
전체(메인쿼리+서브쿼리) 실행시
ENAME, SAL, DEPTNO
===============
BLAKE, 2850, 30
SCOTT, 3000, 20
KING, 5000, 10
FORD, 3000 20
서브 쿼리 실행시
MAX(SAL)
=======
2580
3000
5000
*/
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ANY (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN');
select ename, sal from emp
where sal > 1250;
/*
ENAME, SAL
============
ALLEN 1600
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
FORD 3000
MILLER 1300
*/
select sal from emp where job = 'SALESMAN';
/*
SAL
====
1600
1250
1250
1500
*/
-- > ALL : SALESMAN의 모든 값보다 큰 값. 즉 SALESMAN의 SAL 중 최대값인 1600이 조건이 된다.
SELECT ename, sal
FROM emp
WHERE sal > ALL (SELECT sal
FROM emp
WHERE JOB = 'SALESMAN')
ORDER BY sal;
SELECT ENAME, SAL FROM EMP
WHERE SAL > 1600;
SELECT sal FROM emp WHERE JOB = 'SALESMAN';
SALESMAN 의 SAL 값중 어느 값(ANY)보다 크기만 하면 된다.
즉 SALESMAN의 SAL 중 최소값인 1250보다 큰 경우가 조건이 된다
-- < ALL : SALESMAN의 모든 값보다 작은 값, 즉 SALESMAN의 SAL 중 최소값인 1250이 조건이 된다.
SELECT ENAME, SAL
FROM EMP
WHERE SAL < ALL (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN')
ORDER BY SAL;
SELECT ENAME, SAL FROM EMP
WHERE SAL < 1250;
SELECT sal FROM emp WHERE JOB = 'SALESMAN';
출처: http://ttend.tistory.com/291
'IT > 오라클' 카테고리의 다른 글
오라클 수업 7일째 (18.04.04) 테이블생성 (0) | 2018.04.04 |
---|---|
오라클 수업 7일째 (18.04.04) 서브쿼리 - 1 (0) | 2018.04.04 |
INNER JOIN OUTER JOIN의 차이가 무엇인가요? 그리고 LEFT JOIN, RIGHT JOIN, FULL JOIN은 또 무엇인가요? (0) | 2018.04.02 |
오라클 수업 5일째 (18.04.02) (0) | 2018.04.02 |
오라클 수업 4일째 (18.03.30) (0) | 2018.03.30 |