Sql запрос join: JOIN (SQL) — что это за оператор, примеры использования
Содержание
Теория SQL: запрос Join совместно с count(*) | PHPClub
BigWindow
Новичок
#1
Теория SQL: запрос Join совместно с count(*)
Всем привет!
У меня есть две таблицы: `Users` и `Comments` отвечающие за хранение данных о юзверях и комментариях соответсвенно. Мне необходимо построить список юзеров с данными о количестве комментариев.
Итак, кол-во комментов можно легко подсчитать запросом: SELECT count(*) FROM comments WHERE C_USER_FROM = 1
Вроде все понятно, но основная проблема в Join’e данных из двух таблиц.
Необходимо, соединить данные о юзерах и запрос о кол-ве комментов. Каким образом это сделать?
Dovg
Продвинутый новичок
#2
можно сделать подзапросом без join
Gas
может по одной?
#3
Dovg
всё таки join’ом для этого случая правильней.
BigWindow
раз знаешь большую часть ответа, напиши какая именно проблема с join’ом, кинь свой запрос.
BigWindow
Новичок
#4
SELECT users.*, count(comments.C_ID) FROM users INNER JOIN comments ON comments.C_User_From = users.U_ID
Вот вариант моего запроса. Но что-то мне кажется он логически не верен
zerkms
TDD infected
#5
Вот вариант моего запроса. Но что-то мне кажется он логически не верен
Нажмите для раскрытия…
он удовлетворяет поставленной задаче?
BigWindow
Новичок
#6
Автор оригинала: zerkms
он удовлетворяет поставленной задаче?Нажмите для раскрытия…
Он вообще не выполняется
Gas
может по одной?
#7
Напиши сообщение об ошибке, мы ж не бабки гадалки.
Сразу скажу что скорее нужен left join, чтоб получить пользователей у которых нет коментов.
BigWindow
Новичок
#8
Автор оригинала: Gas
Напиши сообщение об ошибке, мы ж не бабки гадалки.
Сразу скажу что скорее нужен left join, чтоб получить пользователей у которых нет коментов.Нажмите для раскрытия…
Error Code : 1140
Mixing of GROUP columns (MIN(),MAX(),COUNT(),…) with no GROUP columns is illegal if there is no GROUP BY clause
(0 ms taken)
Gas
может по одной?
#9
Правильно ругается, count — агрегатная функция и должна использоваться с group by. Добавь в конец GROUP BY users.U_ID
BigWindow
Новичок
#10
Автор оригинала: Gas
Правильно ругается, count — агрегатная функция и должна использоваться с group by. Добавь в конец GROUP BY users.U_IDНажмите для раскрытия…
Спасибо! Вот только из списка выпадают юзеры, у которых нет комментов.
Фанат
oncle terrible
#11
left outer join
BigWindow
Новичок
#12
Автор оригинала: *****
left outer joinНажмите для раскрытия. ..
SELECT users.*, count(comments.C_ID) FROM users left outer join comments ON comments.C_User_From = users.U_ID WHERE (comments.C_User=8) GROUP BY users.U_ID
У юзверя «8» нет комментов и он выпадает из списка
Фанат
oncle terrible
#13
ты гонишь
BigWindow
Новичок
#14
Автор оригинала: *****
ты гонишьНажмите для раскрытия. ..
Да нет, серьезно говорю. Код привел выше и все равно не получается.
Gas
может по одной?
#15
конечно выпадет, зачем ставить WHERE (comments.C_User=8) ?
Фанат
oncle terrible
#16
что здесь делает это where?
и что за левое поле в нем указано?
BigWindow
Новичок
#17
Автор оригинала: Gas
конечно выпадет, зачем ставить WHERE (comments. C_User=8) ?Нажмите для раскрытия…
Ой ступил!!! Жесть! Тупанул я конкретно
Всем огромное спасибо! Проблема решена!
Итак, вот что в итоге у нас получилось:
Вывести совмещенные данные для одного юзера
SELECT users.*, count(comments.C_ID) FROM users
left outer join comments ON users.U_ID = comments.C_User_From
WHERE (users.U_ID=7) GROUP BY users.U_ID
Вывести совмещенные данные для всех юзеров
SELECT users.*, count(comments.C_ID) FROM users
left outer join comments ON users.U_ID = comments.C_User_From
GROUP BY users.U_ID
Духовность™
Продвинутый новичок
#18
left outer join
Нажмите для раскрытия. ..
а почему обычной inner join низя использовать?
Wicked
Новичок
#19
а почему обычной inner join низя использовать?
Нажмите для раскрытия…
по определению
Духовность™
Продвинутый новичок
#20
а что OUTER делает я этого в мане не нашел (
Объяснение SQL объединений JOIN — Orkhan Alishov
Имеем две таблицы: пользователи и отделы.
U) users D) departments id name d_id id name -- ---- ---- -- ---- 1 Владимир 1 1 Сейлз 2 Антон 2 2 Поддержка 3 Александр 6 3 Финансы 4 Борис 2 4 Логистика 5 Юрий 4
Напишем запрос:
SELECT u.id, u.name, d.name AS d_name FROM users u INNER JOIN departments d ON u.d_id = d.id
Запрос вернет объединенные данные, которые пересекаются по условию, указанному в INNER JOIN ON <..>
В нашем случае условие <таблица_пользователей>.<идентификатор_отдела> должен совпадать с <таблица_отделов>.<идентификатор>
В результате отсутствуют:
- пользователь Александр (отдел 6 — не существует)
- отдел Финансы (нет пользователей)
id name d_name -- -------- --------- 1 Владимир Сейлз 2 Антон Поддержка 4 Борис Поддержка 3 Юрий Логистика
Внутреннее объединение INNER JOIN (синоним JOIN, ключевое слово INNER можно опустить).
Выбираются только совпадающие данные из объединяемых таблиц.
Чтобы получить данные, которые подходят по условию частично, необходимо использовать внешнее объединение — OUTER JOIN.
Такое объединение вернет данные из обеих таблиц (совпадающие по условию объединения) ПЛЮС дополнит выборку оставшимися данными из внешней таблицы, которые по условию не подходят, заполнив недостающие данные значением NULL.
Существует два типа внешнего объединения OUTER JOIN — LEFT OUTER JOIN и RIGHT OUTER JOIN.
Работают они одинаково, разница заключается в том что LEFT — указывает что «внешней» таблицей будет находящаяся слева (в нашем примере это таблица users).
Ключевое слово OUTER можно опустить. Запись LEFT JOIN идентична LEFT OUTER JOIN.
SELECT u.id, u.name, d.name AS d_name FROM users u LEFT OUTER JOIN departments d ON u.d_id = d.id
Получаем полный список пользователей и сопоставленные департаменты:
id name d_name -- -------- --------- 1 Владимир Сейлз 2 Антон Поддержка 3 Александр NULL 4 Борис Поддержка 5 Юрий Логистика
Добавив условие:
WHERE d. id IS NULL
в выборке останется только 3#Александр, так как у него не назначен департамент.
RIGHT OUTER JOIN вернет полный список департаментов (правая таблица) и сопоставленных пользователей.
SELECT u.id, u.name, d.name AS d_name FROM users u RIGHT OUTER JOIN departments d ON u.d_id = d.id
id name d_name -- -------- --------- 1 Владимир Сейлз 2 Антон Поддержка 4 Борис Поддержка NULL NULL Финансы 5 Юрий Логистика
Дополнительно можно отфильтровать данные, проверяя их на NULL:
SELECT d.id, d.name FROM users u RIGHT OUTER JOIN departments d ON u.d_id = d.id WHERE u.id IS null
В нашем примере указав WHERE u.id IS null, мы выберем департаменты, в которых не числятся пользователи (3#Финансы).
CROSS / FULL JOIN
FULL JOIN возвращает `объединение` объединений LEFT и RIGHT таблиц, комбинируя результат двух запросов.
CROSS JOIN возвращает перекрестное (декартово) объединение двух таблиц. Результатом будет выборка всех записей первой таблицы объединенная с каждой строкой второй таблицы. Важным моментом является то, что для кросса не нужно указывать условие объединения.
ВНУТРЕННЯЯ, НАРУЖНАЯ, ЛЕВАЯ, ПРАВАЯ, ПОПЕРЕЧНАЯ
Ричард Петерсон
Часы
Обновлено
Что такое СОЕДИНЕНИЯ?
Соединения помогают извлекать данные из двух или более таблиц базы данных.
Таблицы связаны друг с другом первичными и внешними ключами.
Примечание: JOIN — это самая непонятная тема среди тех, кто изучает SQL. Для простоты и легкости понимания мы будем использовать новую базу данных для практического примера. Как показано ниже
идентификатор | имя_имя | фамилия | id_фильма |
---|---|---|---|
1 | Адам | Смит | 1 |
2 | Рави | Кумар | 2 |
3 | Сьюзан | Дэвидсон | 5 |
4 | Дженни | Адрианна | 8 |
5 | Ли | Понг | 10 |
идентификатор | заголовок | категория |
---|---|---|
1 | Кредо Убийцы: ТЕМНИ | Анимации |
2 | Настоящая сталь (2012) | Анимации |
3 | Элвин и бурундуки | Анимации |
4 | Приключения Тин Тин | Анимации |
5 | Сейф (2012) | Действие |
6 | Убежище (2012) | Действие |
7 | ГИА | 18+ |
8 | Крайний срок 2009 | 18+ |
9 | Грязная картинка | 18+ |
10 | Марли и я | Романтика |
Типы соединений
Cross JOIN
Cross JOIN — это простейшая форма JOIN, которая сопоставляет каждую строку из одной таблицы базы данных со всеми строками другой.
Другими словами, он дает нам комбинации каждой строки первой таблицы со всеми записями во второй таблице.
Предположим, мы хотим получить все записи участников по всем записям о фильмах. Мы можем использовать сценарий, показанный ниже, чтобы получить желаемые результаты.
SELECT * FROM `movies` CROSS JOIN `members`
Выполнение вышеуказанного сценария в рабочей среде MySQL дает нам следующие результаты.
идентификатор заголовок идентификатор имя_имя фамилия id_фильма 1 Кредо Убийцы: ТЕМНИ Анимации 1 Адам Смит 1 1 Кредо Убийцы: ТЕМНИ Анимации 2 Рави Кумар 2 1 Кредо Убийцы: ТЕМНИ Анимации 3 Сьюзан Дэвидсон 5 1 Кредо Убийцы: ТЕМНИ Анимации 4 Дженни Адрианна 8 1 Кредо Убийцы: ТЕМНИ Анимации 6 Ли Понг 10 2 Настоящая сталь (2012) Анимации 1 Адам Смит 1 2 Настоящая сталь (2012) Анимации 2 Рави Кумар 2 2 Настоящая сталь (2012) Анимации 3 Сьюзан Дэвидсон 5 2 Настоящая сталь (2012) Анимации 4 Дженни Адрианна 8 2 Настоящая сталь (2012) Анимации 6 Ли Понг 10 3 Элвин и бурундуки Анимации 1 Адам Смит 1 3 Элвин и бурундуки Анимации 2 Рави Кумар 2 3 Элвин и бурундуки Анимации 3 Сьюзан Дэвидсон 5 3 Элвин и бурундуки Анимации 4 Дженни Адрианна 8 3 Элвин и бурундуки Анимации 6 Ли Понг 10 4 Приключения Тин Тин Анимации 1 Адам Смит 1 4 Приключения Тин Тин Анимации 2 Рави Кумар 2 4 Приключения Тин Тин Анимации 3 Сьюзан Дэвидсон 5 4 Приключения Тин Тин Анимации 4 Дженни Адрианна 8 4 Приключения Тин Тин Анимации 6 Ли Понг 10 5 Сейф (2012) Действие 1 Адам Смит 1 5 Сейф (2012) Действие 2 Рави Кумар 2 5 Сейф (2012) Действие 3 Сьюзан Дэвидсон 5 5 Сейф (2012) Действие 4 Дженни Адрианна 8 5 Сейф (2012) Действие 6 Ли Понг 10 6 Убежище (2012) Действие 1 Адам Смит 1 6 Убежище (2012) Действие 2 Рави Кумар 2 6 Убежище (2012) Действие 3 Сьюзан Дэвидсон 5 6 Убежище (2012) Действие 4 Дженни Адрианна 8 6 Убежище (2012) Действие 6 Ли Понг 10 7 ГИА 18+ 1 Адам Смит 1 7 ГИА 18+ 2 Рави Кумар 2 7 ГИА 18+ 3 Сьюзан Дэвидсон 5 7 ГИА 18+ 4 Дженни Адрианна 8 7 ГИА 18+ 6 Ли Понг 10 8 Крайний срок (2009) 18+ 1 Адам Смит 1 8 Крайний срок (2009) 18+ 2 Рави Кумар 2 8 Крайний срок (2009) 18+ 3 Сьюзан Дэвидсон 5 8 Крайний срок (2009) 18+ 4 Дженни Адрианна 8 8 Крайний срок (2009) 18+ 6 Ли Понг 10 9 Грязная картинка 18+ 1 Адам Смит 1 9 Грязная картинка 18+ 2 Рави Кумар 2 9 Грязная картинка 18+ 3 Сьюзан Дэвидсон 5 9 Грязная картинка 18+ 4 Дженни Адрианна 8 9 Грязная картинка 18+ 6 Ли Понг 10 10 Марли и я Романтика 1 Адам Смит 1 10 Марли и я Романтика 2 Рави Кумар 2 10 Марли и я Романтика 3 Сьюзан Дэвидсон 5 10 Марли и я Романтика 4 Дженни Адрианна 8 10 Марли и я Романтика 6 Ли Понг 10
INNER JOIN
Внутреннее соединение используется для возврата строк из обеих таблиц, удовлетворяющих заданному условию.
Предположим, вы хотите получить список участников, которые брали напрокат фильмы вместе с названиями арендованных ими фильмов. Вы можете просто использовать для этого INNER JOIN, который возвращает строки из обеих таблиц, которые удовлетворяют заданным условиям.
ВЫБЕРИТЕmembers.`first_name` ,members.`last_name` ,movies.`title` ОТ членов ,фильмы ГДЕ фильмы.`id` = Members.`movie_id`
Выполнение приведенного выше сценария дает
имя_имя фамилия заголовок Адам Смит Кредо Убийцы: ТЕМНИ Рави Кумар Настоящая сталь (2012) Сьюзен Дэвидсон Сейф (2012) Дженни Адрианна Крайний срок (2009) Ли Понг Марли и я
Обратите внимание, что приведенный выше сценарий результатов можно также написать следующим образом для достижения тех же результатов.
ВЫБЕРИТЕ A.`first_name`, A.`last_name`, B.`title` ОТ `участников`AS A ВНУТРЕННЕЕ СОЕДИНЕНИЕ `фильмы` AS B ON B.`id` = A.`movie_id`
Внешние соединения
Внешние соединения MySQL возвращают все совпадающие записи из обеих таблиц.
Может обнаруживать записи, не имеющие совпадения в объединенной таблице. Он возвращает NULL значений для записей объединенной таблицы, если совпадений не найдено.
Звучит запутанно? Давайте рассмотрим пример —
LEFT JOIN
Теперь предположим, что вы хотите получить названия всех фильмов вместе с именами участников, взявших их напрокат. Понятно, что некоторые фильмы никто не брал в прокат. Мы можем просто использовать LEFT JOIN для этой цели.
LEFT JOIN возвращает все строки из таблицы слева, даже если в таблице справа не найдено совпадающих строк. Если в таблице справа не найдено совпадений, возвращается NULL.
ВЫБЕРИТЕ A.`title`, B.`first_name`, B.`last_name` ИЗ `кино` КАК А LEFT JOIN `members` КАК B ON B.`movie_id` = A.`id`
Выполнение приведенного выше сценария в рабочей среде MySQL дает. Вы можете видеть, что в возвращаемом результате, который указан ниже, для фильмов, которые не взяты напрокат, поля имени участника имеют значения NULL. . Это означает, что ни один соответствующий элемент не нашел таблицу участников для этого конкретного фильма.
Примечание. Для несовпадающих строк справа возвращается значение null.
название имя_имя фамилия Кредо Убийцы: ТЕМНИ Адам Смит Настоящая сталь (2012) Рави Кумар Сейф (2012) Сьюзан Дэвидсон Крайний срок (2009) Дженни Адрианна Марли и я Ли Понг Элвин и бурундуки НУЛЕВОЙ НУЛЕВОЙ Приключения Тин Тин НУЛЕВОЙ НУЛЕВОЙ Убежище (2012) НУЛЕВОЙ НУЛЕВОЙ ГИА НУЛЕВОЙ НУЛЕВОЙ Грязная картинка НУЛЕВОЙ НУЛЕВОЙ
ПРАВОЕ СОЕДИНЕНИЕ
ПРАВОЕ СОЕДИНЕНИЕ, очевидно, противоположно ЛЕВОМУ СОЕДИНЕНИЮ. ПРАВОЕ СОЕДИНЕНИЕ возвращает все столбцы из таблицы справа, даже если в таблице слева не найдено совпадающих строк. Если в таблице слева не найдено совпадений, возвращается NULL.
В нашем примере предположим, что вам нужно получить имена участников и фильмы, взятые ими напрокат. Теперь у нас есть новый участник, который еще не взял ни одного фильма напрокат
ВЫБЕРИТЕ A.`first_name`, A.`last_name`, B.`title` ОТ `членов` КАК А ПРАВО ПРИСОЕДИНЯЙТЕСЬ к фильму КАК Б ON B.`id` = A.`movie_id`
Выполнение вышеуказанного скрипта в рабочей среде MySQL дает следующие результаты.
Примечание. Для несовпадающих строк слева возвращается значение null.
имя_имя фамилия заголовок Адам Смит Кредо Убийцы: ТЕМНИ Рави Кумар Настоящая сталь (2012) Сьюзен Дэвидсон Сейф (2012) Дженни Адрианна Крайний срок (2009) Ли Понг Марли и я ПУСТО НУЛЕВОЙ Элвин и бурундуки ПУСТО НУЛЕВОЙ Приключения Тин Тин ПУСТО НУЛЕВОЙ Убежище (2012) ПУСТО НУЛЕВОЙ ГИА ПУСТО НУЛЕВОЙ Грязная картинка
Предложения «ON» и «USING»
В приведенных выше примерах запроса JOIN мы использовали предложение ON для сопоставления записей между таблицами.
Предложение USING также может использоваться для той же цели. Разница с USING заключается в том, что должны иметь одинаковые имена для совпадающих столбцов в обеих таблицах.
В таблице «movies» до сих пор мы использовали ее первичный ключ с именем «id». Мы ссылались на него в таблице «members» с именем «movie_id».
Давайте переименуем поле «id» таблицы «фильмы», чтобы оно имело имя «movie_id». Мы делаем это для того, чтобы иметь одинаковые совпадающие имена полей.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Далее давайте используем USING с приведенным выше примером LEFT JOIN.
ВЫБЕРИТЕ A.`title`, B.`first_name`, B.`last_name` ИЗ `кино` КАК А LEFT JOIN `members` КАК B USING (`movie_id`)
Помимо использования ON и USING с соединениями вы можете использовать многие другие предложения MySQL, такие как GROUP BY, WHERE и даже такие функции, как SUM , AVG и т. д.
Почему мы должны использовать соединения?
Теперь вы можете подумать, почему мы используем JOIN, когда мы можем выполнять ту же задачу, выполняя запросы. Особенно, если у вас есть некоторый опыт программирования баз данных, вы знаете, что мы можем запускать запросы один за другим, использовать вывод каждого в последовательных запросах. Конечно, это возможно. Но используя JOIN, вы можете выполнить работу, используя только один запрос с любыми параметрами поиска. С другой стороны MySQL может повысить производительность с помощью JOIN, так как он может использовать индексирование. Простое использование одного запроса JOIN вместо выполнения нескольких запросов снижает нагрузку на сервер. Вместо этого использование нескольких запросов приводит к большему количеству передач данных между MySQL и приложениями (программным обеспечением). Кроме того, требуется больше манипуляций с данными в конце приложения.
Ясно, что мы можем добиться лучшей производительности MySQL и приложений с помощью JOIN.
Резюме
- СОЕДИНЕНИЯ позволяют нам объединять данные из более чем одной таблицы в один набор результатов.
- JOINS имеют лучшую производительность по сравнению с подзапросами
- ВНУТРЕННИЕ СОЕДИНЕНИЯ возвращают только те строки, которые соответствуют заданным критериям.
- OUTER JOINS также может возвращать строки, в которых не было найдено совпадений. Несопоставленные строки возвращаются с ключевым словом NULL.
- Основные типы JOIN включают Inner, Left Outer, Right Outer, Cross JOINS и т. д.
- Часто используемое предложение в операциях JOIN — «ON». Предложение «USING» требует, чтобы соответствующие столбцы имели одно и то же имя.
- JOINS также можно использовать в других предложениях, таких как GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS и т. д.
.
SQL JOIN — Расширенный SQL
Этот урок охватывает, пожалуй, самый важный элемент языка SQL: операцию SQL JOIN
. Как известно, база данных хранит данные в нескольких таблицах. Когда вам нужно объединить данные из нескольких таблиц, вы выполняете JOIN между таблицами, в которых хранятся данные.
В этой статье представлены примеры использования предложения SQL JOIN
.
Образцы таблиц
Есть две примерные таблицы: туры
и города
.
Таблица туров
Tour_Name | Лучший сезон | Цена | Продолжительность (дни) |
---|---|---|---|
США и Канада | с марта по сентябрь | 3600 | 8 |
Крупные города США | Весь год | 4300 | 12 |
Африканский тур | Весь год | 2100 | 7 |
Пляжи Бразилии | с декабря по март | 1800 | 8 |
Таблица городов
City_Name | Тип_города | Tour_Name | Дней Постановка |
---|---|---|---|
Вашингтон | культура | США и Канада | 5 |
Вашингтон | культура | Большие города США | 5 |
Каир | культура | Африканский тур | 4 |
Рио-де-Жанейро | пляж | Пляжи Бразилии | 4 |
Йоханнесбург | сафари | Африканский тур | 3 |
Флорианополис | пляж | Пляжи Бразилии | 4 |
Квебек | культура | США и Канада | 3 |
Нью-Йорк | культура | Большие города США | 7 |
Чтобы использовать предложение JOIN
для объединения двух таблиц, в обеих таблицах должен быть общий столбец. В этой базе столбец имя_тура
. Общий столбец легко идентифицировать, потому что он имеет одинаковое имя в обеих таблицах. В других базах данных вы должны смотреть на значения, так как общий столбец может иметь разные имена. Важным моментом являются значения столбцов, поскольку оператор JOIN создает пары записей для тех записей, которые имеют одинаковое значение в общем столбце.
Представлены два типа операторов JOIN
: INNER JOIN
и LEFT OUTER JOIN
.
SQL Оператор ВНУТРЕННЕГО СОЕДИНЕНИЯ
Вот простой запрос SQL JOIN
для получения пар:
ВЫБРАТЬ имя_тура, лучший_сезон, цена, название города, тип_города, days_staging ИЗ туров ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ городов НА tours.tour_name = city.tour_name
Как создается пара записей оператором SQL INNER JOIN
?. Для каждой записи в первой таблице ( туров
), каждой записи во второй таблице ( города
), имеющие одинаковое значение в столбцах, указанных в предложении ON ( имя_тура
), сопоставляется с записью из первой таблицы.
Вот результат:
имя_тура | лучший_сезон | цена | имя_города | тип_города | дней_постановка |
---|---|---|---|---|---|
США Канада | с марта по сентябрь | 3600 | Квебек | культура | 3 |
США Канада | с марта по сентябрь | 3600 | Вашингтон | культура | 5 |
Крупные города США | Весь год | 4300 | Нью-Йорк | культура | 7 |
Крупные города США | Весь год | 4300 | Вашингтон | культура | 5 |
Африканский тур | Весь год | 2100 | Йоханнесбург | сафари | 3 |
Африканский тур | Весь год | 2100 | Каир | сафари | 4 |
Пляжи Бразилии | с декабря по март | 1800 | Флорианополис | пляж | 4 |
Пляжи Бразилии | с декабря по март | 1800 | Рио-де-Жанейро | пляж | 4 |
Предположим, вы хотите узнать, какие туры доступны для культурного города менее чем за 3000 долларов.
Вот запрос:
ВЫБРАТЬ имя_тура, цена ИЗ туров ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ городов НА tours.tour_name = city.tour_name ГДЕ цена < 3000 И type_of_city = «культура»
Результат:
имя_тура | цена |
---|---|
Тур по Африке | 2100.00 |
Оператор SQL OUTER JOIN
В некоторых случаях запись в первой таблице не имеет дублирующей записи во второй таблице, чтобы образовать пару. Например, может быть tour_name
, не связанный ни с одним городом, возможно, потому, что это тур в джунгли или недельное морское путешествие.
Вот новая версия таблицы туры
:
Tour_Name | Лучший сезон | Цена | Продолжительность (дни) |
---|---|---|---|
США и Канада | с марта по сентябрь | 3600 | 8 |
Крупные города США | Весь год | 4300 | 12 |
Африканский тур | Весь год | 2100 | 7 |
Пляжи Бразилии | с декабря по 9 марта0031 | 1800 | 8 |
Карибы: неделя плавания | с мая по октябрь | 5300 | 7 |
5 дней в джунглях Амазонаса | Весь год | 900 | 5 |
Если вы хотите получить список доступных туров, вы можете выполнить первый INNER JOIN
еще раз:
ВЫБРАТЬ имя_тура, лучший_сезон, цена, название города, тип_города, days_staging ИЗ туров ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ городов НА tours. tour_name = city.tour_name
Туры Карибское море: неделя плавания и 5 дней в джунглях Амазонки не возвращаются в результатах, так как нет связанного города.
имя_тура | лучший_сезон | цена | имя_города | type_of_city | дней_постановка |
---|---|---|---|---|---|
США Канада | с марта по сентябрь | 3600 | Квебек | культура | 3 |
США Канада | с марта по сентябрь | 3600 | Вашингтон | культура | 5 |
Крупные города США | Весь год | 4300 | Нью-Йорк | культура | 7 |
Крупные города США | Весь год | 4300 | Вашингтон | культура | 5 |
Африканский тур | Весь год | 2100 | Йоханнесбург | сафари | 3 |
Африканский тур | Весь год | 2100 | Каир | сафари | 4 |
Пляжи Бразилии | с декабря по март | 1800 | Флорианополис | пляж | 4 |
Пляжи Бразилии | с декабря по март | 1800 | Рио-де-Жанейро | пляж | 4 |
Чтобы включить другие туры, используйте SQL LEFT OUTER JOIN
.