title: 08-Set-Operation-&-Where-Subquery
date: 2023-12-27
status: DONE
tags:
- MySQL
- NOTE
- Lec8
author:
- AllenYGY
created: 2023-12-27T21:21
updated: 2024-03-21T21:49
publish: True
Set-Operation-&-Where-Subquery
Tables are treated as sets in relational databases.
Let A and B be two sets.
The union of
The intersection of
The set difference of
For example,
The two tables of the union must be compatible: corresponding columns must be of the same type.
TableA UNION TableB;
For example,
(SELECT actor_id FROM actor) UNION (SELECT first_name FROM actor)
However, this is NOT the reason for a union without type checking.
TableA INTERSECT TableB;
(SELECT columns FROM tables1 WHERE P1)
INTERSECT
(SELECT columns FROM tables2 WHERE P2)
The corresponding IN subquery is
SELECT columns FROM tables1
WHERE P1 AND columns IN (
SELECT columns FROM tables2 WHERE P2
)
(SELECT film_id
FROM film_actor JOIN actor USING(actor_id)
WHERE first_name='Tim' AND last_name='Hackman')
INTERSECT
(SELECT film_id
FROM film JOIN language USING(language_id)
WHERE name='English')
SELECT film_id
FROM film_actor JOIN actor USING(actor_id)
WHERE first_name='Tim'
AND last_name='Hackman'
AND film_id IN(
SELECT film_id
FROM film JOIN language USING(language_id)
WHERE name='English')
SELECT film_id
FROM film JOIN language USING(language_id)
WHERE name = 'English' AND
film_id = SOME(
SELECT film_id
FROM film_actor JOIN actor USING(actor_id)
WHERE first_name='Tim' AND last_name='Hackman'
)
For set difference use the keyword EXCEPT.
TableA except TableB
(SELECT columns FROM tables1 WHERE P1)
EXCEPT
(SELECT columns FROM tables2 WHERE P2)
Alternatively we can use the NOT IN subquery.
SELECT columns FROM tables1
WHERE P1 AND columns NOT IN (
SELECT columns FROM tables2 WHERE P2
)
(SELECT film_id
FROM film_actor JOIN actor USING(actor_id)
WHERE first_name="Tim" AND last_name="Hackman")
EXCEPT
(SELECT film_id
FROM film JOIN language USING(language_id)
WHERE name="English")
SELECT film_id
FROM film_actor JOIN actor USING(actor_id)
WHERE first_name="Tim"
AND last_name="Hackman"
AND film_id NOT IN (
SELECT film_id
FROM film JOIN language USING(language_id)
WHERE name="English")