Dev/SQL

1. 서브 쿼리 간단히 정리한다.

zapi 2023. 8. 17. 23:08

서브쿼리에 대해 간단하게 정리하고자 한다.

1. 서브쿼리란?

SQL문에 내장된 SELECT문을 의미하고 보통 WHERE절에 많이 사용된다.

간단한 구문예시를 들어보자.

SELECT name
FROM employee
WHERE salary > (SELECT salary
                FROM employee
                WHERE name = 'Joy');
ORDER BY DESC;

WHERE절에 사용된 괄호문이 서브쿼리 구문이다.

수학식 처럼 괄호가 존재할 시 괄호 안의 연산을 실행하는 것 처럼 괄호로 표현된 서브쿼리가 메인 쿼리 보다 먼저 실행이 된다.

서브쿼리가 실행되고 나서 반환되는 결과가 메인 쿼리에 사용되는 것이다.


2. 단일 행 서브쿼리 / 다중 행 서브쿼리

서브쿼리의 반환 값의 "갯수"에 따라서 쿼리는 단일행 서브쿼리다중행 서브쿼리로 나뉘게 된다.

이것 또한 아래 구문을 예시로 보자.

SELECT name
FROM employee
WHERE salary = (SELECT MIN(salary)
                FROM employee
                GROUP BY dep_id);

위의 구문은 오류를 띄울 확률이 높다.

WHERE절에서 사용된 연산자 '='단일행 비교 연산자이다.

 

단일행 비교 연산자는 말 그대로 행 하나를 비교하는 연산자이다.

=, <, >, >=, <=, <>(같지 않음을 의미)

이렇게 우리가 수학적 기호로 익숙한 연산자들이 단일 행 비교 연산자들이다.

하나의 행이 반환 되었을 때 연산이 가능한 데 위와 같은 경우는 하나 이상의 행이 반환 될 확률이 높다.

1개가 들어갈 수 있는 자리에 1개가 아니라 1개 이상이 들어 가려고 하는거라고. 당연히 수학적으로 오류가 날 수 밖에 없다.

이렇게 서브쿼리의 실행 결과가 다중 행이 반환 되는 것을 다루기 위해 다중 행 비교 연산자를 사용 한다.

다음은 다중 행 비교 연산자를 사용한 구문 예시이다.

SELECT name
FROM employee
WHERE salary IN (SELECT MIN(salary)
                 FROM employee
                 GROUP BY department_id);

위 구문에 WHERE절에 사용되는 'IN'이 바로 다중 행 비교 연산자이다.

IN : 목록에 있는 임의의 멤버와 동일함

NOT IN : 목록에 있는 임의의 멤버와 다름

EXISTS : 목록에 행이 있는지 여부를 검사

NOT EXISTS : 목록에 행이 없는지 여부를 검사

위와 같은 연산자들은 다중 행을 반환 받아 처리 가능한 비교 연산자들이다.

하지만 여기서 EXISTS 연산자는 단항 연산자로 피연산자가 1개이다.


3. HAVING절에서 서브쿼리 사용

서브쿼리는 HAVING절에서도 사용이 가능하다.

SELECT department
FROM employee
GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary)
                      FROM employee
                      WHERE department_id = 10);

4. 서브쿼리 사용 시 주의 사항

서브쿼리의 경우 반환 값이 NULL이 포함 될 경우가 있다.

이때 NOT IN 연산자 사용이 불가 하여 서브쿼리 결과가 NULL이 포함되지 않도록 쿼리를 수정하여야 한다.

그럼 어떻게 해야할까 ㅇㅅㅇ

SELECT emp.name
FROM employee emp
WHERE NOT EXISTS (SELECT 'x'
                  FROM employee mgr
                  WHERE emp.employee_id = mgr.manager_id);

위의 구문을보자

서브쿼리에서 반환 값 중 하나가 NULL 값이 포함된 경우에도 사용 가능한 NOT EXISTS 연산자를 이용하였다.

EXISTS 연산자가 IN과 유사한 기능의 연산자라 생각하면 쉽다.

* 서브 쿼리 행 값이 발견되는 경우 : WHERE절의 EXISTS 조건이 TRUE가 됨

* 서브 쿼리 행 값이 발견되지 않는 경우 : WHERE절의 EXISTS 조건이 FALSE가 됨

위의 서브 쿼리의 WHERE절을 보면 메인쿼리 테이블의 emp서브 쿼리 테이블의 mgr이 함께 비교되고 있다.

이러한 서브쿼리를 "상호 관련 서브 쿼리"라고 한다.


이렇게 서브쿼리에 대해서 짧게 요약. 공부는 실제 쿼리문을 작성하면서 하는게 가장 좋지 않을까 싶당 ㅇㅅㅇ

이만(='0'=)/

'Dev > SQL' 카테고리의 다른 글

2. WITH절 정리한다. 짧다.  (0) 2023.08.17