본문 바로가기
Database/MariaDB

MariaDB : 서브쿼리에 대해서

by 코딩쥐 2024. 10. 15.

서브쿼리는 하나의 쿼리 내에서 다른 쿼리를 포함하는 방식으로 서브쿼리는 일반적으로 괄호()로 묶어 사용한다. SELECT, FROM, WHERE 및 HAVING 절과 같은 다양한 부분에서 사용될 수 있다. 

 

단일 행 서브쿼리

단일 행 서브쿼리는 오직 하나의 행과 하나의 열을 반환하는 서브쿼리이다. 주 쿼리의 조건문(WHERE)에서 단일 행 서브쿼리와 비교 연산자(=, >, >=, <, <=, <>)를 통해 비교를 할 수 있다.

# 'SCOTT'의 급여보다 더 많은 급여를 받는 사원명
SELECT ename FROM emp 
WHERE sal > (SELECT sal FROM emp WHERE ename='SCOTT'); #KING

 

다중 행 서브쿼리

서브쿼리에서 반환되는 결과가 하나 이상의 행을 반환하는 서브쿼리이다. 다중 행 연산자와 함께 사용한다. 다중 행 서브쿼리의 경우에는 모든 반환 행을 스캔해야 하므로 성능이 저하가 된다. 다중 행 서브쿼리보다는 단일 행 서브쿼리로 변경하면 성능을 개선할 수 있다.

종류 의미
IN 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중 하나라도 일치하면 참
ANY, SOME 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상 일치하면 참
ALL 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참
EXIST 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참
# 3000이상 받는 사원이 소속한 부서와 동일한 부서에서 근무하는 사원들의 이름, 부서번호
SELECT ename, deptno
FROM emp
WHERE deptno IN (SELECT DISTINCT deptno FROM emp WHERE sal >= 3000);

# 서브쿼리를 보면 하나 이상의 결과를 반환한다. 
SELECT DISTINCT deptno FROM emp WHERE sal >= 3000

#'MILLER'보다 나중에 입사한 모든 사원 정보 출력
# ANY는 반환값 중에 하나라도 조건을 만족하면 참으로 간주
SELECT * FROM emp
WHERE hiredate > ANY (SELECT hiredate FROM emp WHERE ename='MILLER');

# 부서번호 20의 모든 사원보다 sal(급여)가 높은 사원 정보 출력
SELECT * FROM emp 
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 20);