안녕하세요 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 연산자 예시>
>> 서브 쿼리의 결과 중에서 하나라도 일치하면 참이 됩니다.
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장 서브 쿼리에 대한 설명을 마치겠습니다.
감사합니다.
'주니어 기초 코딩공부 > Database 기초' 카테고리의 다른 글
10장 DML 데이터 조작어 설명 및 개념 타파! (오라클_INSERT, UPDATE, DELETE, MERGE, 트랜잭션) (0) | 2022.12.16 |
---|---|
09장 DDL_데이터 정의어 설명 및 정리 (오라클) (0) | 2022.12.15 |
07장 ANSI CROSS JOIN VS ORACLE CROSS JOIN 비교 (ANSI Natural Join) (1) | 2022.12.14 |
06장 SQL JOIN (오라클-Cross Join, Equi Join, Non-Equi Join, Self Join) (0) | 2022.12.14 |
06장 SQL 그룹쿼리와 집합연산자 (오라클) (0) | 2022.12.14 |