프로그래밍/MYSQL

mysql Subquery (서브쿼리)

타코코딩 2023. 10. 17. 13:31
서브쿼리
중첩 쿼리 또는 내부 쿼리라고도 하는 하위 쿼리는 다른 쿼리 내에 포함된 쿼리입니다. 하위 쿼리는 다른 쿼리 결과를 기반으로 한 테이블에서 데이터를 검색하거나 상위 쿼리 결과에 대한 작업을 수행하는 데 사용됩니다. 이는 데이터베이스 내의 데이터를 검색, 필터링 및 조작하기 위한 강력한 도구입니다.

서브쿼리 : 메인쿼리에 서브쿼리를 추가하여 실행하는 형식

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에는 더 많은 사용 사례와 하위 쿼리 변형이 있습니다.