Notice
Recent Comments
Recent Posts
«   2024/11   »
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 29 30
Today
Total
관리 메뉴

기록 > 기억

[MySQL] EXISTS 본문

IT국비지원

[MySQL] EXISTS

BY SON 2021. 10. 18. 09:43

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