Команда UNION
Команда UNION объединяет данные из нескольких таблиц в одну при выборке. При объединении количество столбцов во всех таблицах должно совпадать, иначе будет ошибка Имена столбцов будут такие же, как в основной таблице, в которую добавляются данные из других таблиц.
Внимание: если не используется ключевое слово ALL для UNION, все возвращенные строки будут уникальными, так как по умолчанию подразумевается DISTINCT , который удаляет неуникальные значения. Чтобы отменить такое поведение — нужно указать ключевое слово ALL , вот так: UNION ALL.
Синтаксис
С удалением дублей:
SELECT * FROM имя_таблицы1 WHERE условие UNION SELECT * FROM имя_таблицы2 WHERE условие
Без удаления дублей:
SELECT * FROM имя_таблицы1 WHERE условие UNION ALL SELECT * FROM имя_таблицы2 WHERE условие
Можно объединять не две таблицы, а три или более:
SELECT * FROM имя_таблицы1 WHERE условие UNION SELECT * FROM имя_таблицы2 WHERE условие UNION SELECT * FROM имя_таблицы3 WHERE условие UNION SELECT * FROM имя_таблицы4 WHERE условие
Таблицы для примеров
| id айди |
name название |
|---|---|
| 1 | Беларусь |
| 2 | Россия |
| 3 | Украина |
| id айди |
name название |
country_id айди страны |
|---|---|---|
| 1 | Минск | 1 |
| 2 | Минск | 1 |
| 3 | Москва | 2 |
| 4 | Киев | 3 |
Пример
В данном примере объединяются записи из двух таблиц:
SELECT id, name FROM countries UNION ALL SELECT id, name FROM cities
Результат выполнения кода:
| id айди |
name название |
|---|---|
| 1 | Беларусь |
| 2 | Россия |
| 3 | Украина |
| 1 | Минск |
| 2 | Минск |
| 3 | Москва |
| 4 | Киев |
Пример
В данном примере отсутствует ключевое слово ALL, однако дубли не будут удалены, так как дублями считается полное совпадение строк:
SELECT id, name FROM countries UNION SELECT id, name FROM cities
Результат выполнения кода:
| id айди |
name название |
|---|---|
| 1 | Беларусь |
| 2 | Россия |
| 3 | Украина |
| 1 | Минск |
| 2 | Минск |
| 3 | Москва |
| 4 | Киев |
Пример
А вот теперь дубли будут удалены (из двух Минсков останется один), так как будет иметь место полное совпадение строк (потому что поле осталось одно, но это не обязательно):
SELECT name FROM countries UNION SELECT name FROM cities
Результат выполнения кода:
| name название |
|---|
| Беларусь |
| Россия |
| Украина |
| Минск |
| Москва |
| Киев |
Пример
А теперь добавим слово ALL — и дубли не будут удалятся:
SELECT name FROM countries UNION ALL SELECT name FROM cities
Результат выполнения кода:
| name название |
|---|
| Беларусь |
| Россия |
| Украина |
| Минск |
| Минск |
| Москва |
| Киев |
Пример
В данном примере демонстрируется работа условий WHERE в комбинации с UNION:
SELECT id, name FROM countries WHERE id>=2 UNION SELECT id, name FROM cities WHERE id<=2
Результат выполнения кода:
| id айди |
name имя |
|---|---|
| 2 | Россия |
| 3 | Украина |
| 1 | Минск |
| 2 | Минск |
Пример
Имена колонок берутся из первой таблицы (то есть имена колонок таблиц, подключенных через UNION нигде себя не проявят):
SELECT id as country_id, name as country_name FROM countries UNION SELECT id, name FROM cities
Результат выполнения кода:
| country_id айди |
country_name имя |
|
|---|---|---|
| 1 | Беларусь | |
| 2 | Россия | |
| 3 | Украина | |
| 1 | Минск | 1 |
| 2 | Минск | 1 |
| 3 | Москва | 2 |
| 4 | Киев | 3 |
Пример
Такой запрос выдаст ошибку, так как в таблицах не совпадает количество колонок:
SELECT id, name FROM countries UNION SELECT id, name, country_id FROM cities
И такой запрос тоже выдаст ошибку в нашем случае — количество колонок в обеих таблицах не совпадает:
SELECT * FROM countries UNION SELECT * FROM cities
Пример
Если нам очень надо забрать из какой-либо таблицы столько полей, что в другой таблице столько и нет, можно создавать дополнительные поля вручную.
К примеру, мы хотим забрать 3 поля из второй таблицы, а в первой таблице полей только 2 . Решим эту проблему создав поле с именем country_id и содержимым 0 для первой таблицы (вот так: 0 as country_id):
SELECT id, name, 0 as country_id FROM countries UNION SELECT id, name, country_id FROM cities
Результат выполнения кода:
| id айди |
name имя |
country_id айди страны |
|---|---|---|
| 1 | Беларусь | 0 |
| 2 | Россия | 0 |
| 3 | Украина | 0 |
| 1 | Минск | 1 |
| 2 | Минск | 1 |
| 3 | Москва | 2 |
| 4 | Киев | 3 |
Смотрите также
- команду JOIN ,
которая объединяет связанные таблицы
Как соединить 3 таблицы в sql
Чтобы соединить три таблицы в SQL, вы можете использовать оператор JOIN . Оператор JOIN объединяет две таблицы на основе общих столбцов, а при необходимости вы можете объединить несколько таблиц.
Для объединения трех таблиц вам нужно выполнить три операции JOIN . Рассмотрим пример:
SELECT t1.column1, t2.column2, t3.column3 FROM table1 t1 JOIN table2 t2 ON t1.column1 = t2.column1 JOIN table3 t3 ON t2.column2 = t3.column2;
Здесь мы объединяем три таблицы: table1, table2 и table3. Мы выбираем определенные столбцы из каждой таблицы, а затем используем оператор JOIN для объединения таблицы table1 и table2, а затем таблицы table2 и table3.
Обратите внимание, что для успешного объединения таблиц необходимо наличие общих столбцов в этих таблицах. Кроме того, если таблицы содержат дублирующиеся строки, то результатом объединения могут быть дублирующиеся строки. Чтобы исключить дубли, можно использовать оператор DISTINCT .
SQL — Урок 6. Объединение таблиц (внутреннее объединение)
Предположим, мы хотим узнать, какие темы, и какими авторами были созданы. Для этого проще всего обратиться к таблице Темы (topics):
Но, что если нам необходимо, чтобы в ответе на запрос были не идентификаторы авторов, а их имена? Вложенные запросы нам не помогут, т.к. в конечном итоге они выдают данные из одной таблицы. А нам надо получить данные из двух таблиц (Темы и Пользователи) и объединить их в одну. Запросы, которые позволяют это сделать, в SQL называются Объединениями.
Синтаксис самого простого объединения следующий:
SELECT имена_столбцов_таблицы_1, имена_столбцов_таблицы_2 FROM имя_таблицы_1, имя_таблицы_2;
Давайте создадим простое объединение:
Получилось не совсем то, что мы ожидали. Такое объединение научно называется декартовым произведением, когда каждой строке первой таблицы ставится в соответствие каждая строка второй таблицы. Возможно, бывают случаи, когда такое объединение полезно, но это явно не наш случай.
Чтобы результирующая таблица выглядела так, как мы хотели, необходимо указать условие объединения. Мы связываем наши таблицы по идентификатору автора, это и будет нашим условием. Т.е. мы укажем в запросе, что необходимо выводить только те строки, в которых значения поля id_author таблицы topics совпадают со значениями поля id_user таблицы users:
На схеме будет понятнее:
Т.е. мы в запросе сделали следующее условие: если в обеих таблицах есть одинаковые идентификаторы, то строки с этим идентификатором необходимо объединить в одну результирующую строку.
-
Если в одной из объединяемых таблиц есть строка с идентификатором, которого нет в другой объединяемой таблице, то в результирующей таблице строки с таким идентификатором не будет. В нашем примере есть пользователь Oleg (id=5), но он не создавал тем, поэтому в результате запроса его нет.
Вообще, корректный синтаксис объединения с условием выглядит так:
SELECT имя_таблицы_1.имя_столбца1_таблицы_1, имя_таблицы_1.имя_столбца2_таблицы_1, имя_таблицы_2.имя_столбца1_таблицы_2, имя_таблицы_2.имя_столбца2_таблицы_2 FROM имя_таблицы_1, имя_таблицы_2 WHERE имя_таблицы_1.имя_столбца_по_которому_объединяем = имя_таблицы_2.имя_столбца_по_которому_объединяем;
Если имя столбца уникально, то название таблицы можно опустить (как мы делали в примере), но делать это не рекомендуется.
Как вы понимаете, объединения дают возможность выбирать любую информацию из любых таблиц, причем объединяемых таблиц может быть и три, и четыре, да и условие для объединения может быть не одно.
Для примера давайте создадим запрос, который покажет нам все сообщения, к каким темам они относятся и авторов этих сообщений. Конечно, вся эта информация хранится в таблице Сообщения (posts):
Но чтобы вместо идентификаторов отображались имена и названия, нам придется сделать объединение трех таблиц:
Т.е. мы объединили таблицы Сообщения и Пользователи условием posts.id_author=users.id_user, а таблицы Сообщения и Темы — условием posts.id_topic=topics.id_topic
Объединения, которые мы сегодня рассматривали, называются Внутренними объединениями. Такие объединения связывают строки одной таблицы со строками другой таблицы (а может еще и третьей таблицы). Но бывают ситуации, когда необходимо, чтобы в результат были включены строки, не имеющие связанных. Например, когда мы создавали запрос, какие темы и какими авторами были созданы, пользователь Oleg в результирующую таблицу не попал, т.к. тем не создавал, а потому и связанной строки в объединяемой таблице не имел.
Поэтому, если нам потребуется составить несколько иной запрос — вывести всех пользователей и темы, которые они создавали, если таковые имеются — то нам придется воспользоваться Внешним объединением, позволяющим выводить все строки одной таблицы и имеющиеся связанные с ними строки из другой таблицы. О таких объединениях мы и будем говорить в следующем уроке.
Научись программировать на Python прямо сейчас!
- Научись программировать на Python прямо сейчас
- Бесплатный курс
Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.
Объединение таблиц с помощью операторов Join и Keep
Объединение — операция объединения двух таблиц в одну. Записи результирующей таблицы представляют собой комбинации записей в исходных таблицах. При этом две такие записи, составляющие одну комбинацию в результирующей таблице, как правило, имеют общее значение одного или нескольких общих полей. Такое объединение называется естественным. В программе Qlik Sense объединение может выполняться в скрипте, создавая логическую таблицу.
Таблицы, которые находятся в скрипте, можно объединять. Логика Qlik Sense будет распознавать не отдельные таблицы, а результаты объединения, которые будут представлены в одной внутренней таблице. В некоторых случаях это требуется, однако существуют недостатки:
- Загруженные таблицы часто становятся больше, и программа Qlik Sense работает медленнее.
- Некоторая информация может быть потеряна: частота (количество записей) в исходной таблице может быть больше недоступна.
Функция Keep , которая позволяет уменьшить одну или обе таблицы до пересечения данных таблиц перед сохранением таблиц в программу Qlik Sense , предназначена для уменьшения количества случаев, когда необходимо использовать явные объединения.
Примечание к информации В данном руководстве термин «объединение» обычно используется для объединений, выполненных до создания внутренних таблиц. Однако ассоциация, выполненная после создания внутренних таблиц, по сути, также является объединением.
Объединения внутри оператора SQL SELECT
При использовании некоторых драйверов ODBC можно выполнять объединение внутри оператора SELECT . Это практически эквивалентно созданию объединения с помощью префикса Join .
Однако большинство драйверов ODBC не позволяют сделать полное внешнее объединение (двунаправленное). Они позволяют сделать только левостороннее или правостороннее внешнее объединение. Левостороннее (правостороннее) внешнее объединение включает только сочетания, в которых в левой (правой) таблице существует ключ объединения. Полное внешнее объединение включает все сочетания. Программа Qlik Sense автоматически создает полное внешнее объединение.
Более того, создание объединений в операторах SELECT значительно сложнее, чем создание объединений в программе Qlik Sense .
[Order Details].ProductID, [Order Details].
UnitPrice, Orders.OrderID, Orders.OrderDate, Orders.CustomerID
RIGHT JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID;
Этот оператор SELECT позволяет объединить таблицу, содержащую заказы несуществующей компании, и таблицу, содержащую сведения о заказах. Это правостороннее внешнее объединение, то есть будут включены все записи OrderDetails и записи со значением OrderID , которое отсутствует в таблице Orders . Однако заказы, содержащиеся в таблице Orders , но не содержащиеся в OrderDetails , не будут включены.
Join
Самым простым способом создания объединения является использование префикса Join в скрипте, который позволяет объединять внутреннюю таблицу с другой именованной таблицей или последней созданной таблицей. Объединение будет внешним и позволит создать все возможные сочетания значений из двух таблиц.
LOAD a, b, c from table1.csv;
join LOAD a, d from table2.csv;
Результирующая внутренняя таблица имеет поля a , b , c и d . Количество записей различается в зависимости от значений полей этих двух таблиц.
Примечание к информации Имена объединяемых полей должны совпадать. Количество объединяемых полей может быть любым. Обычно в таблицах должно быть одно или несколько общих полей. При отсутствии общих полей будет рассматриваться декартово произведение таблиц. В принципе все поля могут быть общими, однако обычно в этом нет смысла. Пока имя ранее загруженной таблицы не будет указано в операторе Join , префиксом Join будет использоваться последняя созданная таблица. Поэтому порядок двух операторов не является произвольным.
Для получения дополнительной информации см. Join.
Keep
Явный префикс Join в скрипте загрузки данных выполняет полное объединение двух таблиц. В результате получается одна таблица. Во многих случаях такие объединения приводят к созданию очень больших таблиц. Одной из основных функций программы Qlik Sense является способность к связыванию таблиц вместо их объединения, что позволяет сократить использование памяти, повысить скорость обработки и гибкость. Функция keep предназначена для сокращения числа случаев необходимого использования явных объединений.
Префикс Keep между двумя операторами LOAD или SELECT приводит к уменьшению одной или обеих таблиц до пересечения их данных перед сохранением таблиц в программе Qlik Sense . Перед префиксом Keep следует задать одно из ключевых слов: Inner , Left или Right . Выборка записей из таблицы осуществляется так же, как и при соответствующем объединении. Однако две таблицы не объединяются и сохраняются в программе Qlik Sense в виде двух отдельных именованных таблиц.
Для получения дополнительной информации см. Keep.
Inner
Перед префиксами Join и Keep в скрипте загрузки данных можно использовать префикс Inner .
При использовании этого префикса перед префиксом Join объединение двух таблиц будет внутренним. Полученная таблица содержит только сочетания из двух таблиц, включающие полный набор данных с обеих сторон.
Если этот префикс используется перед Keep , он указывает, что две таблицы следует уменьшить до области взаимного пересечения, прежде чем они смогут быть сохранены в программе Qlik Sense .
В этих таблицах используются исходные таблицы Table1 и Table2 :
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Inner Join
Сначала выполняется Inner Join в отношении таблиц, в результате чего образуется таблица VTable , содержащая только одну строку, только одну запись, существующую в обеих таблицах, с данными из обеих таблиц.
SELECT * from Table1;
inner join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
Inner Keep
Если вместо этого выполняется Inner Keep , таблиц все равно будет две. Две таблицы связаны посредством общего поля A .
SELECT * from Table1;
inner keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| A | C |
|---|---|
| 1 | xx |
Для получения дополнительной информации см. Inner.
Left
Перед префиксами Join и Keep в скрипте загрузки данных можно использовать префикс left .
При использовании этого префикса перед префиксом Join объединение двух таблиц будет левосторонним. Полученная таблица содержит только сочетания из двух таблиц, включающие полный набор данных из первой таблицы.
Если этот префикс используется перед префиксом Keep , он указывает, что вторую таблицу следует уменьшить до области взаимного пересечения с первой таблицей перед сохранением в программе Qlik Sense .
В этих таблицах используются исходные таблицы Table1 и Table2 :
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Сначала выполняется Left Join в отношении таблиц, в результате чего образуется таблица VTable , содержащая все строки из таблицы Table1 , совмещенные с полями из совпадающих строк в таблице Table2 .
SELECT * from Table1;
left join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
| 2 | cc | — |
| 3 | ee | — |
Если вместо этого выполняется Left Keep , таблиц все равно будет две. Две таблицы связаны посредством общего поля A .
SELECT * from Table1;
left keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
Для получения дополнительной информации см. Left.
Right
Перед префиксами Join и Keep в скрипте загрузки данных можно использовать префикс right .
При использовании этого префикса перед префиксом Join объединение двух таблиц будет правосторонним. Полученная таблица содержит только сочетания из двух таблиц, включающие полный набор данных из второй таблицы.
Если этот префикс используется перед префиксом Keep , он указывает, что первую таблицу следует уменьшить до области взаимного пересечения со второй таблицей перед сохранением в программе Qlik Sense .
В этих таблицах используются исходные таблицы Table1 и Table2 :
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Сначала выполняется Right Join в отношении таблиц, в результате чего образуется таблица VTable , содержащая все строки из таблицы Table2 , совмещенные с полями из совпадающих строк в таблице Table1 .
SELECT * from Table1;
right join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
| 4 | — | yy |
Если вместо этого выполняется Right Keep , таблиц все равно будет две. Две таблицы связаны посредством общего поля A .
SELECT * from Table1;
right keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Для получения дополнительной информации см. Right.