주니어 기초 코딩공부/Database 기초

08장 서브쿼리_스칼라 서브쿼리, 인라인뷰 서브쿼리, 중첩서브쿼리 (오라클)

jju_developer 2022. 12. 15. 20:33
728x90

안녕하세요 jju_developer입니다.

 

오늘은 서브 쿼리 (오라클)에 대해 소개하는 시간을 갖겠습니다.

 

✔서브 쿼리란?

서브 쿼리란?

설명~!

예시 서브 쿼리)

SCOTT과 같은 이름의 부서 넘버를 선택하고 그게 같은 부서 넘버인 부서 이름을 가져와라!

라고 작성한 겁니다. SCOTT의 부서 넘버는 20이고 이 20의 부서 이름이 RESEARCH입니다~!

 

이 방법을 오라클의 JOIN으로 똑같이 작성해보겠습니다.

예시 오라클 조인)

이렇게 두 개가 방식은 다르지만 검색은 동일하게 됩니다.

 

 

✔단일행 서브 쿼리란?

 단일 행(Single Row) 서브 쿼리는 수행 결과가 오직 하나의 로우(행, row)만을 반환하는 서브 쿼리를 갖는 것.
 단일 행 서브 쿼리문에서는 이렇게 오직 하나의 로우(행, row)로 반환되는 서브 쿼리의 결과는 메인 쿼리에 보내게 되는데 메인 쿼리의 WHERE 절에서는 단일 행 비교 연산자인 =, >, >=, <, <=, <>를 사용해야 합니다.

단일 서브 쿼리의 결과는 비교 연산자를 통해서 연산을 할 수 있습니다.

 

 

✔다중행 서브 쿼리란?

 다중 행 서브 쿼리는 서브 쿼리에서 반환되는 결과가 하나 이상의 행일 때 사용하는 서브 쿼리이다. 다중 행 서브 쿼리는 반드시 다중 행 연산자(Multiple Row Operator)와 함께 사용해야 합니다.

비교 연산자 불가!!!

 

     
1 IN 메인 쿼리의 비교 조건에서 
서브 쿼리의 출력 결과와 하나라도 일치하면 메인 쿼리의 WHERE절이 참이 되는 연산자이다.
2 ANY, 
SOME
 ALL 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참이다.

 ANY 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상만 일치하면 참이다.
3 ALL  ANY 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상만 일치하면 참이다.
4 EXIST  서브쿼리에 결과 값이 하나 이상 존재하면 조건식이 모두 true, 존재하지 않으면 모두 false가 되는 연산자이다.

<IN 연산자 예시>

>> 서브 쿼리의 결과 중에서 하나라도 일치하면 참이 됩니다.

부서 번호가 20이나 10인 부서원들의 정보를 보여주게 됩니다.

10,20 둘 중 하나라도 일치하면 10 부서, 20 부서 두 가지가 나오게 되는 겁니다.


<ALL 연산자 예시>

셀러리가 아래 나와있는 값 보다 모두 커야 합니다. 아래 큰 값은 2850이며, 이 2850보다 큰 수여야 합니다.

부서의 30의 모든 사람보다 더 많이 받는 모든 직원을 비교하여 찾아내는 겁니다.


<ANY 연산자 예시>

이 중 하나 이상만 일치하면 참이니까 

WHERE SAL > ANY(조건);

에서 이 950의 조건 하나 이상인 값들을 불러오게 됩니다.


<EXISTS 연산자 예시>

ECISTS (조건); 안에 조건이 참이면 

SELECT * FROM EMP 한 내용이 검색됩니다.

 

 


[확인 문제]

2. IN연산자를 이용하여 부서별로 가장 많은 급여를 받는 사원의 정보(사원번호, 사원명, 급여, 부서 번호)를 출력하는 SQL문을 작성하세요?

[테이블]

 

[정답]

[설명]

SELECT  EMPNO 사원번호, ENAME 사원명, SAL 급여, DEPTNO 부서 번호
FROM EMP
WHERE SAL IN(SELECT MAX(SAL) FROM EMP
GROUP BY DEPTNO);

만약 이거를 위에 것처럼 찾게 된다면, 우연의 일치로 맞아떨어질 순 있지만

오답

2850은 30의 MAX 값이라서 출력이 되었지만 20 부서의 최대 급여는 3000이므로,

위의 답은 틀린 것입니다.

 

두 개를 비교할 때에는

 

서브쿼리, 두개의 테이블 조회

이렇게 부서 번호와 급여를 두 개를 비교하여 MAX를 찾아내야 합니다.

 


[정리]

조건 + 조건을 만족해야 할 때

 

SELECT문 : 쿼리 일 때

 

메인 쿼리 + SELECT 서브 쿼리

 

이때 서브 쿼리란?

하나의 쿼리 내에 포함된 또 하나의 쿼리이며  반드시 괄호 안에 있어야 합니다.

INSERT, UPDATE, DELETE 문에도 사용 가능하며 ;를 붙이지 않아도 됩니다.

 

no 서브쿼리 이름 특징
1 SELECT절 스칼라 서브쿼리 1. 반드시 결과 값이 하나여야 합니다.

SELECT [컬럼 이름], 
(SELECT [컬럼이름]
    FROM [테이블이름]
    WHERE 조건식)
FROM [테이블 이름]
WHERE 조건식;

2 FROM절 인라인 뷰 서브쿼리 1. 반드시 결과 값이 하나여야 합니다.

2. 반드시 별명을 가져야 합니다.

SELECT [컬럼이름]
FROM (SELECT [컬럼 이름]
       FROM [테이블 이름]
       WHERE 조건식) AS [테이블 별명]
WHERE 조건식;


3 WHERE절 중첩 서브쿼리 1. 반드시 결과 값이 하나여야 합니다. (EXISTS 제외)

2. 하나의 컬럼에는 여러개의 값이 존재 할 수 있습니다.

3. 연산자와 함께 사용 합니다.

4. 비교 연산자만 사용 시, WHERE절의 서브쿼리는 반드시 결과값이 하나의 값입니다.

SELECT [컬럼이름]
FROM [테이블 이름]
WHERE [컬럼이름] [ 연산자 >,=] (SELECT[컬럼이름]
                                                       FROM [테이블 이름]
                                                        WHERE 조건식);

 

서브쿼리에 사용하는 연산자
no 연산자 설명
1 IN *WHERE 테이블명 IN (SELECT 서브쿼리---FROM 테이블);

* ✔ IN([서브쿼리]) : 가 [서브쿼리]의 결과값 내에 있다
2 ALL * ✔ < ALL ([서브쿼리]) : 가 모든 [서브쿼리]의 결과값 보다 작다
* ✔ > ALL ([서브쿼리]) : 가 모든 [서브쿼리]의 결과값 보다 크다
3 ANY * ✔ < ANY ([서브쿼리]) : 가 모든 [서브쿼리]의 결과값 보다 하나라도 작은값 가져와
* ✔ > ANY ([서브쿼리]) : 가 모든 [서브쿼리]의 결과값 보다 하나라도 큰값 가져와
4 EXISTS * EXISTS ([서브쿼리]) : [서브쿼리] 의 결과 값 존재한다면 검색함

 

 

 

 

그럼 08장 서브 쿼리에 대한 설명을 마치겠습니다.

 

감사합니다.

 

728x90