일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rebase vs merge
- spring
- group by
- analytics4
- IntelliJ
- network
- 차이점
- PostgreSQL
- 각데이터베이스별
- java
- 자바
- JPA
- 오블완
- DBMS
- 4요소
- 티스토리챌린지
- 명령어
- Javascript
- API
- c#특징
- oracle
- git
- 뷰테이블
- mssql
- SQL
- docker
- mysql
- 트랜잭션
- Python
- Today
- Total
hanker
SQL - 서브쿼리 사용법 (서브쿼리 활용 방법) 본문
SQL에서 서브쿼리는 쿼리 안에 중첩된 또 다른 쿼리를 의미한다.
이를 통해 복잡한 데이터 처리를 간결하고 유연하게 구현할 수 있다.
서브쿼리는 SELECT, INSERT, UPDATE, DELETE와 함께 사용되며, 다양한 방식으로 활용 가능하다.
이번 글에서는 서브쿼리의 정의와 활용 방법을 알아보자!
1. 서브쿼리란?
서브쿼리는 주 쿼리(main query) 내에서 중첩된 쿼리로, 주로 임시 데이터 처리를 위해 사용된다.
서브쿼리의 주요 특징은
- 소괄호 ( )로 감싸져야 한다.
- 주 쿼리에 데이터를 제공하거나 조건을 정의한다.
예제를 통해 더 자세히 알아보자.
2. 서브쿼리의 유형
2.1 스칼라 서브쿼리 (Scalar Subquery)
한 행과 한 열을 반환하여 주 쿼리의 값으로 사용된다.
SELECT name,
(SELECT AVG(salary) FROM employees) AS average_salary
FROM employees;
# 결과: 모든 직원의 이름과 평균 급여를 출력한다.
2.2 다중 행 서브쿼리 (Multi-row Subquery)
여러 행을 반환하며, 주로 IN, ANY, ALL과 함께 사용된다.
SELECT name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 100);
# 결과: 특정 위치(location_id = 100)에 속한 부서의 직원 이름을 반환
2.3 다중 열 서브쿼리 (Multi-column Subquery)
여러 열을 반환하며, 주로 EXISTS 또는 비교를 위해 사용된다.
SELECT name
FROM employees E
WHERE (E.department_id, E.salary) IN (
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
);
# 결과: 각 부서에서 가장 높은 급여를 받는 직원의 이름을 반환
2.4 상관 서브쿼리 (Correlated Subquery)
상관 서브쿼리는 주 쿼리의 데이터를 참조하여 실행되며, 반복적으로 수행한다.
SELECT name
FROM employees E
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = E.department_id
);
# 결과: 각 부서의 평균 급여보다 높은 급여를 받는 직원의 이름을 반환
3. INSERT / UPDATE / DELETE 구문의 서브쿼리 사용
3.1 INSERT와 함께 사용
새로운 데이터를 삽입할 때의 서브쿼리 사용
INSERT INTO high_earners (employee_id, name)
SELECT employee_id, name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
# 결과: 평균 급여를 초과하는 직원 데이터를 high_earners 테이블에 삽입
3.2 UPDATE와 함께 사용
특정 조건에 따라 데이터를 업데이트할 때 사용
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = (
SELECT department_id
FROM departments
WHERE location_id = 100
);
# 결과: 위치 ID가 100인 부서의 직원 급여를 10% 인상
3.3 DELETE와 함께 사용
조건에 따라 데이터를 삭제할 때 활용
DELETE FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location_id = 200
);
# 결과: 위치 ID가 200인 부서의 직원 데이터를 삭제
4. 서브쿼리와 JOIN의 차이
서브쿼리와 JOIN은 모두 데이터를 결합하거나 처리할 때 사용되지만, 다음과 같은 차이점이 있다.
특징 | 서브쿼리 | join |
사용 방식 | 중첩된 쿼리로 처리 | 테이블 간 직접 결합 |
성능 | 복잡한 경우 성능 저하 가능 | 대용량 데이터 처리에 더 적합 |
가독성 | 간단한 경우 가독성이 좋음 | 데이터 흐름이 명확함 |
유연성 | 특정 조건 처리에 적합 | 여러 테이블 간 데이터 연결에 적합 |
5. 서브쿼리 주의점!
성능: 서브쿼리가 반복 실행되면 성능 저하를 초래할 수 있으므로, 적절히 최적화해야 한다.
가독성: 복잡한 서브쿼리는 읽기 어렵기 때문에, 가능한 경우 JOIN으로 대체하거나 뷰(View)를 사용하는 것이 좋다.
데이터베이스 호환성: 일부 서브쿼리 문법은 특정 데이터베이스에서만 지원된다.
끝.
'DATABASE > SQL' 카테고리의 다른 글
SQL - 인덱스(index) 사용법, 종류, 정의 (0) | 2025.01.05 |
---|---|
SQL - Window Functions 의 모든 것 (윈도우 함수) (1) | 2025.01.04 |
SQL - 테이블 결합, 데이터 통합의 핵심 JOIN 알아보기 (0) | 2025.01.02 |
SQL - SQL 각 데이터베이스 별 NULL 처리 방법 (MySQL / MSSQL / ORACLE / PostgreSQL) (0) | 2025.01.01 |
SQL - 각 데이터베이스 별 데이터 타입 변환 방법 (MySQL / MSSQL / ORACLE / PostgreSQL), CAST와 CONVERT 사용법 (0) | 2024.12.31 |