착해지는 중 입니다.

[SQL] 단일행 ,다중행 서브쿼리/상호관련 서브쿼리 본문

카테고리 없음

[SQL] 단일행 ,다중행 서브쿼리/상호관련 서브쿼리

박쓸개 2024. 5. 8. 16:15

서브쿼리 사용 지침

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 단일 컬럼 서브쿼리_