Выборка и проекция работали с одной таблицей. Но вопросы бывают про две: «кто ходит и в шахматный, и в футбольный кружок», «кто записался в шахматы, но не пришёл ни разу». Для них в реляционной алгебре есть четыре операции, которые берут две таблицы и дают одну. Три из них знакомы тебе со школы по кругам Эйлера, а четвёртая, произведение, станет фундаментом для соединений из следующего урока.
Два списка кружков
Пусть у школы два кружка, и у каждого свой список:
chess football
name | grade name | grade
------+------ ------+------
Петя | 7 Олег | 8
Аня | 8 Петя | 7
Лиза | 7 Маша | 6
Нарисуй два круга, левый «шахматы», правый «футбол». Петя попадает в оба. Аня и Лиза только в левый, Олег и Маша только в правый. На этой картинке видны все три операции над множествами.
Объединение: все, кто хоть куда-то ходит
Объединение, знак ∪, это оба круга целиком:
chess ∪ football
name | grade
------+------
Петя | 7
Аня | 8
Лиза | 7
Олег | 8
Маша | 6
Петя есть в обоих списках, но в результате он один: результат это отношение, а в отношении нет повторов.
SELECT name, grade FROM chess
UNION
SELECT name, grade FROM football;
Здесь SQL с теорией совпадает: UNION убирает повторы. Если повторы нужны, например чтобы посчитать, сколько всего записей в двух списках, пиши UNION ALL. Он ещё и быстрее, потому что не ищет дубликаты.
Пересечение: кто ходит в оба
Пересечение, знак ∩, это область, где круги накладываются:
chess ∩ football
name | grade
------+------
Петя | 7
SELECT name, grade FROM chess
INTERSECT
SELECT name, grade FROM football;
Разность: кто ходит только в один
Разность, знак −, это левый круг без общей части:
chess − football
name | grade
------+------
Аня | 8
Лиза | 7
В отличие от двух предыдущих операций, здесь важен порядок. football − chess это совсем другой ответ: Олег и Маша. В SQL разность пишут словом EXCEPT:
SELECT name, grade FROM chess
EXCEPT
SELECT name, grade FROM football;
Разность особенно ценна для вопросов со словом «не»: кто записался, но не сдал работу; какие товары ни разу не продавались.
дальше после входа
Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.
Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.