[SQL] 단일행 ,다중행 서브쿼리/상호관련 서브쿼리
서브쿼리 사용 지침
1. 서브쿼리는 반드시 괄호로 묶음
2. 조건식에서는 가독성을 위해 비교 조건의 오른쪽에 배치
3. 서브쿼리의 결과 건수에 따라 단일행 비교 연산자와 다중행 비교 연산자 알맞게 사용
##단일행 서브쿼리
한 행만 반환
조건식에서 단일행 비교 연산자 사용
다중행 비교 연산자 사용해도 무관
##다중행 서브쿼리
두 행 이상 반환
조건식에서 다중행 비교 연산자 사용
--bel 사원보다 급여를 많이 받는 사원은 누구인가?
SELECT SALARY
FROM EMPLOYEES WHERE LAST_NAME = 'Abel';
SELECT LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > (SELECT SALARY
FROM EMPLOYEES WHERE LAST_NAME = 'Abel');--여러개를 반환함으로 다중행 서브쿼리
--
IN연산자
주어진 목록 안에 포함된 값 중 하나와 일치하는지를 확인하는 데 사용
--다중행IN
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
FROM employees
GROUP BY department_id);--각 부서에서 최소 급여를 받는 직원들의 정보
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (6900, 2500, 7000, 17000, 6000,
10000, 8300, 2100, 6100, 6500,
4200, 4400); --주어진 값 중 하나와 일치하는 직원들의 정보
--
ANY연산자
서브쿼리의 결과값 모두에 대해서 메인 쿼리 값을 비교
단일행 비교 연산자를 먼저 기술, OR 사용
ex) < ANY, > ANY 처럼, <OR, >OR
--x----X----X-----
< ANY 서브쿼리 결과값이 최댓값보다 작으면 만족
> ANY 서브쿼리 결과값이 최소값보다 크면 만족
= ANY IN 연산자와 동일
--
ALL연산자
서브쿼리의 결과값 모두에 대해서 메인 쿼리 값을 비교
단일 행 비교 연산자를 먼저 기술, AND 사용
###서브쿼리와 그룹함수
###서브쿼리와 NULL
1. 단일행 서브쿼리 결과가NULL
2.다중행 서브쿼리 결과 중일부가 NULL
SELECT *
FROM EMPLOYEES
--WHERE EMPLOYEE_ID IN (100,200,NULL,NULL,101;
WHERE EMPLOYEE_ID = 100 OR EMPLOYEE_ID = 200 OR EMPLOYEE_ID = NULL;
--1)EMPLOYEE_ID가 서브쿼리 결과 중 NULL 아닌 값 중에 하나일 경우 : TRUE
--2)EMPLOYEE_ID가 서브쿼리 결과와 일치하지 않는경우 : NULL
--3)EMPLOYEE_ID가 NULL 인경우:NULL
-------
## 상호관련 서브쿼리
중첩 서브쿼리
상호관련 서브쿼리 (JOIN과 유사하다)
서브쿼리가 메인 쿼리의 후보행의 컬럼을 참조
• 서브쿼리의 WHERE 절에 메인 테이블과 서브 테이블 간 조인 조건 기술
• 메인 쿼리의 각 행에 대해 서브쿼리가 매번 실행됨
중첩 서브쿼리,상호관련 서브쿼리 차이 또는 구별
서브쿼리의 WHERE 절에 메인 테이블과 서브 테이블 간의 조인 조건
여부 있으면 상호관련 서브쿼리 없으면 중첩 서브쿼리
--메인 테이블과 서브 테이블이 같은경우
SELECT last_name, salary, department_id
FROM employees outer
WHERE salary > (SELECT AVG(salary)
FROM employees inner
WHERE inner.department_id
= outer.department_id);
--예제: 두 번 이상 직무가 바뀐 사원의 세부 정보를 보고하세요.
SELECT LAST_NAME
FROM EMPLOYEES E
WHERE 2<=(SELECT COUNT(*)
FROM JOB_HISTORY
WHERE employee_id = E.EMPLOYEE_ID)
----
EXISTS연산자 - 조건을 만족하는 경우가 많아야 성능향상..?
메인 쿼리의 후보행을 기반으로 서브쿼리를 수행하고 해당 서브쿼리의 결과가 존재하면 TRUE를 그렇지 않으면 FALSE를 반환하는연산자
서브쿼리의 조인 조건식을 만족하는 서브테이블의 행이 존재하는지판단 / 상호관련 서브쿼리가 필요(단항 연산자)
❓단항연산자가 모드라..
--
서브쿼리 결과가 한 건 존재하자마자 서브쿼리에 대한 SELECT 종료, 즉 서브쿼리를 빠져나옴
• TRUE 리턴
서브테이블 행의 일부만 검색 ➔ 성능 향상
--
서브쿼리 결과가 존재하지 않을 경우 서브테이블의 모든 행이 서브쿼리의 조인 조건을 만족하지
않았다는 의미 즉, 서브테이블의 모든 행을 검색
• FALSE 리턴
--
• EXISTS는 서브쿼리의 행의 존재 여부에만 관심이 있음
• 즉, select list는행의값보다는행을나타낼수있는placeholder로써의역할
• 1, ‘x’ 등과 같이 간단한 리터럴 사용
--
###서브쿼리 유형
1) 단일행 서브쿼리 VS 다중행 서브쿼리
2) 단일 컬럼 서브쿼리 VS 다중 컬럼 서브쿼리
3) 인라인 뷰 (INLINVE VIEW)
4) 스칼라 서브쿼리(SCALAR SUBQUERY)
결과가 하나의 행이면서 하나의 컬럼인 서브쿼리(단일 행 AND 단일 컬럼 서브쿼리_