Lsiron
MySQL 서브쿼리(ANY, ALL) 본문
서브쿼리란?
서브쿼리(Subquery)는 SQL 쿼리 내에 포함된 또 다른 SQL 쿼리이다. 서브쿼리는 쿼리 결과를 제한하거나 특정 조건을 만족하는 데이터를 선택하는 데 사용된다.
서브쿼리 특징
- 알려지지 않은 기준을 이용한 검색에 유용하다.
- 메인 쿼리가 실행되기 이전에 한 번만 실행한다.
- 한 문장에서 여러 번 사용 가능하다.
서브쿼리 주의사항
- 서브쿼리는 괄호와 함께 사용되어야 한다.
- 서브쿼리 안에서 ORDER BY 절은 사용할 수 없다.
- 서브쿼리는 연산자의 오른쪽에 사용돼야 한다.
- 서브쿼리는 오로지 SELECT문으로만 작성 할 수 있다.
서브쿼리 종류
단일 행 서브쿼리 (Single-row Subquery): 결과가 한 행만 나오는 서브쿼리 이다. 서브쿼리가 결과를 1개의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리.
SELECT employee_id, name
FROM employees
WHERE department_id = (SELECT department_id
FROM departments
WHERE department_name = 'Sales');
다중 행 서브쿼리 (Multi-row Subquery): 결과가 한 행만 나오는 단일 행 서브쿼리와는 다르게 서브쿼리가 결과를 2개 이상 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리.
SELECT employee_id, name
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id = 1700);
서브쿼리의 반환 값에 따른 분류 (비교연산 가능)
ANY (또는 SOME): 서브쿼리 결과 중 하나라도 조건을 만족하면 true를 반환한다.
SELECT name
FROM employees
WHERE salary > ANY (SELECT salary
FROM employees
WHERE department_id = 10);
ALL : 서브쿼리 결과 모두가 조건을 만족해야 true를 반환한다.
SELECT name
FROM employees
WHERE salary > ALL (SELECT salary
FROM employees
WHERE department_id = 10);
서브쿼리의 위치에 따른 분류
SELECT 절에서의 서브쿼리: SELECT 절 내에서 값을 계산하거나 반환하는 데 사용된다.
SELECT name,
(SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id) AS avg_dept_salary
FROM employees e;
FROM 절에서의 서브쿼리: 서브쿼리를 임시 테이블처럼 사용하여 메인 쿼리에서 참조한다.
SELECT e.name, d.avg_salary
FROM employees e
JOIN (SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id) d
ON e.department_id = d.department_id;
WHERE 절에서의 서브쿼리: WHERE 절에서 특정 조건을 지정하는 데 사용된다.
SELECT name
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id = 1700);
HAVING 절에서의 서브쿼리: GROUP BY로 그룹화된 결과에 조건을 적용할 때 사용된다.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary)
FROM employees
WHERE department_id = 10);
스칼라 서브쿼리 (Scalar Subquery)
- 스칼라 서브쿼리는 정확히 하나의 값(하나의 행과 하나의 열)을 반환하는 서브쿼리이다. 마치 JOIN을 사용한 것과 같은 결과를 나타낸다.
- 일반적으로 SELECT, WHERE, HAVING 절에서 사용될 수 있으며, 단일 값을 필요로 하는 모든 컨텍스트에서 사용될 수 있다.
SELECT name,
(SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id) AS avg_dept_salary
FROM employees e;
'데이터베이스 > MySQL' 카테고리의 다른 글
MySQL로 게시판 CRUD 구현해보기. (Node.js, Express) (3) | 2024.07.14 |
---|---|
MySQL의 Index (0) | 2024.07.11 |
집계함수와 제어키워드 (0) | 2024.07.10 |
구글 클라우드를 통한 MySQL 배포하기 (0) | 2024.07.09 |
정규화와 역정규화 그리고 이상현상, 함수의 종속성 (2) | 2024.07.09 |