(오라클,sql기초강좌)서브쿼리에서 사용되는 any(some), all, exists 연산자 이론...

13
SQL 기기기기 ANY(SOME), ALL EXISTS, NOT EXISTS 탑탑탑탑탑 (http://www.topcredu.co.kr ), 탑탑탑

Upload: 3-2

Post on 07-Jan-2017

974 views

Category:

Education


7 download

TRANSCRIPT

Page 1: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

SQL 기초강좌ANY(SOME), ALL

EXISTS, NOT EXISTS

탑크리에듀 (http://www.topcredu.co.kr), 이종철

Page 2: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

실습코드 및 동영상보기는 다음 URL 에서 가능 합니다 .

http://ojc.asia

Page 3: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

ANY(SOME)

• 주로 서브 쿼리와 함께 사용되며 서브쿼리에서 여러 개의 값이 나오게 되는 경우 이 값들에 대해 어떤 한 값 보다만 어떻다라고 비교할 때 사용된다 .• WHERE sal > any (500, 600, 700) 와 같은 구문을 보면 sal >

500 or sal > 600 or sal > 700 형태로 해석되어 3 개의 값 중 하나의 값인 500 보다 크면 된다 (sal > 500), 만약 700 보다 크다면 모든 값보다 크게 된다 .• =, !=, >, <, <=, >= 연산자 앞에 나타나며 이어서 여러값을 가진 리스트나 서브쿼리가 오게된다 .

Page 4: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

ALL

• ALL 은 집합의 모든 값과 비교를 하게 되는데 , 모든 값과 비교하여 TRUE 가 되어야 한다 .

• 예를 들어 급여가 500, 600, 700 모두 보다 큰 값을 원한다면 ALL을 사용하면 되는데 sal > all(500, 600, 700) 형태가 되고 이것은 sal > 500 and sal > 600 and sal > 700 의 의미로 결국 sal > 700 와 같다 .

• =, !=, >, <, <=, >= 연산자 앞에 나타나며 이어서 여러값을 가진 리스트나 서브쿼리가 오게된다 .

Page 5: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

ANY(SOME), ALL 예문 - 1-- 먼저 30 번 부서 사원들의 급여를 확인해 보자 .( 가장 작은 값이 950, 큰 값은 2850 이다 )SELECT sal FROM emp WHERE deptno=30;  1600 …… 2850 …… 950

-- 어떠한 하나의 값만 만족시키면 되므로 sal > 950 과 같은 결과이다 . any 대신 some 을 사용해도 된다 .SELECT ename, sal FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE deptno = 30);ADAMS 1100……KING 5000

Page 6: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

ANY(SOME), ALL 예문 - 2

-- 전부를 만족시키기 위해서는 30번부서의 최고 급여인 2850 보가 커야 한다 . 즉 sal > 2850 의 의미SELECT ename, sal FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);

-- 좌측 ALL 을 이용한 쿼리를 ANY 로 변환하면 다음과 같다 . WHERE NOT (sal <= 2850) 형태가 되어 결국 sal > 2850 이 된다 .SELECT ename, salFROM emp e1WHERE NOT (sal <= ANY (SELECT sal FROM emp WHERE deptno = 30));

Page 7: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

ANY(SOME), ALL 예문 - 3-- ALL 구문을 ANY 를 사용하지 않고 NOT EXISTS 로 변환하면 다음과 같다 . 사원을 출력하는데 급여가 30 번 부서원들의 급여보다 작거나 같은 것이 존재하지 않는 것을 추출 , 즉 30 번 부사원들의 모든 급여보다 큰 급여를 가진 사원을 추출SELECT ename, salFROM emp e1WHERE NOT EXISTS (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 30 AND e1.sal <= e2.sal);

Page 8: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

EXISTS, NOT EXISTS

• EXISTS : 서브 쿼리가 적어도 하나의 행을 돌려주면 TRUE 가 된다 . 즉 존재하기만 하면 TRUE.• NOT EXISTS : 서브 쿼리가 적어도 하나의 행을 돌려주지 않으면

TRUE 가 된다 . 존재하지 않으면 TRUE.

Page 9: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

EXISTS, NOT EXISTS 예문 - 1-- 부서테이블 (DEPT) 에서 사원을 한명이라도 가지고 있는 부서출력 . 40 번 부서는 EMP테이블에서 부서원들이 한명도 없다 .SELECT dname as " 부서명 ", deptno as " 부서코드 "FROM dept WHERE EXISTS ( SELECT * FROM emp WHERE dept.deptno = emp.deptno);ACCOUNTING 10RESEARCH 20SALES 30

Page 10: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

EXISTS, NOT EXISTS 예문 - 2

-- 앞 쿼리 구문을 IN 연산자를 이용하면 다음과 같다 . (IN 은 OR 로 해석된다 .) 대부분 IN 을 이용하는 것보다 EXISTS 를 사용하는 것이 쿼리 성능면에서 장점을 가진다 .SELECT dname as " 부서명 ", deptno as " 부서코드 "FROM dept WHERE deptno IN ( SELECT deptno FROM emp WHERE deptno is not null);

Page 11: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

EXISTS, NOT EXISTS 예문 - 3

-- 사원테이블 (MYEMP1), 수강테이블 (MYSUGANG1) 테이블에서 한과목 이상 수강한 사원의 수는 SELECT COUNT(empno) FROM myemp1 E WHERE EXISTS ( SELECT 1 FROM mysugang1 S WHERE e.empno = s.empno )

Page 12: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

EXISTS, NOT EXISTS 예문 - 4

-- 강좌테이블 (MYLECTURE1) 에서 수강생이 한명도 없는 과목이름을 출력하세요 . SELECT lecture_nm FROM mylecture1 l WHERE NOT EXISTS ( SELECT 1 FROM mysugang1 s WHERE l.lecture_id = s.lec-ture_id );

Page 13: (오라클,SQL기초강좌)서브쿼리에서 사용되는 Any(SOME), ALL, EXISTS 연산자 이론 및 실습예문_오라클강좌,SQL,PLSQL강좌,SQL튜닝강좌전문(탑크리에듀)

This practice makes Expert!PL/SQL 단기속성 (1일완성 )SQL 힌트 / 튜닝 (단기 2일교육 )SQL기초과정