티스토리 뷰

단일 컬럼 서브쿼리 다중 컬럼 서브쿼리
비쌍 비교 쌍 비교
단일 행 서브쿼리 다중 행 서브쿼리
= , > , >= , < , <= , < > IN / NOT IN / ANY / ALL

단일컬럼 단일 행 서브쿼리가 제일 단위가 작은데

이걸 스칼라 서브쿼리라고 한다.

 

Scalar Subquery 표현식

- 한 행에서 정확히 하나의 열 값을 반환하는 subquery

- group by 절을 제외한 쿼리구문의 어디에든 나올 수 있다. 

 

스칼라 서브쿼리 + 상호관련 서브쿼리

상호관련 서브쿼리 : 메인쿼리에 있는 테이블의 값을 참조하는(메인쿼리로부터 후보 행을 가져오는) 구문

메인 테이블과 연결이 돼있다.

기존의 서브쿼리가 먼저 돌아가고 그 결과값으로 메인쿼리를 돌려 결과값이 나오는 구조였다면

상화관련 서브쿼리는 메인쿼리(아우터쿼리)로부터 후보 행을 하나 가지고 서브쿼리를 실행하러 가야하고 이 후보 행을 사용해야 서브쿼리가 돌아가는 형식이다. 메인쿼리의 후보 행이 없어질 때까지 실행한다.

 

 

자신의 부서 평균 급여보다 많은 급여를 받는 사원을 모두 찾는다

select last_name, salary, department_id
from employees outer_table
where salary > 
	(select avb(salary)
            from employees inner_table
            where inner_table.departmnet_id = 
            outer_table.department_id);

 

 

emp 테이블에서

자신이 소속된 부서의 평균 급여보다 자기 급여가 더 큰 사원의 정보를 출력

select e1.last_name,e1.salary, e1.department_id, e2.avg_sal
from employees e1 join (select department)id, avg(salary) as avg_sal
			from employees
       		 	group by department_id) e2
on e1.department_id = e2.department_id
where e1.salary > e2.avg_sal;

 

위의 두 쿼리는 같다!

성능면에서는 속도적으로 아래의 인라인뷰를 사용한 서브쿼리문이 더 빠르다.

나중에 상호관리 서브쿼리밖에 쓸 수밖에 없는 상황이 나오는데 그때 사용..!

 

 

employee 테이블에서 부서별 최대 급여를 받는 사원의 정보를 부서별로 오름차순 정렬해서 출력

SELECT department_id, employee_id, salary
FROM employees e
WHERE 1 = 
	(SELECT COUNT(DISTINCT salary)
     FROM employees
     WHERE e.department_id = department_id
     AND e.salary <= salary)
SELECT e1.department_id, e1.employee_id, e1.salary
FROM employees e1 JOIN (SELECT department_id, MAX(salary) AS max_sal
			FROM employees
       			GROUP BY department_id) e2
ON e1.department_id = e2.department_id
WHERE e1.salary = e2.max_sal
ORDER BY e1.department_id;
댓글
최근에 올라온 글
«   2025/02   »
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
글 보관함