[SQL] SELECT - SET OPERATOR

제훈·2024년 6월 26일

SW공학, DB

목록 보기
8/21

SET OPERATOR

SELECT
		menu_code
	  , menu_name
	  , menu_price
	  , category_code
	  , orderable_status
  FROM tbl_menu
 WHERE category_code = 10;

위 코드는 6개 행의 데이터가 조회되고,

SELECT
		menu_code
	  , menu_name
	  , menu_price
	  , category_code
	  , orderable_status
  FROM tbl_menu
 WHERE menu_price < 9000;

위 코드는 9개 행의 데이터가 조회된다.

이 컬럼의 수는 같지만 데이터 개수가 다른 것을 합집합할 수 있는데 바로 UNION 키워드를 활용하는 것이다.

합집합 UNION, UNION ALL

SELECT
		menu_code
	  , menu_name
	  , menu_price
	  , category_code
	  , orderable_status
  FROM tbl_menu
 WHERE category_code = 10
UNION
SELECT
		 menu_code
	  , menu_name
	  , menu_price
	  , category_code
	  , orderable_status
  FROM tbl_menu
 WHERE menu_price < 9000;

2개의 쿼리 사이에 UNION을 넣으면 총 10개의 행이 조회된다.

UNION중복은 지우면서 합해준다 (합집합 이라고 생각하면 편하다.)
UNION ALL중복도 보인다. -> 즉 15개의 행이 보이게 된다.


INTERSECT (교집합)

MySQl과 MariaDB는 INTERSECT가 공식적으로 지원되지 않는다. (파랑색으로 표시가 안 된다.)

1) INNER JOIN 활용

SELECT
		a.menu_code
	  , a.menu_name
	  , a.menu_price
	  , a.category_code
	  , a.orderable_status
  FROM tbl_menu a
  JOIN (SELECT b.menu_code
	  		 , b.menu_name
	  		 , b.menu_price
			 , b.category_code
			 , b.orderable_status
		  FROM tbl_menu b
	     WHERE b.menu_price < 9000
	   ) AS c
	ON a.menu_code = c.menu_code
 WHERE a.category_code = 10;
  1. JOIN문 안에서 조회되는 것은 menu_price 가 9000인 것들
  2. 그 때, menu_code가 같은 애들만 조인해주고
  3. category_code 가 10인 것들을 보는 것이다.

(그림 설명 추가)


2) in 연산자 활용

위와 같은 문제를 in 연산자로 활용해보자.

SELECT
		a.menu_code
	  , a.menu_name
	  , a.menu_price
	  , a.category_code
	  , a.orderable_status
  FROM tbl_menu a
 WHERE a.category_code = 10
   AND a.menu_code IN (SELECT b.menu_code
						 FROM tbl_menu b
						WHERE b.menu_price < 9000);

차집합 (MINUS)

첫 번째 SELECT 문의 결과에서 두 번째 SELECT 문의 결과가 포함하는 레코드를 제외한 레코드를 반환하는 SQL 연산자이다.

MySQL은 MINUS를 제공하지 않는다. 하지만 LEFT JOIN을 활용해서 구현하는 것은 가능하다.

LEFT JOIN 으로 구현

SELECT
		a.menu_code
	  , a.menu_name
	  , a.menu_price
	  , a.category_code
	  , a.orderable_status
	  , c.*
  FROM tbl_menu a
  LEFT JOIN (SELECT b.menu_code
	  			  , b.menu_name
	  			  , b.menu_price
				  , b.category_code
				  , b.orderable_status
			   FROM tbl_menu b
			  WHERE b.menu_price < 9000
		    ) AS c
	 ON a.menu_code = c.menu_code;

이렇게 데이터가 있을 때 차집합을 구하려면 아래처럼 조건을 더 달아야 한다.

 WHERE a.category_code = 10
   AND c.menu_code IS NULL;

차집합 최종 코드

SELECT
		a.menu_code
	  , a.menu_name
	  , a.menu_price
	  , a.category_code
	  , a.orderable_status
  FROM tbl_menu a
  LEFT JOIN (SELECT b.menu_code
	  			 		, b.menu_name
	  			 		, b.menu_price
				 		, b.category_code
				 		, b.orderable_status
			 		FROM tbl_menu b
				  WHERE b.menu_price < 9000
		 		) AS c
	 ON a.menu_code = c.menu_code
 WHERE a.category_code = 10
   AND c.menu_code IS NULL;

이런 식으로도 사용이 가능하다. SELECT 가 끝나고 다음 게시글은 DML부터 다뤄보겠다.

profile
백엔드 개발자 꿈나무

0개의 댓글