티스토리 뷰
중첩 서브쿼리란?
-기본 select-from-where로 구성되는 질의 안에 서브쿼리를 넣어서 좀더 다양하게 값을 구할 수 있는 문법입니다.
즉, 하나의 SQL문 안에 또 다른 SQL문이 포함되어 구성되어있으며, 주로 where절이나 from절 둘다 중첩 서브질의를넣어 구현을 할 수 있습니다.
동작방식에 따른 서브쿼리 분류
- 비연관 서브쿼리
-외부 쿼리에 의존하지 않고 독립적으로 실행될 수 있는 서브쿼리 입니다. 외부 쿼리와 내부쿼리는 서로 연관성이 없으며, 한번만 실행되며 내부쿼리의 결과를 외부 쿼리가 사용할 수 있습니다.
SELECT name
FROM students
WHERE student_id IN (SELECT student_id FROM honors_students);
- 연관 서브쿼리
-외부쿼리에 의존하며 실행되는 서브쿼리이며, 메인쿼리가 먼저 실행되고, 그에 맞춰 연관 서브쿼리가 여러번 실행됩니다.
SELECT name
FROM students s1
WHERE 3 > (SELECT COUNT(*)
FROM scores s2
WHERE s1.student_id = s2.student_id);
반환 데이터 형식에 따른 서브쿼리 분류
- 단일 행 서브쿼리 (Single Row)
-실행 결과가 항상 1개의 행인 단일 행을 반환하는 서브쿼리입니다.
레코드는 여러개가 나올 수 있으며,(비교연산자를 사용할땐 레코드는 한개여야합니다.)
비교연산자(=,>,<,>=,<=,<>)와 함께 사용됩니다.
SELECT first_name, last_name
FROM employees
WHERE salary > ALL(SELECT salary FROM employees);
- 다중 행 서브쿼리 (Multiple Row)
-실행 결과가 1개가아닌 여러 행을 반환하는 서브쿼리입니다.
IN,ANY,ALL,EXISTS와 같은 다중 행 비교 연산자와 함께 사용됩니다.
SELECT first_name, last_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'Seoul');
- 다중 칼럼 서브쿼리 (Multiple Column)
-실행 결과가 여러 열을 반환하는 서브쿼리입니다.
여러 칼럼에 대한 비교를 동시에 수행할 때 쓰이며, 서브쿼리와 메인쿼리에서 칼럼 개수와 위치가 동일해야합니다.
SELECT first_name, last_name
FROM employees e1
WHERE (e1.department_id, e1.job_id) IN (SELECT department_id, job_id FROM job_assignments);
- 스칼라 서브쿼리
-실행 결과가 한 행, 한 컬럼만을 반환하는 서브쿼리입니다.
무조건 한개의 결과만 나와야하며 다양한 구문에서 쓰일 수 있습니다.
SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT AVG(salary) FROM employees);
서브쿼리 비교연산자
-비교 연산자는 값들을 비교하는 연산자입니다. 아래의 비교연산자들은 서브쿼리에 사용할 수 있으며 값 하나간의 비교, 값 하나와 여러값과의 비교를 할 수 있습니다.
- > , < , = , >= , <= , <> 연산자
-단일 연산자 이며, 하나의 값끼리의 비교할 수 있다.
ex) 1 > temp
- IN 연산자
-IN연산자는 단일 값이 다수 값에 속하는지를 검사하는 문법임. 주로 내부 서브질의에서 다수의 터플이 나올때 IN을 사용하여 이 값에 속하는지 검사를 함. 즉, (단일값 IN 다수값) -> 단일값이 다수값에 속하면 true , 아니면 false=
ex) SELECT name FROM persontable WHERE height IN ( SELECT height FROM person WHERE job == 'police')
- ALL연산자
-여러값을 비교할 수 있으며, 모든값이 다 참이 되어야 참이 반환됩니다.
ex) temp > ALL{1,5,3,6,7}
- SOME , ANY 연산자
-여러값을 비교 할 수 있으며, 하나라도 참이면 참이 반환됩니다.
ex) temp > ANY {1,5,3,2,4}
- EXISTS 연산자
-비교 후에 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건을 의미합니다. 조건에 맞는 값이 존재하면 참이 반환됩니다.
ex) temp EXISTS {1,3,5}
IN과 SOME,ANY과의 비교
- 긍정문일때 ex) = , > , <
IN = some
(둘다 속한다 라는 의미로 긍정문일땐 in과 some의 의미가 똑같음)
- 부정문일때 ex) /=
NOT IN = all
(둘다 아무것도 속하지 않는다 라는 의미로 부정문일땐 in과 all의 의미가 똑같음)
인라인 뷰(Inline View)
-인라인 뷰는 SELECT 문에서 FROM절에 정의되는 서브쿼리를 뜻합니다.
이 서브쿼리는 일시적인 View처럼 동작하며 해당 SELECT문의 실행기간 동안에만 존재하게 됩니다.
SELECT e.id, e.name, e.salary, d.department_name
FROM (
SELECT department_id, MAX(salary) as max_salary
FROM employees
GROUP BY department_id
) AS inline_view
JOIN employees e ON inline_view.department_id = e.department_id AND inline_view.max_salary = e.salary
JOIN departments d ON e.department_id = d.department_id;
'DB' 카테고리의 다른 글
옵티마이저(Optimizer) (0) | 2023.08.14 |
---|---|
SQL 집계 함수 vs 그룹 함수 vs 윈도우 함수 (0) | 2023.08.11 |
SQL 집합 연산 (0) | 2023.08.11 |
SQL 조인 (0) | 2023.08.11 |
SQL 함수 (0) | 2023.08.10 |