SQL Оператор UNION. Sql union примеры
SQL Оператор UNION
Оператор SQL UNION объединяет результат двух или более заявлений на SELECT.
SQL UNION Оператор
Оператор UNION используется для объединения множества результатов двух или более заявлений на SELECT.
Обратите внимание на то, что каждый оператор ЗЕЬЕСТ внутри Союза должны иметь одинаковое число столбцов. Столбцы также должны иметь одинаковые типы данных. Кроме того, столбцы в каждом ЗЕЬЕСТ должны быть в том же самом порядке.
SQL UNION Синтаксис
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2 ;
Note: Оператор UNION выбирает только различные значения по умолчанию. Чтобы разрешить повторяющиеся значения, используйте ключевое слово ALL с UNION.
SQL UNION ALL Синтаксис
SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2 ;
PS: Имена столбцов в результатах запросов, союзной, как правило , равны именам столбцов в первом ЗЕЬЕСТ в Союзе.
Демо-версия базы данных
В этом уроке мы будем использовать хорошо известную базу данных Борей.
Ниже приводится подборка из "Customers" таблицы:
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitucion 2222 | Mexico D.F. | 05021 | Mexico |
3 | Antonio Moreno Taqueria | Antonio Moreno | Mataderos 2312 | Mexico D.F. | 05023 | Mexico |
И выбор из "Suppliers" таблицы:
1 | Экзотические Liquid | Шарлотта Купер | 49 Гилберта St. | Лондон | EC1 4SD | Великобритания |
2 | Новый Орлеан Cajun наслаждений | Shelley Берк | PO Box 78934 | Жители Нового Орлеана | 70117 | США |
3 | Homestead Бабушка Келли | Regina Мерфи | 707 Oxford Rd. | Ann Arbor | 48104 | США |
SQL UNION Пример
Следующий SQL - оператор выбирает все различные города (только отдельные значения) от "Customers" и "Suppliers" таблиц:
Note: UNION не может быть использован для просмотра списка всех городов из двух таблиц. Если несколько клиентов и поставщиков, одни и те же города, каждый город будет указан только один раз. UNION выбирает только определенные значения. Использование UNION ALL также выбрать повторяющиеся значения!
SQL UNION ALL Пример
Следующий SQL - оператор использует UNION ALL для выбора всех (значения дубликатов) также городов от "Customers" и "Suppliers" таблиц:
SQL UNION ALL С WHERE
Следующий SQL - оператор использует UNION ALL для выбора всех (значения дубликатов) также немецкие города от "Customers" и "Suppliers" таблиц:
пример
SELECT City, Country FROM CustomersWHERE Country='Germany'UNION ALL SELECT City, Country FROM SuppliersWHERE Country='Germany'ORDER BY City;
www.w3bai.com
Объяснение работы SQL UNION на примере диаграмм Венна - Базы данных, знаний и хранилища данных. Big data, СУБД и SQL и noSQL
The SQL UNION operator combines the results of two or more queries and makes a result set which includes fetched rows from the participating queries in the UNION.
Table of contents :
- Basic Rules
- Difference between SQL JOIN and UNION
- SQL: UNION ALL
- SQL: UNION ALL using where
- SQL: UNION a table to itself
- SQL: UNION with different column names
- SQL: UNION with Inner Join
- SQL: Union vs Union All
Basic rules for combining two or more queries using UNION
Basic rules for combining two or more queries using UNION :
1.) number of columns and order of columns of all queries must be same.
2.) the data types of the columns on involving table in each query must be same or compatible.
3.) Usually returned column names are taken from the first query.
By default the UNION behalves like UNION [DISTINCT] , i.e. eliminated the duplicate rows; however, using ALL keyword with UNION returns all rows, including duplicates.
Difference between SQL JOIN and UNION
1.) The columns of joining tables may be different in JOIN but in UNION the number of columns and order of columns of all queries must be same.
2.) The UNION puts rows from queries after each other( puts vertically ) but JOIN puts the column from queries after each other (puts horizontally), i.e. it makes a cartesian product.
Syntax
- SELECT <column_list>t [INTO ]
- [FROM ] [WHERE ]
- [GROUP BY ] [HAVING ]
- [UNION [ALL]
- SELECT <column_list>
- [FROM ] [WHERE ]
- [GROUP BY ] [HAVING ]...]
- [ORDER BY ]
The queries are all executed independently but their output is merged.
In the following example no clause have been added with UNION, so, by default UNION is acting as UNION [DISTINCT] and only the unique rows are available in the result set.
Sample table : product
Sample table : purchase
- SELECT prod_code,prod_name
- FROM product
- UNION
- SELECT prod_code,prod_name
- FROM purchase;
Output
Pictorial Representation
Go Top
SQL UNION ALL
In the following example the optional clause ALL have been added with UNION for which, all the rows from each query have been available in the result set. Here in the above output the marking rows are non-unique but it has been displayed. If ignored ALL clause, the marking rows would have come once.
- SELECT prod_code,prod_name,com_name
- FROM product
- UNION ALL
- SELECT prod_code,prod_name,com_name
- FROM purchase;
Output
SQL UNION ALL using where
In the following example the two queries have been set using two different criterias including WHERE clause. So all the retrieve rows (including duplicates) have displayed in the result set. Here in this example the marking rows are identical, but it has been displayed for the ALL clause along with UNION. If ignored ALL clause the marking rows would have come once.
- SELECT prod_code,prod_name,com_name
- FROM product
- WHERE life>6
- UNION ALL
- SELECT prod_code,prod_name,com_name
- FROM purchase
- WHERE pur_qty>10
Output
Go Top
SQL UNION a table to itself
In the following example the two queries have been set using two different criterias for a same table. So all the retrieved rows ( including duplicates ) have displayed. Here in this example the marking rows are identical, but it has been displayed for the ALL clause along with UNION.
- SELECT prod_code,prod_name,com_name
- FROM purchase
- WHERE pur_qty>6
- UNION ALL
- SELECT prod_code,prod_name,com_name
- FROM purchase
- WHERE pur_amount>100000
SQL UNION with different column names
In the following example the two queries have been set using two different criterias and different columns. The different columns in two statements are 'life' and 'pur_qty'. But as the data type are same for both the columns so, result have displayed. Usually returned column names are taken from the first query.
- SELECT prod_code,prod_name,life
- FROM product
- WHERE life>6
- UNION
- SELECT prod_code,prod_name,pur_qty
- FROM purchase
- WHERE pur_qty<20
Output
Go Top
SQL UNION with Inner Join
In the following example the union made by two queries. The queries are two inner join statement. In the first query the join take place between two tables where the prod_code of both tables are same and in the 2nd query the join take place between two tables where the prod_name of both tables are same.
- SELECT product.prod_code,product.prod_name,
- purchase.pur_qty, purchase.pur_amount
- FROM product
- INNER JOIN purchase
- ON product.prod_code =purchase.prod_code
- UNION
- SELECT product.prod_code,product.prod_name,
- purchase.pur_qty, purchase.pur_amount
- FROM product
- INNER JOIN purchase
- ON product.prod_name =purchase.prod_name;
Output
SQL: Union vs Union All
The basic difference between UNION and UNION ALL is, UNION removes duplicate records but UNION ALL does not. Let apply these two commands on two tables table1 and table2.
Rows in table1 :
Rows in table2 :
UNION Example (Removes all duplicate records) :
- select field1
- from table1
- UNION
- select field1
- from table2;
Output
UNION ALL Example :
- select field1
- from table1
- UNION ALL
- select field1
- from table2;
Output
Outputs of the said SQL statement shown here is taken by using Oracle Database 10g Express Edition.
Union all is also an SQL command which is used to put together the selected values from two different tables. Unlike the Union command, the Union all does not filter the values to be returned by it. Union all, as its name suggests, returns all the values specific to the query, inclusive of the values that have been duplicated as well. However, Union all works fairly faster than the Union command. This is because there is no onus on the Union all command to eliminate duplication and present distinct values. So it works faster and displays all results as per the query.
Therefore, the use of Union all is recommended only in a condition where the user is confident about the displayed result not carrying any overlapping values. Otherwise, the Union command is the best option to perform an integration of values. It is a bit slower, but can be counted upon to provide an accurate result.
Comparison between Union and Union All:
|
Union |
Union All |
Return of value |
The union command returns values that are distinct from one another. |
Union all displays all values specific to the query, inclusive of those that are being duplicated. |
Elimination of duplicity |
Union command always discards the duplicate values and presents the separate ones. |
Union all doesn’t eliminate duplicate values. |
Speed |
Union is a bit slower as it refines the values to be returned. |
Union all is comparatively faster as it just has to present all the values, regardless of clone values. |
Recommended when |
The values need to be sorted and united. |
The values need to be united, but don’t need to be sorted. |
Union (SQL) - это... Что такое Union (SQL)?
Правильный заголовок этой статьи — UNION. Он показан некорректно из-за технических ограничений.В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу, состоящую из схожих строк. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах. Данный оператор был описан уже в самом первом стандарте SQL — SQL/89[1].
Синтаксис
Оператор указывается между запросами. В упрощенном виде это выглядит следующим образом:
<запрос1> UNION [ALL] <запрос2> UNION [ALL] <запрос3> .....;По умолчанию любые дублирующие записи автоматически скрываются, если не использовано выражение UNION ALL.
Необходимо отметить, что UNION сам по себе не гарантирует порядок строк. Строки из второго запроса могут оказаться в начале, в конце или вообще перемешаться со строками из первого запроса. В случаях, когда требуется определенный порядок, необходимо использовать выражение ORDER BY.
Правила использования
Существуют два основных правила, регламентирующие порядок использования оператора UNION:
- Число и порядок извлекаемых столбцов должны совпадать во всех объединяемых запросах;
- Типы данных в соответствующих столбцах должны быть совместимы.
Определения столбцов, данные из которых извлекаются в объединяемых запросах, не должны совпадать, однако должны быть совместимыми путем неявного преобразования. Если типы данных различаются, то получившийся тип данных определяется на основе правил очередности типов данных (для конкретной СУБД). Если типы совпадают, но различаются в точности, масштабе или длине, результат определяется на основе правил, используемых для объединения выражений (для конкретной СУБД)[2]. Типы не определенные ANSI, такие как DATA и BINARY, обычно должны совпадать с другими столбцами такого же нестандартного типа[3].
В Microsoft SQL Server столбцы с типом данных XML должны быть эквивалентными. Все столбцы должны либо иметь тип, определенный в XML-схеме, либо быть нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем[2].
Еще одно ограничение на совместимость — это запрет пустых значений (NULL) в любом столбце объединения, причем эти значения необходимо запретить и для всех соответствующих столбцов в других запросах объединения, поскольку пустые значения (NULL) запрещены с ограничением NOT NULL. Кроме того, нельзя использовать UNION в подзапросах, а также нельзя использовать агрегатные функции в предложении SELECT запроса в объединении (однако большинство СУБД пренебрегают этими ограничениями)[3].
Применение
UNION может быть весьма полезным в приложениях для хранения данных, где таблицы редко бывают абсолютно нормализированы. Простой пример: в базе есть таблицы sales2005 и sales2006, обладающие идентичной структурой, но разделены ради повышения производительности. Запрос со словом UNION позволяет объединить результаты из обеих таблиц.
Также стоит отметить, что UNION ALL работает быстрее, чем просто UNION, поскольку по умолчанию при использовании оператора UNION проводится дополнительная фильтрация результата аналогичная SELECT DISTINCT, а при использовании UNION ALL — нет[4].
Примеры
Использование UNION при выборке из двух таблиц
Даны две таблицы:
Иван | 1000 |
Алексей | 2000 |
Сергей | 5000 |
Иван | 2000 |
Алексей | 2000 |
Петр | 35000 |
При выполнении следующего запроса:
(SELECT * FROM sales2005) UNION (SELECT * FROM sales2006);получается результирующий набор, однако порядок строк может произвольно меняться, поскольку ключевое выражение ORDER BY не было использовано:
Иван | 1000 |
Алексей | 2000 |
Сергей | 5000 |
Иван | 2000 |
Петр | 35000 |
В результате отобразятся две строки с Иваном, так как эти строки различаются значениями в столбцах. Но при этом в результате присутствует лишь одна строка с Алексеем, поскольку значения в столбцах полностью совпадают.
Использование UNION ALL при выборке из двух таблиц
Применение UNION ALL дает другой результат, так как дубликаты не скрываются. Выполнение запроса:
(SELECT * FROM sales2005) UNION ALL (SELECT * FROM sales2006);даст следующий результат, выводимый без упорядочивания ввиду отсутствия выражения ORDER BY:
Иван | 1000 |
Иван | 2000 |
Алексей | 2000 |
Алексей | 2000 |
Сергей | 5000 |
Петр | 35000 |
Использование UNION при выборке из одной таблицы
Аналогичным образом можно объединять два разных запроса из одной и той же таблицы (хотя вместо этого, как правило, необходимые параметры комбинируют в одном запросе при помощи ключевых слов AND и OR в условии WHERE):
(SELECT person, amount FROM sales2005 WHERE amount=1000) UNION (SELECT person, amount FROM sales2005 WHERE person LIKE 'Сергей');В результате получится:
Иван | 1000 |
Сергей | 5000 |
Использование UNION как внешнее объединение
При помощи UNION можно создавать также полные внешние объединения (иногда используется в случае отсутствия встроенной прямой поддержки внешних объединений):
(SELECT * FROM employee LEFT JOIN department ON employee.DepartmentID = department.DepartmentID) UNION (SELECT * FROM employee RIGHT JOIN department ON employee.DepartmentID = department.DepartmentID);Но при этом необходимо помнить, что это все же не одно и то же, что и оператор JOIN.
См. также
Примечания
Пункт 4 - нерабочая ссылка (на 08.11.2012)
Ссылки
Общее описание Реализация в MS SQL Server Реализация в MySQL Реализация в PostgreSQL Реализация в Oracle Реализация в Informixveter.academic.ru