Тема "Язык SQL", Урок 9 "Оператор JOIN и его виды. Оператор UNION"

Постановка задачи для сегодняшнего урока

Если мы выполняем SELECT, то мы "вытягиваем" информацию из одной или нескольких таблиц. Если при этом таблиц несколько, то СУБД объединяет эти таблицы в одну структуру и вытягивает данные из неё. Эта структура называется "объединением" таблиц (Join).

Вы уже знаете один из способов объединения таблиц -- написать между их названиями запятую. На самом деле, запятая -- это только упрощённое обозначение, а полное написание выглядит так: "`table1` CROSS JOIN `table2`". Если вы сделаете запрос с таким выражением, то увидите, что он сработает точно так же, как и "запятая" вместо "CROSS JOIN". Раз есть CROSS JOIN, значит, должны быть и какие-то другие, "не кросс" джойны, и наша сегодняшняя задача -- их рассмотреть.

Создание таблиц для сегодняшнего урока

Выполните SQL скрипт:


Теория

В SQL есть такие возможные виды оператора JOIN:

Я не буду объяснять (пока), что значат эти операторы. Вместо этого предложу вам самостоятельно провести эксперимент, выполнив пять запросов. С каждым запросом вы должны сделать такое:

  1. Скопировать запрос в Блокнот;
  2. Написать заголовок "Ожидание", после которого изложить то, что, по вашему мнению, сделает этот запрос;
  3. Выполнить запрос;
  4. Написать заголовок "Реальность", после которого изложить то, что в реальности сделал этот запрос;
  5. На двух первых запросах "Ожидание" не писать, а сразу выполнять запрос и писать реальность.




Если не получается выполнить этот запрос, выделите скрытый текст: В MYSQL не работает оператор FULL OUTER JOIN (или FULL JOIN), в отличие от других диалектов SQL.


А теперь попробуйте понять, что делает следующий запрос. Если не получается понять -- просто выполните и посмотрите:


Оператор UNION

Слово "UNION" по-английски обозначает "объединение" (правда, как и JOIN :), но объединение немного в другом смысле. Чтобы понять, в каком именно смысле, выполните такой запрос:


Если попадутся полностью дублирующие друг друга строки, то они автоматически пропадут (можно сказать, что у UNION в наличии автоматический DISTINCT). Если хотите убрать это ограничение, используйте UNION ALL:


Практическое задание

Создайте две таблицы:


Задания

  1. Ответьте на вопрос: Может ли (согласно структуре таблиц) один мужчина иметь много жён? А одна женщина -- много мужей?
  2. Ответьте на вопрос: Какой тип связи (см. предыдущий урок) между рассматриваемыми двумя таблицами?
  3. Напишите запрос, который выведет только незамужних женщин;
  4. Напишите запрос, который выведет только замужних женщин;
  5. Напишите запрос, который выведет только женатых мужчин;
  6. Напишите запрос, который выведет только неженатых мужчин;
  7. Напишите запрос, который выведет список браков;
  8. Напишите запрос, который выведет всех людей.

Домашнее задание:

  1. Создайте текстовый файлик.
  2. Не подглядывая в теорию, опишите (коротко), какие операторы вы сегодня выучили и что они делают.
  3. Создайте базу данных "работники на предприятии". В этой базе должна быть одна таблица, в которой есть колонки id, имя, должность, id_начальника. Заполните её тестовыми данными. Выведите список сотрудников вместе с их начальниками. Выведите сотрудников, у которых нет начальника. При затруднениях воспользуйтесь главой "Объединение таблицы с собой" из книги "Понимание SQL".
  4. Прочитайте статьи: https://ru.wikipedia.org/wiki/Join_(SQL), https://ru.wikipedia.org/wiki/Union_(SQL), https://ru.wikipedia.org/wiki/NULL_(SQL), .
  5. Прочитайте главу "Использование предложения UNION" из книги "Понимание SQL".