Файл: Демонстрирующие работы запроса select с использованием join.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 15
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
В процессе объяснения вы , увидите примеры, демонстрирующие работы запроса SELECT с использованием JOIN.
Объединение таблиц в SQL запросах SELECT: LEFT JOIN, LEFT OUTER JOIN, INNER JOIN, CROSS JOIN. Разница между запросами JOIN.
Стандарт SQL делит объединение таблиц на три вида: внутреннее объединение таблиц (INNER JOIN), внешнее объединение таблиц (LEFT OUTER JOIN, RIGHT JOIN, FULL JOIN) и перекрестное объединение таблиц (CROSS JOIN).
Вообще, стандарт SQL выделяет гораздо больше модификаторов JOIN:
-
INNER JOIN – внутреннее объединение таблиц. -
LEFT JOIN или LEFT OUTER JOIN – левое внешнее объединение таблиц. -
RIGHT JOIN или RIGHT OUTER JOIN – правое внешнее объединение таблиц. -
FULL JOIN – полное объединение таблиц. -
CROSS JOIN – перекрестное объединение таблиц.
Итак, создадим таблицы в базе данных при помощи команды CREATE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | CREATE TABLE tracks ( id INTEGER PRIMARY KEY, title TEXT NOT NULL, second INTEGER NOT NULL, price REAL NOT NULL, album_id INTEGER, FOREIGN KEY (album_id) REFERENCES albums(id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE albums( id INTEGER PRIMARY KEY, title TEXT NOT NULL, artist_id INTEGER, FOREIGN KEY (artist_id) REFERENCES artist(id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE artist ( id INTEGER PRIMARY KEY, name TEXT NOT NULL ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | -- Добавляем данные в таблицу исполнителей INSERT INTO artist (name) VALUES (‘Вячеслав Бутусов’); INSERT INTO artist (name) VALUES (‘Сплин’); INSERT INTO artist (name) VALUES (‘Би-2’); -- Добавляем данные в таблицу альбомы INSERT INTO albums (title, artist_id) VALUES (‘25-й кадр’, 2); INSERT INTO albums (title, artist_id) VALUES (‘Биографика’, 1); INSERT INTO albums (title, artist_id) VALUES (‘Би-2’, 3); -- Добавим несколько альбомов, -- у которых нет ни исполнителей, ни трэков INSERT INTO albums (title) VALUES (‘Четвертый альбом’); INSERT INTO albums (title) VALUES (‘Пятый альбом’); -- добавляем данные в таблицу трэков INSERT INTO tracks (title, second, price, album_id) VALUES (‘Девушка по городу’, 193, 26.20, 2); INSERT INTO tracks (title, second, price, album_id) VALUES (‘Песня идущего домой’, 170, 22.10, 2); INSERT INTO tracks (title, second, price, album_id) VALUES (‘Полковнику никто не пишет’, 292, 32.15, 3); INSERT INTO tracks (title, second, price, album_id) VALUES (‘Мой друг’, 291, 27.15, 3); INSERT INTO tracks (title, second, price, album_id) VALUES (‘Моё сердце’, 249, 21.12, 1); INSERT INTO tracks (title, second, price, album_id) VALUES (‘Линия жизни’, 180, 41.12, 1); INSERT INTO tracks (title, second, price, album_id) VALUES (‘Остаемся зимовать’, 218, 17.62, 1); -- Добавим пару трэков без исполнителей INSERT INTO tracks (title, second, price) VALUES (‘Мертвый город’, 180, 41.12); INSERT INTO tracks (title, second, price) VALUES (‘Звезда по имени Солнце’, 218, 17.62); |
Мы создали и наполнили таблицы, теперь мы можем приступать к объединению таблиц при помощи запросов SELECT с ключевыми словами JOIN во всех их проявлениях, доступных в SQL синтаксисе
Внутреннее объединение таблиц в базах данных: INNER JOIN в SQL
Внутреннее объединение таблиц реализуется в SQL при помощи ключевой фразы INNER JOIN. Важной особенностью внутреннего объединения таблиц в SQL запросах SELECT является то, что уточняющая фраза INNER JOIN работает симметрично, а это значит, что не имеет никакого значения, какая таблица будет использована слева от INNER JOIN, а какая справа.
Когда вы хотите сделать внутреннее объединение таблиц в базах данных, то можете опускать ключевое слово INNER, так как конструкция INNER JOIN – это объединение таблиц по умолчанию. INNER JOIN работает довольно просто: SQL запрос SELECT сравнивает строки из левой таблицы со строками правой таблицы, после сравнения SQLite3 выполняет проверку условия соединения или, как еще говорят, вычисляется предикат соединения. Если это вычисление дает значение TRUE, то в результирующую таблицу будет добавлена новая строка, если результат FALSE, то строка в объединённую таблицу добавлена не будет.
Как и во многих других СУБД можно использовать ключевое слово USING ключевое слово USING в запросах JOIN используется для перечисления списка столбцов, которые должны существовать в обеих таблицах, общий синтаксис USING в JOIN можно представить, как:
1 | SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...\ |
Объединение таблиц INNER JOIN – самый распространенный способ объединения. Давайте реализуем команду SELECT, которая будет использовать конструкцию INNER JOIN для объединения таблиц базы данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT * FROM tracks INNER JOIN Albums ON tracks.album_id = albums.id; id title second price album_id id title artist_id 1 Девушка по городу 193 26.2 2 2 Биографика 2 Песня идущего домой 170 22.1 2 2 Биографика 3 Полковнику никто не пишет 292 32.15 3 3 Би-2 4 Мой друг 291 27.15 3 3 Би-2 3 5 Моё сердце 249 21.12 1 1 25-й кадр 2 6 Линия жизни 180 41.12 1 1 25-й кадр 2 7 Остаемся зимовать 218 17.62 1 1 25-й кадр |
Таким образом мы сделали внутреннее объединение таблиц при помощи ключевой фразы INNER JOIN, мы объединили таблицу трэков и таблицу альбомов. В результирующей таблице нет трэков, у которых нет исполнителей и нет альбомов, в которых нет трэков, это очень важно и на это стоит обратить внимание. Но заметьте, что это не совсем удобно – выводить все столбцы объединенных таблиц в результирующую, давайте это исправим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT tracks.title, second, price, albums.title FROM tracks INNER JOIN Albums ON tracks.album_id = albums.id; title second price title Девушка по городу 193 26.2 Биографика Песня идущего домой 170 22.1 Биографика Полковнику никто не пишет 292 32.15 Би-2 Мой друг 291 27.15 Би-2 Моё сердце 249 21.12 25-й кадр Линия жизни 180 41.12 25-й кадр Остаемся зимовать 218 17.62 25-й кадр |
Такое внутреннее объединение таблиц выглядит более интересным, здесь нет суррогатных столбцов id. В общем, если вы объединяете таблицы конструкцией JOIN, то после SELECT вам необходимо перечислить имена столбцов из обеих таблиц, которые будут отображаться в результирующей таблице. Обратите внимание: если при объединение таблиц имена столбцов одинаковы, то следует использовать квалификатор: table_name.col_name.
Мы можем задавать различные условия выборки данных клаузулой WHERE в том случае, когда объединяем таблице предикатом JOIN:
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT tracks.title, second, price, albums.title FROM tracks INNER JOIN Albums ON tracks.album_id = albums.id WHERE artist_id = 2; title second price title Моё сердце 249 21.12 25-й кадр Линия жизни 180 41.12 25-й кадр Остаемся зимовать 218 17.62 25-й кадр |
В данном случае мы получили объединенные таблицы при помощи INNER JOIN, выбрали только те столбцы, которые хотели увидеть, плюс сделали фильтрацию данных, оставив только песни группы Сплин. Так работает конструкция INNER JOIN в SQL и базах данных.
Подведем итог: внутреннее объединение таблиц INNER JOIN в результате дает таблицу, состоящую из строк объединяемых таблиц, для которых результат выполнения предиката объединения ON равен TRUE. Другими словами: в результирующей таблицы будут только те строки из левой таблицы, для которых есть связанные строки из правой.
Левое объединение таблиц в базах данных: LEFT JOIN и LEFT OUTER JOIN в SQL.
Мы рассмотрели внутреннее объединение таблиц в базах данных, теперь давайте перейдем к рассмотрению внешнего объединения, и разберемся в чем разница между внутренним объединение таблиц и внешним. Есть только один вид внешнего объединения таблиц: LEFT JOIN или LEFT OUTER JOIN.
Стандарт SQL на самом деле определяет три типа внешнего объединения: LEFT JOIN, RIGHT JOIN и FULL JOIN, но только LEFT OUTER JOIN. Поговорим про левое объединение таблиц, хотя более полно это звучит так: левое внешнее объединение таблиц. Внешнее объединение таблиц работает точно так же, как и внутреннее объединение таблиц, но есть разница в выводе строк после проверки предиката соединения. Давайте посмотрим пример LEFT OUTER JOIN и заодно поймем отличие от INNER JOIN, а также особенность внешнего объединения таблиц:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SELECT tracks.title, second, price, albums.title FROM tracks LEFT OUTER JOIN Albums ON tracks.album_id = albums.id; title second price title Девушка по городу 193 26.2 Биографика Песня идущего домой 170 22.1 Биографика Полковнику никто не пишет 292 32.15 Би-2 Мой друг 291 27.15 Би-2 Моё сердце 249 21.12 25-й кадр Линия жизни 180 41.12 25-й кадр Остаемся зимовать 218 17.62 25-й кадр Мертвый город 180 41.12 Звезда по имени Солнце 218 17.62 |
Обратите внимание на результаты работы LEFT OUTER JOIN: в результирующей таблицы есть все строки из таблицы tracks. Давайте изменим запрос SELECT так, чтобы таблица albums была слева:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SELECT tracks.title, second, price, albums.title FROM albums LEFT OUTER JOIN tracks ON albums.id = tracks.album_id; title second price title Моё сердце 249 21.12 25-й кадр Остаемся зимовать 218 17.62 25-й кадр Линия жизни 180 41.12 25-й кадр Песня идущего домой 170 22.1 Биографика Девушка по городу 193 26.2 Биографика Мой друг 291 27.15 Би-2 Полковнику никто не пишет 292 32.15 Би-2 Пятый альбом Четвертый альбом |
Этими двумя примерами мы продемонстрировали разницу между внутренним объединением таблицы и внешним объединение: разницу между INNER JOIN и LEFT JOIN. В обоих случая вычисляет предикат объединения, который указан после ключевого слова ON, но разница в том, что при внешнем объединение LEFT OUTER JOIN в результирующей таблицы окажутся все строки левой таблицы, а к ним, если существуют, добавятся строки правой таблицы. Объяснение долгое, но понятное и написано простыми словами.
Можно сказать по-другому: в результате работы LEFT OUTER JOIN в таблице, которую вернет SELECT, будут все строки из левой таблицы, к которым будут добавлены соответствующие значения из правой таблицы даже в том случае, если эти значения будут равны NULL. Если и так непонятно, то представим работу LEFT OUTER JOIN в виде диаграммы:
Стоит заметить, что LEFT JOIN работает несимметрично и для него имеет значение, какая из таблиц будет указана первой, так как в результирующей таблицы будут находиться все строки из первой таблицы. Это еще одно отличие LEFT JOIN от INNER JOIN. Для INNER JOIN порядок таблиц в SQL запросе не имеет значения.
Итак, мы разобрались с внешним объединением таблиц в SQL и подробно рассмотрели, как работает LEFT OUTER JOIN в базах данных