Соединения таблиц(JOINы) и любимая задачка по SQL на собеседовании

Home » postgres » Соединения таблиц(JOINы) и любимая задачка по SQL на собеседовании
postgres, SQL, Uncategorized Комментариев нет

Соединения таблиц(JOINы) и любимая задачка на собеседовании

Соединения бывают: естественные и уточненные, а также внутренние, внешние и полные.

Уточненное соединение

В таком соединении таблиц используется либо фраза ON, либо фраза USING.
Синтаксис уточненного соединения.

Естественное соединение

Осуществляется по равенству всех одноименных пар таблиц

Перекрестное соединение(CROSS JOIN)

TableName CROSS JOIN Table2Name – перекрестное соединение, результат выборки которого представляет все возможные сочетания сопоставлений записей из таблиц(например, если в таблицах 3 и 6 записей, мы получим 24 итоговых записи, если 2 и 5 то 2*5 = 10 записей, другими словами, результат – декартово произведение таблиц)

Внутреннее соединение(INNER JOIN)

Внутреннее соединение указывается словом INNER(если тип не указан явно, то соединение – INNER по умолчанию). Результат внутреннего соединения – выборка только тех записей, которые есть и в одной и в другой таблице одновременно.(логически – пересечение множеств)
Если соединение устанавливается не по равенству значений, или имена столбцов не совпадают, то используется фраза ON. В таком случае запрос можно осуществить и с помощью фразы WHERE

эквивалентно

Если писать через JOIN – ON, можно все условия помещать в ON

эквивалентно

Допустим, название столбца внешнего ключа второй таблицы полностью совпадает с названием столбца с первичным ключом первой таблицы, то есть названия столбцов по которым происходит соединение – идентичны. Тогда, достаточно просто использовать другое слово – USING с названием идентичных столбцов по которым происходит соединение(столбцов по которым нужно искать соответствие может быть несколько). Например Department.dep_id и Employee.dep_id

Внешнее соединение(OUTER JOIN)

Внешнее соединение отличается от внутреннего тем, что в результат выборки попадают записи, соответствия которым отсутствуют. Если используем LEFT OUTER JOIN мы получаем гарантировано все что есть в первой, левой таблице и соответствия из правой, если используем RIGHT OUTER JOIN, то гарантированно получаем то, что справа и соответствия из левой. То есть мы получаем таблицы вида:

для LEFT OUTER JOIN
left_outer_join

для RIGHT OUTER JOIN
right_outer_join

Есть еще FULL OUTER JOIN, (в Oracle эта операция не поддерживается). Данная операция подразумевает в качестве результата – выборку всех записей из двух таблиц, где присутствуют как все записи отсутствующие в первой таблице, так и записи отсутствующие в правой(логически – объединение множеств). При этом те поля, соответствие у которых отсутствует заполняются значением NULL.
Результат FULL JOIN:
full_join

Чтобы попробовать разные запросы нам понадобилась пара таблиц:

(Postgres как и в Oracle невозможно произвести сравнение с NULL. Если мы хотим определить запись с NULL или без, мы должны использовать конструкции IS и IS NOT)

Любимая задачка простатников вогонов интервьюеров на собеседовании:

Вопрос(Задачка на JOIN): вывести список только тех подразделений компании в которых нет сотрудников
В свете вышеизложенного, решение простое:

Подробно о JOIN

LEAVE A COMMENT