기록 > 기억
[MySQL] EXISTS 본문
EXISTS
① 서브쿼리가 하나 이상의 행을 반환하면 TRUE를 반환, 그렇지 않으면 FALSE를 반환
② EXISTS 연산자는 일치하는 행을 찾으면 추가 처리를 종료하기 때문에 쿼리 속도가 향상됨
예제 1)
# 하나 이상의 주문을 한 고객 조회
SELECT
c.customerNumber,
c.customerName
FROM
customers c
WHERE
EXISTS
(
SELECT
1
FROM
orders o
WHERE
o.customernumber = c.customernumber
);
# 고객테이블의 고객번호가 주문테이블에 있는 경우
# 서브쿼리는 일치하는 첫번째 행을 반환함 (TRUE를 반환하고 주문테이블 검사 중지)
# 주문을 하지 않은 고객 조회
SELECT
c.customerNumber,
c.customerName
FROM
customers c
WHERE
NOT EXISTS
(
SELECT
1
FROM
orders o
WHERE
o.customernumber = c.customernumber
);
예제 2)
# 샌프란시스코에 위치한 사무실에서 일하는 직원 조회
SELECT
employeenumber,
firstname,
lastname,
extension
FROM
employees e
WHERE
EXISTS
(
SELECT
1
FROM
offices o
WHERE
o.officeCode = e.officeCode AND city = 'San Francisco'
);
# 샌프란시스코에 위치한 사무실에서 일하는 직원들의 내선번호 수정
UPDATE
employees e
SET
e.extension = CONCAT(e.extension, '1')
WHERE
EXISTS
(
SELECT
1
FROM
offices o
WHERE
o.officeCode = e.officeCode AND o.city = 'San Francisco'
);
예제 3) EXISTS 연산자와 IN 연산자 비교 (하나 이상의 주문을 한 고객 조회)
SELECT
customerNumber,
customerName
FROM
customers c
WHERE
EXISTS
(
SELECT
1
FROM
orders o
WHERE
o.customernumber = c.customernumber
);
# 일치하는 행이 발견되면 테이블 스캔을 중지하므로 EXISTS 연산자가 IN 연산자보다 훨씬 빠름!
SELECT
customerNumber,
customerName
FROM
customers
WHERE
customerNumber IN
(
SELECT
customerNumber
FROM
orders
);
# 서브쿼리를 먼저 처리하고 그 결과를 외부쿼리로 처리 함!
일반적으로 서브쿼리의 결과 집합이 많다면 EXISTS 연산자를 사용하는게 성능이 좋고
서브쿼리의 결과 집합이 매우 작다면 IN 연산자를 사용하는게 효율적임!!
'IT국비지원' 카테고리의 다른 글
[MySQL] 프로시저 (Procedure) (0) | 2021.10.18 |
---|---|
[MySQL] 내장 함수 (0) | 2021.10.18 |
[MySQL] INSERT / UPDATE / DELETE 문 (0) | 2021.10.18 |
[MySQL] GROUP BY / HAVING (0) | 2021.10.18 |
[MySQL] 서브쿼리 (Subquery) (0) | 2021.10.18 |
[MySQL] JOIN 절 예제 ② (0) | 2021.10.11 |
[MySQL] JOIN 절 예제 ① (0) | 2021.10.11 |
Comments