비교할 열이 여러 개인 다중열 서브쿼리
다중열 서브쿼리(multiple-column subquery)
서브쿼리의 SELECT절에 비교할 데이터를 여러개 지정하는 방식. 메인쿼리에 비교할 열을 괄호로 묶어 지정하고 서브쿼리에는 괄호로 묶은 데이터와 같은 자료형 데이터를 SELECT절에 지정함
-- 다중열 서브쿼리 사용하기
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
데이터 면에서 의미 있는 출력은 아니지만 실무에서 아주 유용하고 자주 사용하므로 다중열 서브쿼리 사용 방법 저장~!
FROM절에 사용하는 서브쿼리와 WITH 절
FROM절에 사용하는 서브쿼리는 인라인 뷰(inline view)라고도 하는데, 인라인 뷰는 특정 테이블 전체 데이터가 아닌 SELECT문으로 일부 데이터를 먼저 추출한 다음, 별칭을 지정하여 사용함.
-- 인라인 뷰 사용하기
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM (SELECT * FROM EMP WHERE DEPTNO = 10) E10,
(SELECT * FROM DEPT) D
WHERE E10.DEPTNO = D.DEPTNO;
이 방식은 FROM절에 테이블을 직접 명시하여 사용하기에는 테이블 내 데이터 규모가 너무 크거나 현재 작업에 불필요한 열이 너무 많아 일부 행과 열만 사용할 때 유용함.
가독성의 이유로 WITH절을 사용하기도 함.
WITH절은 메인쿼리 SELECT문에서 사용할 서브쿼리와 별칭을 먼저 지정한 후 메인쿼리에서 사용.
-- WITH절 기본 형식
[별칭1] AS (SELECT 문1),
[별칭2] AS (SELECT 문2),
...
[별칭n] AS (SELECT 문n),
SELECT
FROM 별칭1, 별칭2, 별칭3
...
-- WITH절 사용하기
WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO = 10),
D AS (SELECT * FROM DEPT)
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM E10, D
WHERE E10.DEPTNO = D.DEPTNO;
** WITH절은 서브쿼리 FROM절에 직접 지정하는 방식보다 다소 번거로울 순 있지만 여러개의 서브쿼리 결과가 몇십, 몇백 줄 이상이라서 실제 수행해야 하는 메인쿼리와 서브쿼리를 구분해야 할 때 꽤 유용하게 사용됨.
상호 연관 서브쿼리(correlated subquery)
메인쿼리에 사용한 데이터를 서브쿼리에서 사용하고, 서브쿼리의 결괏값을 다시 메인쿼리로 돌려주는 방식인 상호 연관 서브쿼리도 있음. 다만 성능이 떨어지는 원인이 될 수 있고 사용 빈도도 높지 않음.
-- 상호 연관 서브쿼리
SELECT *
FROM EMP E1
WHERE SAL > (SELECT MIN(SAL)
FROM EMP E2
WHERE E2.DEPTNO = E1.DEPTNO)
ORDER BY DEPTNO, SAL;
SELECT절에 사용하는 서브쿼리
스칼라 서브쿼리(scalar subquery)라고 부르는 이 서브쿼리는 하나의 열 영역으로 결과를 출력.
-- SELECT절에 서브쿼리 사용하기
SELECT EMPNO, ENAME, JOB, SAL,
(SELECT GRADE
FROM SALGRADE
WHERE E.SAL BETWEEN LOSAL AND HISAL) AS SALGRADE,
DEPTNO,
(SELECT DNAME
FROM DEPT
WHERE E.DEPTNO = DEPT.DEPTNO) AS DNAME
FROM EMP E;
SELECT절에 명시하는 서브쿼리는 성능에 문제가 생길 수 있어서 실무에선 자주 사용 X
꼭 사용해야한다면 SELECT절에 명시하는 서브쿼리는 반드시 하나의 결과만 반환하도록 작성해야함.
'SQL' 카테고리의 다른 글
| [SQL] 데이터를 추가, 수정, 삭제하는 데이터 조작어_2 (0) | 2025.12.01 |
|---|---|
| [SQL] 데이터를 추가, 수정, 삭제하는 데이터 조작어_1 (0) | 2025.12.01 |
| [SQL] SQL 속 또 다른 SQL, 서브쿼리_2 (0) | 2025.12.01 |
| [SQL] SQL 속 또 다른 SQL, 서브쿼리_1 (0) | 2025.12.01 |
| [SQL] 조인 (0) | 2025.12.01 |