Использование оператора INNER JOIN
Об объекте
Учебные материалы
Правила описания синтаксиса команд SQL
Выборка данных
Сортировка выбранных данных
Фильтрация данных (предложение WHERE)
Создание вычисляемых полей
Агрегирующие функции
Итоговые данные (предложение GROUP BY)
Объединение таблиц
Внутреннее объединение
Использование предложения WHERE
Использование оператора INNER JOIN
Внешние объединения
Подзапросы
Комбинированные запросы
Вопросы для самопроверки
Практические задания
Список литературы
Приложение
Использование оператора INNER JOIN
Синтаксис оператора SELECT для выполнения операции внутреннего объединения имеет вид:
SELECT [DISTINCT] [<table1>.
FROM <table1> [INNER] JOIN <table2> [таблица_1.]
ON <column_name><join_condition>…][таблица_2.]<column_name>
Оператор SELECT здесь точно такой же, как и при использовании предложения WHERE, но предложение FROM другое. Здесь отношение между двумя таблицами является частью предложения FROM, указанного как INNER JOIN. При использовании такого синтаксиса предложение объединения указывается с использованием специального предложения ON вместо предложения WHERE. Фактическое предложение, передаваемое в ON, то же самое, которое передавалось бы в предложение WHERE*.
Ниже представлены запросы из предыдущего раздела, написанные с применением INNER JOIN.
Примеры Получить список клиентов из Сиэтла, с указанием номеров действующих договоров.SQL:
SELECT contract_id, lastname, name
FROM tbl_clients
JOIN tbl_contract ON tbl_clients.client_id = tbl_contract.client_id
WHERE
retire_date IS NULL AND region=’Seattle’
Подсчитать количество договоров, заключенных на пользование каждой из предлагаемых услуг. Полученный список отсортировать по названию услуги.
SQL:
SELECT service, СOUNT(contract_id)
ROM tbl_service
INNER JOIN tbl_contract ON tbl_service.service_id =
tbl_contract.service_id
WHERE retire_date IS NULL
GROUP
BY service
Получить список клиентов и услуг, с указанием номеров договоров. Список отсортировать по фамилиям клиентов.
SQL:
SELECT lastname, name, contract_id, service
FROM tbl_service
INNER
JOIN tbl_contract ON tbl_service. service_id = tbl_contract.service_id
INNER JOIN
tbl_clients ON tbl_contract.client_id=tbl_clients.client_id
WHERE retire_date IS NULL ORDER BY lastname
Вычислить сумму, которую должен платить каждый клиент за пользование услугами.
SQL:
SELECT lastname, name, SUM(price)
FROM tbl_service
INNER JOIN tbl_contract ON tbl_service.service_id =
tbl_contract.service_id
INNER JOIN
tbl_clients ON tbl_contract.client_id=tbl_clients.client_id
GROUP BY lastname ORDER BY lastname
* — Согласно спецификации ANSI, для создания объединений предпочтительнее использовать синтаксис INNER JOIN
« Previous | Next »
Выборка данных из нескольких слоев
Как уже упоминалось выше, в системе ZuluGIS допускается выборка данных из нескольких слоев карты. При этом в результате такой выборки будет выведена таблица с декартовым пересечением запрошенных полей перечисленных слоев. Дополнительные возможности по управлению выборками из нескольких слоев предоставляет конструкция JOIN, располагающаяся в команде выборки после ключевого слоя FROM, но перед ключевыми словами WHERE, GROUP BY
В системе ZuluGIS предусмотрено несколько вариантов использования данной конструкции, каждый из которых имеет свои особенности и область применения:
INNER JOIN (внутреннее соединение)
Каждая запись данных первого слоя сопоставляется с каждой записью другого слоя на предмет выполнения условия соединения (например, выполнения условия пространственного соответствия для объектов соединяемых слоев) и выводятся все соответствующие условию записи.
Конструкция имеет следующий синтаксис: [INNER] JOIN <Слой>
ON <Условие>
, где <Слой>
— слой добавляемый к
выборке, а <Условие>
— логическое выражение по которому проводится
отбор полей. Ключевое слово INNER необязательно и может быть опущено в
команде выборки.
По результату, конструкция внутреннего соединения аналогична применению условия (с помощью ключевого слова WHERE) к выборке по нескольким слоям.
Пример применения INNER JOIN
SELECT b.Sys AS Здание, k.Sys AS Квартал FROM Здания AS b INNER JOIN Кварталы AS k ON b.Geometry.STWithin(k.geometry) ORDER BY 2
В результате данной команды выборки (конструкция b.Geometry.STWithin(k.
проверяет не находится ли объект слоя Здания
геометрически внутри объекта слоя Кварталы
, (см. «Работа с пространственными данными в
запросах») будут выведены значения полей Sys
для всех
пар объектов слоев Здание
и Квартал
в которых объект
слоя Здание
находится внутри объекта слоя Кварталы
.
Результаты сортируются по второму столбцу таблицы.
Аналогичных результатов можно добиться с использованием ключевого слова WHERE
SELECT b.Sys AS Здание, k.Sys AS Квартал FROM Здания AS b, Кварталы AS k WHERE b.Geometry.STWithin(k.geometry) ORDER BY 2
CROSS JOIN (перекрестное соединение)
Результаты применения данной конструкции в команде полностью аналогичны перечислению
названий двух слоев после ключевого слова FROM. В таблице, отображаемой в
результате выполнения выборки выводится декартово пересечение записей, в запросе будет набор
записей со всеми возможными комбинациями полей из записей первого и второго слоя, т.е.,
например при запросе поля А
из слоя содержащего 2 записи и запросе поля B
из слоя также содержащего две записи, в итоговой таблице будет четыре
записи со следующими данными: A1+B1, A1+B2, A2+B1, A2+B2
.
Конструкция имеет синтаксис CROSS JOIN <Слой>
.
Пример применения CROSS JOIN
SELECT * FROM Здания CROSS JOIN Кварталы
В результате выполнения команды выборки будут выведено декартово пересечение полей БД
слоев Здания
Кварталы
.Такой же результат будет при выполнении следующей команды выборки:
SELECT * FROM Здания, Кварталы
OUTER JOIN (внешнее соединение)
Как и в других вариантах использования конструкции JOIN в команде выборки задаются два слоя. Один после ключевого слова FROM и еще один, — в конструкции JOIN.
В результате выполнения команды выборки для одного из заданных слоев (назовем его основным) выводятся значения для всех его записей, а для другого слоя (назовем его дополнительным) выводятся только значения для записей соответствующих записям основного слоя по условию заданному в конструкции JOIN.
В системе ZuluGIS предусмотрено два варианта использования конструкции OUTER JOIN : LEFT OUTER JOIN (левое соединение) и RIGHT OUTER JOIN (правое соединение). В первом случае основным слоем считается слой задаваемый после ключевого слоя FROM, а во-втором — задаваемый в конструкции JOIN.
Конструкция имеет синтаксис LEFT|RIGHT [OUTER] JOIN <Слой>
ON <Условие>
, где LEFT|RIGHT — вид используемого
соединения, <Слой>
— слой добавляемый к выборке, а <Условие>
— логическое выражение по которому проводится отбор
полей. Ключевое слово OUTER необязательно и может быть опущено в команде
выборки.
Пример применения OUTER JOIN
SELECT b.sys AS Здание, k.sys AS Квартал FROM Здания AS b LEFT JOIN Кварталы AS k ON b.Geometry.STOverlaps(k.Geometry)
В результате выполнения команды выборки (конструкция b.Geometry.STOverlaps(k.Geometry)
проверяет, не пересекается ли геометрически
объект слоя Здания
с объектом слоя Кварталы
)
будут выведены поля Sys
для всех объектов слоя Здания
и поля Sys
объектов слоя Кварталы
пересекаемых объектами слоя Здания
.
Если же выполнить команду:
SELECT b.sys AS Здание, k.sys AS Квартал FROM Здания AS b RIGHT JOIN Кварталы AS k ON b. Geometry.STOverlaps(k.geometry)
То будут выведены поля Sys
для всех объектов слоя Кварталы
, а для слоя Здания
будут выведены
только Sys
объектов пересекающих границы объектов слоя Кварталы
.
В команде выборки может последовательно использоваться несколько конструкций JOIN, в результате чего будет выполнено соединение полей из нескольких
заданных слоев. Например, команда выборки SELECT * FROM Здания CROSS JOIN Кварталы CROSS
JOIN Надписи
формирует таблицу с декартовым пересечением всех трех перечисленных
слоев.
Как объединять таблицы с помощью объединения в SQL
Таблицы SQL позволяют пользователю хранить более 30 типов данных с использованием различных атрибутов. А для того, чтобы получить представление и извлечь полезную информацию, данные извлекаются из более чем одной таблицы. Различные категории соединений в SQL позволяют объединять данные из нескольких таблиц в соответствии с вашими требованиями.
Что такое объединение в SQL?
В SQL существует множество категорий соединений, которые позволяют пользователям объединять строки из двух или более таблиц на основе различных типов условий в соответствии с нашими требованиями. Эти различные типы соединений в SQL подробно объясняются ниже.
Различные типы соединений в SQL
SQL дает возможность выбора из следующих семи типов соединений:
Натуральное соединение
Используется для объединения таблиц на основе общего столбца
Декартово соединение
Возвращает декартово произведение строк таблицы
Внутреннее соединение
Таблица результатов состоит только из общих строк
Левое внешнее соединение
Таблица результатов содержит все строки из первой таблицы
Правое внешнее соединение
Таблица результатов содержит все строки из второй таблицы
Полное внешнее соединение
Таблица результатов содержит все строки из обеих таблиц
Самостоятельное соединение
Используется для присоединения таблицы к самой себе
Давайте более подробно рассмотрим все эти объединения в SQL.
Натуральное соединение
Это объединение используется для объединения строк таблиц на основе столбцов с одинаковыми именами и типами данных в обеих таблицах. Общие столбцы появляются в результате этого соединения только один раз.
Естественное соединение может использоваться для объединения двух или более таблиц, и его синтаксис выглядит следующим образом:
ВЫБЕРИТЕ столбец_1, столбец_2,... столбец_n ИЗ таблицы_1 ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ table_2;
Если вы хотите выполнить естественное соединение всей таблицы, вы можете использовать следующий синтаксис:
ВЫБРАТЬ * ИЗ таблицы_1 ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ table_2;
Например, если есть таблица «Сотрудник»:
И вы хотите Естественный Соедините его со следующей таблицей «Отдел»:
Вы должны использовать следующий запрос, чтобы соединить эти два:
ВЫБЕРИТЕ * ОТ Сотрудника Отдел ЕСТЕСТВЕННОГО СОЕДИНЕНИЯ;
Вот как выглядит результат:
Как видите, объединение было выполнено на основе общего столбца «EmployeeID», и строки, которые имели одинаковое значение для этого столбца в обеих таблицах, были объединены.
Декартово соединение
Декартово соединение, также известное как перекрестное соединение, возвращает декартово произведение соединяемых таблиц, которое является комбинацией каждой строки одной таблицы с каждой строкой другой таблицы. Например, если таблица A содержит 20 строк, а таблица B состоит из 30 строк, перекрестное соединение этих таблиц приведет к тому, что таблица будет содержать 20*30 (600) строк.
Синтаксис этого соединения следующий:
ВЫБЕРИТЕ table1.column_1, table1.column_2,... table2.column_1, table2.column_2… ИЗ таблица1, таблица2;
Если вы хотите объединить все столбцы из обеих таблиц, вы можете использовать следующий синтаксис:
ВЫБЕРИТЕ * ИЗ таблицы1, таблицы2;
Например, если вы хотите перекрестно объединить столбцы «EmployeeID», «Имя», «Название_отдела» и «Должность» из наших таблиц «Сотрудник» и «Отдел», используйте следующий запрос:
В результате получится следующая таблица:
Как видите, результирующая таблица состоит из 30 строк, так как в наших таблицах «Сотрудник» и «Отдел» 6 и 5 строк соответственно.
Внутреннее соединение
Используя внутреннее соединение, таблицы объединяются на основе условия, также известного как предикат соединения. Это условие применяется к столбцам обеих таблиц по обе стороны от предложения соединения. Запрос проверяет все строки таблиц table1 и table2. В результирующую таблицу включаются только те строки, которые удовлетворяют предикату соединения.
Это объединение возвращает все строки с совпадающими значениями в обеих таблицах.
Наиболее существенное различие между внутренним соединением и «естественным соединением» заключается в том, что общие столбцы появляются более одного раза, тогда как в результате естественного соединения они появляются только один раз. Основной синтаксис этого соединения:
ВЫБЕРИТЕ table1.column_1, table2.column_2… ИЗ таблицы1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблица2 ON table1.column_1 = table2.column_2;
Как видите, условие указано после оператора ON. Если условие не указано, это соединение ведет себя как «перекрестное соединение».
Например, если вы хотите объединить таблицы «Сотрудник» и «Отдел» на основе столбца «EmployeeID», вы должны использовать следующий запрос:
Вот как будет выглядеть финальная таблица:
Результирующая таблица содержит только три строки с одинаковым значением для столбца «EmployeeID» в обеих таблицах.
Левое внешнее соединение
Левое внешнее соединение, также известное как левое соединение, приводит к созданию таблицы, содержащей все строки из таблицы с левой стороны соединения (первая таблица) и только строки, удовлетворяющие условию соединения, из таблицы на правая сторона соединения (вторая таблица). Отсутствующие значения для строк из правой таблицы в результате соединения представлены значениями NULL.
Синтаксис этого соединения следующий:
ВЫБЕРИТЕ table1.column_1, table2.column_2,... ИЗ таблицы1 ЛЕВОЕ СОЕДИНЕНИЕ таблица2 ON table1.column_1 = table2.column_2;
Чтобы выполнить объединение всех столбцов таблиц, мы можем использовать * (звездочку) вместо имен столбцов.
Например, если вы хотите левое объединение таблиц «Сотрудник» и «Отдел» на основе столбца «EmployeeID», вы должны использовать следующий запрос:
В результате получится следующая таблица:
Как видите, в результате присутствуют все строки из нашей левой таблицы «Сотрудник», а из таблицы «Отдел» присутствуют только совпадающие строки, а значения NULL представляют остальные строки из этой правой таблицы.
Правое внешнее соединение
Правое внешнее соединение, также известное как правое соединение, работает по принципу, противоположному левому внешнему соединению. Он следует тем же правилам, что и левое соединение, с той лишь разницей, что в таблице результатов присутствуют все строки из правой таблицы и только строки из левой таблицы, удовлетворяющие условию.
Синтаксис этого объединения:
ВЫБЕРИТЕ table1.column_1, table2.column_2,... ИЗ таблицы1 ПРАВОЕ СОЕДИНЕНИЕ таблица2 ON table1.column_1 = table2. column_2;
Например, если вы хотите соединить столбцы «EmployeeID», «Город», «Должность» и «Название отдела» из наших таблиц «Сотрудник» и «Отдел» на основе столбца «EmployeeID», вы следует использовать следующий запрос:
В результате получится следующая таблица:
Как видите, этот результат противоположен результату левого соединения.
Полное внешнее соединение
Полное внешнее соединение, также известное как полное соединение, используется для предотвращения потери данных при объединении двух таблиц. В этом случае возвращаются все строки из обеих таблиц.
Если для какой-либо строки в любой из таблиц отсутствуют значения, они будут представлены как значения NULL в результате этого объединения в SQL.
Синтаксис этого объединения:
ВЫБЕРИТЕ table1.column_1, table2.column_2,... ИЗ таблицы1 ПОЛНОЕ СОЕДИНЕНИЕ таблица2 ON table1.column_1 = table2.column2;
Подобно «левому» и «правому» объединению, в этом случае мы также можем использовать * (звездочку) вместо столбцов, если мы хотим объединить все столбцы из обеих таблиц.
Некоторые системы баз данных, такие как MySQL, не поддерживают синтаксис полного соединения, поскольку это соединение может быть достигнуто путем выполнения операции UNION для левого и правого внешних соединений.
Например, если вы хотите соединить столбцы «Код сотрудника» и «Должность» из таблиц «Сотрудник» и «Отдел», на основе столбца «Код сотрудника» следует использовать следующий запрос.
В результате получится следующая таблица:
Как видите, все строки из обеих таблиц присутствуют в этой таблице результатов, а строки, содержащие пропущенные значения, в любой из таблиц представлены как значения NULL.
Самостоятельное соединение
С помощью этого соединения можно соединить таблицу с самой собой. Это используется, когда мы хотим сравнить значения разных столбцов одной и той же таблицы.
Таблица может быть самообъединена с помощью любого из рассмотренных выше соединений, таких как «внутреннее», «левое», «правое», «полное» или «декартово».
Синтаксис этого объединения:
ВЫБЕРИТЕ A.column_1, B.column_2,... ИЗ таблицы1 А JOIN_NAME таблица2 B ВКЛ [состояние]
«A» и «B» — псевдонимы для таблицы 1.
Например, в таблице «Сотрудник», если вы хотите узнать, какие сотрудники принадлежат к одному городу, вы можете использовать следующий запрос:
Здесь мы использовали другое условие, используя предложение «И», чтобы имена не появлялись дважды в таблице результатов.
Результатом запроса будет следующая таблица:
Как видим, только два сотрудника из одного города.
Получите опыт работы с новейшими инструментами и методами бизнес-аналитики с помощью программы «Бизнес-аналитика для принятия стратегических решений». Зарегистрируйтесь сейчас!
Ваш следующий шаг
Почти все реальные запросы данных выполняются с использованием соединения в SQL. Это очень простой, но мощный инструмент, доступный специалистам по данным и всем, кто хочет понимать данные и управлять ими.
И теперь, когда вы знаете о различных типах соединений в SQL, следующим шагом будет изучение того, как выполнять различные запросы к вашему набору данных с помощью всех различных типов команд и предложений, доступных для использования. нашу магистерскую программу для бизнес-аналитиков, изучите SQL от А до Я и глубоко погрузитесь в мир данных!
Если у вас есть какие-либо вопросы к нам, напишите их в разделе комментариев к нашей статье «Как объединить таблицы с помощью соединения в SQL», и наши эксперты в этой области ответят на них для вас.
СинтаксисJOIN — База знаний MariaDB
Описание
MariaDB поддерживает следующие синтаксисы JOIN
для
часть table_references
оператора SELECT
и
несколько столов DELETE
и UPDATE
операторы:
table_references: таблица_ссылка [ таблица_ссылка] ... таблица_ссылка: таблица_фактор | join_table таблица_фактор: имя_таблицы [РАЗДЕЛ (список_разделов)] [query_system_time_period_specification] [[AS] псевдоним] [index_hint_list] | table_subquery [query_system_time_period_specification] [AS] псевдоним | ( таблица_ссылки ) | { ON table_reference ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ table_reference ON условное_выражение } присоединяемая_таблица: table_reference [ВНУТРЕННЯЯ | CROSS] JOIN table_factor [состояние_соединения] | table_reference STRAIGHT_JOIN table_factor | table_reference STRAIGHT_JOIN table_factor ON conditional_expr | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor условие_присоединения: ВКЛ условное_выражение | ИСПОЛЬЗОВАНИЕ (column_list) query_system_time_period_specification: ДЛЯ SYSTEM_TIME НА ТОЧКУ_В_ВРЕМЕНИ | ДЛЯ SYSTEM_TIME МЕЖДУ point_in_time И point_in_time | ЗА СИСТЕМНОЕ_ВРЕМЯ С момента_в_времени ДО момента_в_времени | ДЛЯ SYSTEM_TIME ВСЕХ точка_в_времени: [TIMESTAMP] выражение | ТРАНЗАКЦИЯ выражение index_hint_list: подсказка_индекса [ подсказка_индекса] . .. index_hint: ИСПОЛЬЗОВАТЬ {ИНДЕКС|КЛЮЧ} [{ДЛЯ {ПРИСОЕДИНЕНИЯ|ЗАКАЗАТЬ ПО|ГРУППИРОВАТЬ ПО}] ([список_индексов]) | ИГНОРИРОВАТЬ {ИНДЕКС|КЛЮЧ} [{FOR {JOIN|ORDER BY|GROUP BY}] (список_индексов) | ПРИНУДИТЕЛЬНО {ИНДЕКС|КЛЮЧ} [{FOR {JOIN|ORDER BY|GROUP BY}] (список_индексов) список_индексов: имя_индекса [ имя_индекса] ...
Ссылка на таблицу также известна как выражение соединения.
Каждая таблица также может быть указана как db_name
. имя_таблицы
. Это позволяет писать запросы, которые включают несколько баз данных. Подробные сведения о синтаксисе см. в разделе Квалификаторы идентификаторов.
Синтаксис table_factor
расширен по сравнению с
Стандарт SQL. Последний принимает только table_reference
, а не
список их внутри пары круглых скобок.
Это консервативное расширение, если мы рассмотрим каждую запятую в списке элементы table_reference как эквивалентные внутреннему соединению. Например:
ВЫБЕРИТЕ * ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ (t2, t3, t4) ВКЛ (t2.a=t1.a И t3.b=t1.b И t4.c=t1.c)
эквивалентно:
ВЫБРАТЬ * ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ (t2 ПОПЕРЕЧНОЕ СОЕДИНЕНИЕ t3 ПОПЕРЕЧНОЕ СОЕДИНЕНИЕ t4) ВКЛ (t2.a=t1.a И t3.b=t1.b И t4.c=t1.c)
В MariaDB CROSS JOIN
является синтаксическим эквивалентом ВНУТРЕННЕЕ СОЕДИНЕНИЕ
(они могут заменять друг друга). В стандартном SQL
они не эквивалентны. INNER JOIN
используется с НА
, в противном случае используется CROSS JOIN
.
Как правило, круглые скобки можно игнорировать в выражениях соединения, содержащих только операции внутреннего соединения. MariaDB также поддерживает вложенные соединения (см. http://dev.mysql.com/doc/refman/5.1/en/nested-join-optimization.html).
Дополнительную информацию см. в разделе Таблицы версий системы.
о синтаксисе FOR SYSTEM_TIME
.
Можно указать подсказки индекса, чтобы повлиять на то, как оптимизатор MariaDB делает использование индексов.