티스토리 뷰

SQL/SQLD 이론

[SQLD] SQL 활용 : 4절 서브쿼리

개발자 김챠챠 2025. 3. 7. 18:46

4절 서브 쿼리


서브쿼리

하나의 SQL문 안의 SQL문

메인쿼리 내에서 실행되며, 메인쿼리의 데이터 필터링, 값 제공, 존재 여부 확인등의 역할

사용 위치

  • WHERE 절의 조건
  • FROM 절의 인라인뷰
  • SELECT 절에서 특정 값을 선 계산

서브쿼리의 분류

동작 방식에 따른 분류

비연관 서브쿼리

SELECT emp_id name, salary FROM Employee
	WHERE salary = (SELECT MAX(salary) FROM Employee);

메인쿼리 칼럼을 가지고 있지 않는 서브쿼리

서브쿼리가 먼저 실행되며, 그 결과는 메인쿼리와 독립적

메인쿼리에 값을 제공하기 위한 목적으로 주로 사용함

  • Access Subquery: 제공자 역할
  • Filter Subquery: 확인자 역할
  • Early Filter Subquery: 데이터 필터링 역할

연관 서브쿼리

SELECT emp_id, name, salary FROM Employee E1
	WHERE EXISTS (
		SELECT 1 FROM Employee E2
 			WHERE E2.salary > E1.salary
);

메인쿼리의 결과를 조건이 맞는지 확인하기 위한 목적으로 주로 사용

메인쿼리의 값을 서브쿼리 내부에서 참조하며, 메인쿼리의 각 행에 대해 서브쿼리가 반복 시행됨

따라서 성능이 낮을 수 있음

반환 데이터 형태에 따른 분류

단일 행 서브쿼리

실행 결과가 1건 이하인 서브쿼리

단일 행 비교 연산자(=, <, >, <=, >=) 와 함께 사용

 

다중 행 서브쿼리

실행 결과가 여러 건인 서브쿼리

다중 행 비교 연산자와 함께 사용

•       IN : 서브쿼리의 결과 중 하나의 값이라도 동일하면 참

•       ANY : 서브쿼리의 결과 중 하나의 값이라도 만족하면 참

•       ALL : 서브쿼리의 모든 결과값을 만족하면 참

•       EXISTS : 서브쿼리의 결과가 존재하면 참, ‘WHERE EXISTS (SELECT ~)’ (항상 연관 서브쿼리로 사용)

 

다중 칼럼 서브쿼리

SELECT emp_id, name, department, salary
FROM Employee
WHERE (department, salary) IN (SELECT department, salary FROM Employee WHERE name = 'Alice');

실행 결과로 여러 칼럼 반환

주로 메인쿼리의 조건과 비교하기 위해 사용 (비교하고자 하는 칼럼의 개수와 위치가 동일해야 함)

스칼라 서브쿼리

SELECT emp_id, name, salary,
       (SELECT AVG(salary) FROM Employee E2 WHERE E1.department = E2.department) AS avg_salary
FROM Employee E1;

값 하나를 반환하는 서브쿼리, SELECT절에 사용하는 서브쿼리


CREATE VIEW HighSalaryEmployees AS
SELECT emp_id, name, salary
FROM Employee
WHERE salary > 5000;

가상의 테이블, FROM절에 사용하는 뷰는 인라인 뷰(Inline View)라고 함

장점

  • 독립성: 테이블 구조 변경 자동 반영
  • 편리성: 쿼리를 단순하게 작성할 수 있음, 자주 사용하는 SQL문의 형태를 뷰로 생성하여 사용할 수 있음
  • 보안성: 뷰를 생성할 때 칼럼을 제외할 수 있음

WITH

WITH HighSalary AS (
    SELECT emp_id, name, salary FROM Employee WHERE salary > 5000
)
SELECT * FROM HighSalary;

서브쿼리를 이용하여 뷰로 사용할 수 있는 구문

 

최종 수정일 : 2025/03/07

틀린 사항이 있다면 댓글로 알려주시면 감사하겠습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함