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 키워드를 활용하는 것이다.
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개의 행이 보이게 된다.
MySQl과 MariaDB는 INTERSECT가 공식적으로 지원되지 않는다. (파랑색으로 표시가 안 된다.)
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;
menu_price 가 9000인 것들menu_code가 같은 애들만 조인해주고category_code 가 10인 것들을 보는 것이다.(그림 설명 추가)
위와 같은 문제를 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);
첫 번째 SELECT 문의 결과에서 두 번째 SELECT 문의 결과가 포함하는 레코드를 제외한 레코드를 반환하는 SQL 연산자이다.
MySQL은 MINUS를 제공하지 않는다. 하지만 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부터 다뤄보겠다.