logo
Ответы Госы_3

38. Создание много табличных запросов средствами языка sql.

Реляционное умножение самый Простой пример многотабличных SQL -запиту : SELECT * FROM A, B;

Этот запрос соединяет каждую строку из таблицы A с каждой строкой из таблицы B в одну строку, в которой будут все колонки из первой таблицы и все колонки из второй таблицы. И возвращает набор таких соединенных строк. Если в запитые будет три и больше таблицы, то строки будут соединяться в тройки, четверки и так далее по принципу каждая с каждой.

Оператор соединения SELECT * FROM Comments, Users

WHERE Comments.user_id = Users.id

Этот запрос является комбинацией двух выше рассмотренных операторов - реляционного умножения и выборки. Сначала проводиться умножение, а полученный результат фильтруется оператором выборки (выражение может быть произвольным, а не только равенство).Таким образом этот оператор выбирает пары (комментарий, пользователь), для которых выполняется отмеченное условие.

Допустимо полет id таблицы Users содержит уникальный числовой идентификатор пользователя, полет user_id таблицы Comments содержит уникальный числовой идентификатор автора. Тогда описан выше запрос можно интерпретировать таким способом: выбрать все строки из таблицы Comments соединить их с соответствующими (указанной условию) строками из таблицы Users, то есть выбрать комментарии и информацию об авторах этих комментариев. Каждая строка результата будет содержать информацию о комментариях и о пользователе, который является автором комментария.

Внешние соединения

Описанное высшее (внутреннее) соединение, соединяет строки таблиц удовлетворяют условию. Внешнее соединение, тоже соединяет строки таблиц, но немного по другому.

SELECT * FROM Users LEFT JOIN Comments ON Comments.user_id = User.id

Данный запрос делает следующее: выбирает все строки из таблицы Users соединяет из с каждой строкой из таблицы Comments, выбирает только те пары, которые отвечают выражению указанной после слова ON, то есть все точно также как в предыдущем примере, но!Потом, если для какой-то строки из таблицы Users не нашлось ни одной строки из таблицы Comments, соответствующей условию, то эта строка соединяется с фиктивной рядком таблице Comments, в которой все поля имеют специальные значения NULL (нет значения). Таким образом, в результате в любом случае будет информация обо всех пользователях.

Для некоторых строк из таблицы Users может найтись несколько строчек из таблицы Comments, а для каких-то ни одной и тогда эта строка соединяется со строкой заполненной значениями NULL. Такое соединение называется внешним.

LEFT JOIN, RIGHT JOIN В примере внешнего соединения мы использовали SQL -оператор LEFT JOIN. Оператор RIGHT JOIN действует аналогично, но выбирает все записи из таблицы справа (а LEFT JOIN слева).Это их единственное отличие.