SQL

ORACLE | 서브쿼리 1탄 - SINGLE / MULTI ROW SUBQUERY & EXISTS

euni_joa 2018. 4. 6. 19:26
반응형



안녕하세요!


오늘은 위의 사진과 같이 쿼리 안의 쿼리, 서브쿼리에 대해 알아보겠습니다



서브쿼리란?


간단히 말해 쿼리안에 쿼리가 존재하는 것으로


하나의 SQL문 안에 SELECT문이 중첩되는 것을 의미합니다.


< 서브쿼리의 구조 >



< 서브쿼리의 종류 >


   

     1. Single row subquery


     2. Multiple row subquery


     3. Multiple column subquery


     4. Exists

 




Single row subquery 와 Multiple row subquery 비교하기!


우선! 두 서브쿼리문은 다른 연산자를 이용합니다


 

     ① Single row subquery 연산자


               =, <>, !=, >, <, >=, <=


     ② Multiple row subquery 연산자


               in, not in, >all, <all, >any, <any




<예제를 위해 사용할 테이블>


[ 고객 테이블 ]


고객이름

 나이

  주소

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B



[ 부서 테이블 ]


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D




예제1. 한국 A에서 담당하는 있는 주소에 사는 고객의 이름과 총구매액과 주소를 알고싶어요!





[ 결과 ]


 고객이름

총구매액 

주소 

 A

 30000

 서울

 B

 10000

 서울



TIP! 서브쿼리부분을 먼저 작성합니다.


1. 한국 A에서 담당하는 주소를 선택하고


2. 그 주소 data와 같은 값을 갖는 고객이름, 총구매액, 주소를 찾습니다.  



예제2. 추천인이 아닌 사람들의 이름과 나이를 알고 싶습니다.





[ 결과 ]


고객이름 

 나이

 A

 24

 B

 29



주의!


서브쿼리에서 NOT IN을 사용할 때 서브쿼리의 NULL처리를 해주어야 합니다.


NOT IN != ALL 과 같은 의미입니다.



논리 연산자 AND의 속성에 따라


TRUE AND NULL의 값은 NULL로 인식합니다.


따라서

비교하고 싶은 서브쿼리의 결과값에 NULL이 존재한다면

전부 NULL로 바꾸어 인식하게 됩니다.



예제1과 예제2의 차이점을 눈치 채셨나요?


서브쿼리와 비교하는 메인절에서 등호(=)를 사용하거나 IN을 사용했습니다.


그 이유는

서브쿼리의 결과 갯수가 다르기 때문입니다.


(참고)

비교하고자 하는 값이 1개일때 등호(=),

비교하고자 하는 값이 2개 이상일 때 IN을 비교연산자로 사용합니다.



예제3. 추천한 사람이 있는 고객을 알고싶습니다.


 

      SQL> SELECT c.고객이름

                        FROM 고객 c

                        WHERE EXISTS ( SELECT 'x' FROM 고객 r

                                                        WHERE c.추천인 = r.고객이름)



결과는 추천인 column에 null값을 가진 A고객을 제외한

B, C, D고객이 모두 출력됩니다!


(참고)

'x'자리에는 어떠한 문자를 넣어도 관계없습니다.



분량조절 실패로..


다음 포스팅에서 2탄 서브쿼리 Multi Column Subquery편으로 다루도록 하겠습니다!

반응형