서브쿼리
중첩 쿼리 또는 내부 쿼리라고도 하는 하위 쿼리는 다른 쿼리 내에 포함된 쿼리입니다. 하위 쿼리는 다른 쿼리 결과를 기반으로 한 테이블에서 데이터를 검색하거나 상위 쿼리 결과에 대한 작업을 수행하는 데 사용됩니다. 이는 데이터베이스 내의 데이터를 검색, 필터링 및 조작하기 위한 강력한 도구입니다.
서브쿼리 : 메인쿼리에 서브쿼리를 추가하여 실행하는 형식
SELECT 컬럼리스트 FROM 테이블명 WHERE 조건절
(스칼라 서브쿼리) (인라인뷰) (서브쿼리)
스칼라서브쿼리는 성능문제로 잘 사용안함(오라클에서는 더 이상 지원x) , sql 튜닝할때 우선순위로 수정
예제
-- 홍길동 사원이 속한 부서의 이름을 조회
SELECT dept_name
FROM department d
WHERE d.dept_id = (SELECT e.dept_id FROM employee e WHERE e.emp_name ='홍길동');
-- 홍길동사원이 사용한 휴가의 내역을 조회
SELECT *
FROM vacation v
WHERE v.emp_id = (SELECT e.emp_id FROM employee e WHERE emp_name = '홍길동');
-- 제 3본부에 속해있는 부서들을 조회
SELECT * FROM department d
WHERE d.unit_id = (SELECT u.unit_id FROM unit u WHERE u.unit_name = '제3본부')
-- 제 3본부에 속해 있는 모든 사원들을 조회
-- =의 뜻은 동일하게 데이터가 하나만 나오는 경우를 뜻함(단일행 서브쿼리),
-- 다중행 서브쿼리 : 서브쿼리를 실행한 결과가 2행이상 출력되는 경우
-- 그래서 이처럼 복수의 결과가 출력을 할때는 or연산자인 in을 사용하여 출력을 해야한다(다중행 서브쿼리)
SELECT *
FROM employee e
WHERE e.dept_id in (SELECT d.dept_id FROM department d WHERE d.unit_id =
(SELECT u.unit_id FROM unit u WHERE u.unit_name= '제3본부'));
설명
기본 구문은 다음과 같습니다.
SELECT column1, column2, ...
FROM table1
WHERE columnX operator (SELECT columnY FROM table2 WHERE condition);
이 구문에서는:
column1, column2, ...: 검색하려는 열입니다 table1.
table1: 데이터를 선택하는 기본 테이블입니다.
columnXtable1: 비교에 사용되는 열입니다 .
operator=: , >, <, IN, EXISTS등과 같은 비교 연산자입니다.
columnY: 하위 쿼리에서 비교하려는 열입니다 table2.
table2: 하위 쿼리가 데이터를 검색하는 테이블입니다.
condition: 하위 쿼리의 결과를 필터링하는 조건입니다.
다음은 MySQL의 하위 쿼리를 설명하는 몇 가지 예입니다.
연산자를 사용한 기본 하위 쿼리 IN:
"Engineering"이라는 이름의 부서에서 일하는 "employees" 테이블에서 직원 목록을 검색한다고 가정해 보겠습니다. 이를 달성하기 위해 하위 쿼리를 사용할 수 있습니다.
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Engineering');
스칼라 하위 쿼리:
하위 쿼리를 사용하여 모든 직원의 평균 급여와 같은 단일 값을 검색하고 해당 값을 기본 쿼리에 사용할 수 있습니다.
SELECT employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
상관 하위 쿼리:
상관 하위 쿼리는 외부 쿼리의 열을 참조합니다. 예를 들어 해당 부서의 평균 급여보다 급여가 높은 직원을 찾으려면 다음을 수행하세요.
SELECT employee_name, salary, department_id
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);
다음을 사용한 하위 쿼리 EXISTS:
EXISTS하위 쿼리에 레코드가 있는지 확인하는 데 사용할 수 있습니다 .
SELECT employee_name
FROM employees
WHERE EXISTS (SELECT 1 FROM employee_reviews WHERE employee_id = employees.id);
조항 의 하위 질의 FROM:
하위 쿼리는 절에서도 사용할 수 있습니다 FROM. 예를 들어, 하위 쿼리를 사용하여 임시 테이블을 만들 수 있습니다.
SELECT department_name, AVG(salary) AS avg_salary
FROM (SELECT * FROM employees) AS subquery
GROUP BY department_name;
하위 쿼리는 MySQL에서 데이터를 작업하는 유연한 방법을 제공하므로 복잡한 작업을 수행하고 다양한 조건에 따라 데이터를 필터링할 수 있습니다. 제공된 예제는 좋은 출발점을 제공하지만 MySQL에는 더 많은 사용 사례와 하위 쿼리 변형이 있습니다.
'프로그래밍 > MYSQL' 카테고리의 다른 글
mysql 데이터 변경 DML UPDATE ~ SET (0) | 2023.10.19 |
---|---|
mysql 테이블 복제 create as select (CAS) (1) | 2023.10.19 |
mysql OUTER JOIN (1) | 2023.10.17 |
my sql 최소값min(),최대값max(), group by ,소계 with rollup (0) | 2023.10.13 |
mysql sum() 합계 구하기 ,avg()평균 값 구하기 (1) | 2023.10.13 |