Использование UNION в SQL. Union all sql описание


Объединение UNION и UNION ALL в SQL – описание и примеры | Info-Comp.ru

Пришло время поговорить об объединении данных по средствам конструкции union и union all, так как это иногда бывает очень полезно, и без использования такой конструкции бывает порой не обойтись. Примеры будем писать в СУБД MSSQL 2008, используя язык SQL.

И начать хотелось бы с того, что мы с Вами уже рассматривали много примеров написания запросов на SQL, например, оператор select языка SQL, или использование строковых функций SQL, также рассматривали программирование как на plpgsql так и на transact-sql, например, Как написать функцию на PL/pgSQL и Transact-sql – Табличные функции и временные таблицы соответственно.

Я не просто так указал вышеперечисленные статьи, а указал я их, потому, что для более лучшего понимания и усвоения сегодняшнего урока, необходимо начальные знания (это сайт для начинающих программистов), которые как раз Вы можете получить из вышеупомянутого материала.

И так приступим. И для начала давайте рассмотрим, что же это за операторы union и union all.

Что такое UNION и UNION ALL в SQL?

  • UNION – это оператор SQL для объединения результирующего набора данных нескольких запросов, и данный оператор выводит только уникальные строки в запросах, т.е. например, Вы объединяете два запроса и в каждом из которых есть одинаковые данные, другими словами полностью идентичные, и оператор union объединит их в одну строку для того чтобы не было дублей;
  • UNION ALL – это оператор SQL для объединения результирующего набора данных нескольких запросов, а вот данный оператор, выведет уже абсолютно все строки, даже дубли.

Необходимые условия для операторов union и union all

  1. Набор полей должен быть одинаковый во всех запросах, т.е. количество полей в каждом  запросе, который будет объединяться по средствам конструкции union или union all, должно быть одинаковое;
  2. Типы данных полей также должны совпадать в каждом запросе, т.е. например, если Вы захотите написать один запрос, в котором будет тип данных int а во втором запросе тип данных varchar то у Вас запрос не выполнится а окно запроса выведет ошибку;
  3. В случае сортировки оператор order by можно указать только после последнего запроса.

Теперь давайте поговорим о том, в каких случаях нам может понадобиться использование этих операторов. Ну, например,  у Вас есть несколько баз со схожей структурой, каждая из которых создана, например, для какого-нибудь филиала, а Вам необходимо объединить эти данные для предоставления отчетности по всем филиалам руководству и самое простое как это можно сделать, это написать запросы на SQL, каждый из которых будет обращаться к разным базам, и через конструкцию union или union all объединить их. Также иногда бывает необходимо объединить данные в одной базе таким образом, что обычными объединениями это не реализовать и приходится использовать union. Почему я говорю «приходится» да потому что данная конструкция значительно увеличивает время выполнения запроса, если например данных очень много, и злоупотреблять ею не нужно.

Хватит теории, переходим к практике.

Примечание! Как уже говорилось, запросы будем писать в Management Studio для SQL Server 2008

Примеры использования union и union all

Для начала создадим две простых таблицы test_table и test_table_2

CREATE TABLE [test_table]( [id] [bigint] IDENTITY(1,1) NOT NULL, [number] [numeric](18, 0) NULL, [text] [varchar](50) NULL, CONSTRAINT [PK_test_table] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO --и вторая таблица CREATE TABLE [test_table_2]( [id] [bigint] IDENTITY(1,1) NOT NULL, [number] [numeric](18, 0) NULL, [text] [varchar](50) NULL, CONSTRAINT [PK_test_table_2] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO

Они одинаковые для примера, только разные названия. Я заполнил их вот такими данными:

Теперь давайте напишем запрос, который объединит результирующие данные в одни, например через union. Синтаксис очень прост:

Запрос 1 union Запрос 2 union Запрос 3 и т.д.

Вот запрос:

select number, text from test_table union select number, text from test_table_2

Как Вы видите, вывелось всего 5 строк, так как у нас первая строка в первом запросе и первая строка во втором запросе одинаковые, поэтому они объединились.

Теперь давайте объединим  через union all

Вот запрос:

select number, text from test_table union all select number, text from test_table_2

Здесь уже вывелись все строки, так как мы указали union all.

А теперь давайте рассмотрим, какие могут быть ошибки даже в этом простом запросе. Например, мы перепутали последовательность полей:

Или мы в первом запросе указали дополнительное поле, а во втором этого не сделали.

Также, например, при использовании order by:

Здесь мы указали сортировку в каждом запросе, а нужно было только в последнем, например:

select number, text from test_table union all select number, text from test_table_2 order by number

И напоследок, хотел рассказать об одной хитрости, которую можно использовать тогда когда, например, все-таки необходимо вывести в одном запросе какое-то поле, а в других его нет или просто оно не нужно, для этого можете написать вот такой запрос:

select id ,number, text from test_table union all select '', number, text from test_table_2

т.е. как Вы видите просто там, где должно быть поле ставить пусто и запрос отлично отработает, например:

И еще один небольшой совет, так как запросы при объединении через union довольно обширные, то лучше на их основе создать представление (Views), в случае если данный запрос Вам требуется постоянно, и уже к этому представлению обращаться каждый раз, когда требуется, а зачем нужны представления мы с Вами уже рассматривали вот здесь – Что такое представления и зачем они нужны.

Наверное, все, что я хотел рассказать о конструкции union и union all языка  SQL я рассказал, если есть вопросы по использованию этих операторов, задавайте их в комментариях. Удачи!

Похожие статьи:

info-comp.ru

UNION ALL ОПЕРАТОР | Oracle PL/SQL •MySQL •SQL Server

Это учебное пособие Oracle объясняет, как использовать Oracle оператор UNION ALL с синтаксисом и примерами.

Описание

Oracle оператор UNION ALL используется для объединения наборов результатов 2-х или более SELECT запросов. Он возвращает все строки из запроса и не удаляет повторяющиеся строки между различными запросами SELECT.

Каждый SELECT запрос в Oracle операторе UNION ALL должен иметь одинаковое количество полей в результирующем наборе с аналогичными типами данных.

Синтаксис

Синтаксис оператора UNION ALL в Oracle/PLSQL:

SELECT expression1, expression2, … expression_nFROM tables[WHERE conditions]UNION ALLSELECT expression1, expression2, … expression_nFROM tables[WHERE conditions];

Параметры или аргументы

expression1, expression2, … expression_n

Столбцы или расчеты, которые вы хотите получить.

tables

Таблицы, из которых вы хотите получить записи.

WHERE conditions

Необязательный. Условия, которые должны быть выполнены для выбранных записей.

Примечание

В обоих запросах SELECT должно быть одинаковое количество столбцов.

Пример выборки одного поля

Ниже приведен пример Oracle оператора UNION ALL, который возвращает одно поле из множества SELECT (и оба поля имеют один и тот же тип данных):

SELECT supplier_id FROM suppliers UNION ALL SELECT supplier_id FROM orders;

SELECT supplier_id

FROM suppliers

UNION ALL

SELECT supplier_id

FROM orders;

Этот пример Oracle оператора UNION ALL вернет множество записей supplier_id в результирующем наборе, т.к. supplier_id находится в обоих таблицах suppliers и orders. Oracle оператор UNION ALL не удалит дубликаты. Если вы хотите, чтобы дубликаты были удалены, попробуйте использовать оператор Oracle UNION.

Пример использования ORDER BY

Oracle оператор UNION ALL может использовать ORDER BY, чтобы упорядочить результаты запроса.

Например:

SELECT supplier_id, supplier_name FROM suppliers WHERE state = 'California' UNION ALL SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 2;

SELECT supplier_id, supplier_name

FROM suppliers

WHERE state = 'California'

UNION ALL

SELECT company_id, company_name

FROM companies

WHERE company_id > 1000

ORDER BY 2;

В этом Oracle операторе UNION ALL, так как имена столбцов в двух запросах SELECT отличаются, то в операторе ORDER BY выгоднее ссылаться на положение столбцов в результирующем наборе. В этом примере, мы отсортировали результаты по supplier_name / company_name в порядке возрастания, как это обозначено в ORDER BY 2.

Поля supplier_name / company_name находятся в позиции # 2 в результирующем наборе.

oracleplsql.ru

UNION ALL SQL Server | Oracle PL/SQL •MySQL •SQL Server

В этом учебном пособии вы узнаете, как использовать оператор UNION ALL в SQL Server (Transact-SQL) с синтаксисом и примерами.

Описание

Оператор SQL Server UNION ALL используется для объединения наборов результатов из 2 или более операторов SELECT. Он возвращает все строки из запроса и не удаляет повторяющиеся строки между различными операторами SELECT.

Каждый оператор SELECT в операторе SQL Server UNION ALL должен иметь одинаковое количество полей в наборах результатов с похожими типами данных.

Синтаксис

Синтаксис оператора UNION ALL в SQL Server (Transact-SQL):

SELECT expression1, expression2, … expression_nFROM tables[WHERE conditions]UNION ALLSELECT expression1, expression2, … expression_nFROM tables[WHERE conditions];

Параметры или аргументы

expression1, expression2, … expression_n — столбцы или вычисления, которые вы хотите получить.tables — таблицы, из которых вы хотите получить записи. Должна быть хотя бы одна таблица, перечисленная в предложении FROM.WHERE conditions — необязательный. Условия, которые должны быть выполнены для выбранных записей.

Примечание

  • В обоих операторах SELECT должно быть одинаковое количество выражений.
  • Соответствующие столбцы в каждом из операторов SELECT должны иметь похожие типы данных.
  • Оператор UNION не удаляет повторяющиеся строки между различными операторами SELECT.
  • См. также оператор UNION.

Пример веращающий одно поле.

Рассмотрим пример оператора UNION ALL в SQL Server (Transact-SQL), который возвращает одно поле из нескольких операторов SELECT (и оба поля имеют одинаковый тип данных).Например:

SELECT product_id FROM products UNION ALL SELECT product_id FROM inventory;

SELECT product_id

FROM products

UNION ALL

SELECT product_id

FROM inventory;

Этот пример UNION ALL возвратит несколько раз в product_id вашем результирующем наборе, так как product_id находится как в таблице products, так и в таблице inventory. Оператор SQL Server UNION ALL не удаляет дубликаты. Если вы хотите удалить дубликаты, попробуйте использовать оператор SQL Server UNION.

Пример использования ORDER BY

Оператор UNION ALL может использовать предложение ORDER BY для сортировки результатов запроса в SQL Server (Transact-SQL).Например:

SELECT contact_id, contact_name FROM contacts WHERE site_name = 'yandex.com' UNION ALL SELECT company_id, company_name FROM companies WHERE site_name = 'google.com' ORDER BY 2;

SELECT contact_id, contact_name

FROM contacts

WHERE site_name = 'yandex.com'

UNION ALL

SELECT company_id, company_name

FROM companies

WHERE site_name = 'google.com'

ORDER BY 2;

В этом примере оператора UNION ALL, поскольку имена столбцов различаются между двумя операторами SELECT, более выгодно ссылаться на столбцы в предложении ORDER BY по их позиции в наборе результатов. В этом примере мы отсортировали результаты по contact_name / company_name в порядке возрастания, как обозначено в ORDER BY 2.

Поля contact_name / company_name находятся позиции № 2 в результирующем наборе.

oracleplsql.ru

UNION ОПЕРАТОР | Oracle PL/SQL •MySQL •SQL Server

Это учебное пособие Oracle объясняет, как использовать Oracle оператор UNION с синтаксисом и примерами.

Описание

Oracle оператор UNION используется для объединения наборов результатов из 2-х или более Oracle запросов SELECT. Он удаляет повторяющиеся строки между различными запросами SELECT.

Каждый запрос SELECT внутри оператора UNION должен иметь одинаковое количество полей в результирующих наборах с одинаковыми типами данных.

Синтаксис

Синтаксис оператора UNION в Oracle/PLSQL:

SELECT expression1, expression2, … expression_nFROM tables[WHERE conditions]UNIONSELECT expression1, expression2, … expression_nFROM tables[WHERE conditions];

Параметры или аргументы

expression1, expression2, expression_n — Столбцы или расчеты, которые вы хотите получить.tables — Таблицы из которых вы хотите получить записи.WHERE conditions — Необязательный. Условия, которые должны быть выполнены для выбранных записей.

Примечание

  • В обоих запросах SELECT должно быть одинаковое количество выражений.

Пример с одним полем

Следующий пример Oracle оператора UNION, возвращает одно поле из двух запросов SELECT (и оба поля имеют один и тот же тип данных):

SELECT supplier_id FROM suppliers UNION SELECT supplier_id FROM order_details;

SELECT supplier_id

FROM suppliers

UNION

SELECT supplier_id

FROM order_details;

В этом примере оператора UNION, если supplier_id присутствует в обоих таблицах suppliers и order_details, то supplier_id появляется один в наборе результатов. Оператор Oracle UNION удаляет дубликаты. Если вы не хотите, чтобы дубликаты были удалены, попробуйте использовать Oracle оператора UNION ALL.

Пример использования ORDER BY

Oracle оператор UNION может использовать оператор ORDER BY, чтобы упорядочить результаты запроса.

Например:

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id <= 500 UNION SELECT company_id, company_name FROM companies WHERE company_name = 'Apple' ORDER BY 2;

SELECT supplier_id, supplier_name

FROM suppliers

WHERE supplier_id <= 500

UNION

SELECT company_id, company_name

FROM companies

WHERE company_name = 'Apple'

ORDER BY 2;

В этом примере UNION, так как имена столбцов в двух запросах SELECT отличаются, то в ORDER BY выгоднее ссылаться на положение столбцов в результирующем наборе. В этом примере, мы отсортировали результаты по supplier_name / company_name в порядке возрастания, как это обозначено в ORDER BY 2.

Поля supplier_name / company_name находятся в позиции # 2 в результирующем наборе.

Часто задаваемые вопросы

Вопрос: Мне нужно сравнить две даты и вернуть количество строк поля, основанного на значении дат. Например, у меня есть в таблице поле даты, которое называется дата последнего обновления. Я должен проверить, если TRUNC (last_updated_date)> = TRUNC (Sysdate-13).

Ответ: Поскольку вы используете функцию COUNT, которая является агрегатной функцией, то мы рекомендуем использовать Oracle оператор UNION. Например, вы можете попробовать следующее:

SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode) FROM cdmaster a, nmmaster b WHERE a.code = b.code AND a.status = 1 AND b.status = 1 AND b.Ncode <> 'a10' AND TRUNC(last_updated_date) <= TRUNC(sysdate-13) GROUP BY a.code, a.name UNION SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode) FROM cdmaster a, nmmaster b WHERE a.code = b.code AND a.status = 1 AND b.status = 1 AND b.Ncode <> 'a10' AND TRUNC(last_updated_date) > TRUNC(sysdate-13) GROUP BY a.code, a.name;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode)

FROM cdmaster a, nmmaster b

WHERE a.code = b.code

AND a.status = 1

AND b.status = 1

AND b.Ncode <> 'a10'

AND TRUNC(last_updated_date) <= TRUNC(sysdate-13)

GROUP BY a.code, a.name

UNION

SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode)

FROM cdmaster a, nmmaster b

WHERE a.code = b.code

AND a.status = 1

AND b.status = 1

AND b.Ncode <> 'a10'

AND TRUNC(last_updated_date) > TRUNC(sysdate-13)

GROUP BY a.code, a.name;

Oracle оператор UNION позволит выполнить подсчет на основе одного набора критериев.

TRUNC(last_updated_date)

А также выполнить подсчет на основе другого набора критериев.

TRUNC(last_updated_date) > TRUNC(sysdate-13)

Рубрика: SQL - описание | Permalink

oracleplsql.ru

использование оператора для объединения результатов инструкций SELECT

От автора: условие/оператор SQL UNION используется для объединения результатов двух или более инструкций SELECT без включения повторяющихся строк.

Для использования условия UNION, каждый оператор SELECT должен содержать

Такое же количество выбранных столбцов

Такое же количество выражений столбцов

Тот же тип данных

Бесплатный курс по PHP программированию

Освойте курс и создайте динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Они должны располагаться в том же порядке

Но они не обязательно должны быть одинаковой длины.

Синтаксис

Основной синтаксис условия UNION следующий:

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

UNION

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

Здесь данное условие может быть любым выражением, заданным исходя из ваших потребностей.

Пример

Рассмотрим следующие две таблицы. Таблица 1 — Таблица CUSTOMERS выглядит следующим образом.

Таблица 2 — Таблица ORDERS выглядит следующим образом.

Теперь давайте объединим эти две таблицы в инструкции SELECT следующим образом:

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

SELECT  ID, NAME, AMOUNT, DATE

  FROM CUSTOMERS

  LEFT JOIN ORDERS

  ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

UNION

  SELECT  ID, NAME, AMOUNT, DATE

  FROM CUSTOMERS

  RIGHT JOIN ORDERS

  ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Это даст следующий результат -

Бесплатный курс по PHP программированию

Освойте курс и создайте динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Условие UNION ALL

Оператор UNION ALL используется для объединения результатов двух операторов SELECT, с включением повторяющихся строк.Те же правила, которые применяются к условию UNION, будут применяться к оператору UNION ALL.

Синтаксис

Основной синтаксис UNION ALL следующий.

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION ALL SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

UNION ALL

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

Здесь данное условие может быть любым выражением, заданным исходя из ваших потребностей

Пример

Рассмотрим следующие две таблицы, Таблица 1 — Таблица CUSTOMERS выглядит следующим образом.

Таблица 2 — таблица ORDERS выглядит следующим образом.

Теперь давайте объединим эти две таблицы в инструкции SELECT следующим образом:

SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION ALL SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

SELECT  ID, NAME, AMOUNT, DATE

  FROM CUSTOMERS

  LEFT JOIN ORDERS

  ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

UNION ALL

  SELECT  ID, NAME, AMOUNT, DATE

  FROM CUSTOMERS

  RIGHT JOIN ORDERS

  ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Это даст следующий результат:

Существует два других условия или оператора похожих на условие UNION.р>

Условие SQL INTERSECT − используется для объединения двух инструкций SELECT, но возвращает только строки из первого оператора SELECT, которые совпадают со строкой из второго оператора SELECT.

Условие SQL EXCEPT − объединяет два оператора SELECT и возвращает строки из первого оператора SELECT, которые не возвращаются вторым оператором SELECT.

Источник: https://www.tutorialspoint.com/

Редакция: Команда webformyself.

Бесплатный курс по PHP программированию

Освойте курс и создайте динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Получить курс сейчас!

Хотите изучить MySQL?

Прямо сейчас посмотрите 24-х часовой курс по базе данных MySQL!

Смотреть курс

webformyself.com

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 при выборке из двух таблиц

Даны две таблицы:

sales2005 person amount
Иван 1000
Алексей 2000
Сергей 5000
sales2006 person amount
Иван 2000
Алексей 2000
Петр 35000

При выполнении следующего запроса:

(SELECT * FROM sales2005) UNION (SELECT * FROM sales2006);

получается результирующий набор, однако порядок строк может произвольно меняться, поскольку ключевое выражение ORDER BY не было использовано:

person amount
Иван 1000
Алексей 2000
Сергей 5000
Иван 2000
Петр 35000

В результате отобразятся две строки с Иваном, так как эти строки различаются значениями в столбцах. Но при этом в результате присутствует лишь одна строка с Алексеем, поскольку значения в столбцах полностью совпадают.

Использование UNION ALL при выборке из двух таблиц

Применение UNION ALL дает другой результат, так как дубликаты не скрываются. Выполнение запроса:

(SELECT * FROM sales2005) UNION ALL (SELECT * FROM sales2006);

даст следующий результат, выводимый без упорядочивания ввиду отсутствия выражения ORDER BY:

person amount
Иван 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 'Сергей');

В результате получится:

person amount
Иван 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 Реализация в Informix

dal.academic.ru

Использование UNION в SQL

Вы здесь: Главная - MySQL - SQL - Использование UNION в SQL

Я уже писал о выборке из нескольких таблиц на SQL. И там вывод одной таблицы зависил от содержимого другой. Но бывает нужно, когда требуется полная независимость вывода одной таблицы от другой. Всё, что хочется - это просто в одном запросе вытащить записи сразу из нескольких таблиц, не более того. И вот для этого используется в SQL ключевое слово UNION.

Давайте с Вами разберём SQL-запрос с использованием UNION:

SELECT `login`, `amount` FROM `employers` UNION SELECT `login`, `amount` FROM `staff`;

Данный запрос вернёт логины и суммы на счетах всех работодателей и сотрудников некоего сайта. То есть данные были в разных таблицах, но их схожесть позволяет вывести их сразу. Отсюда, кстати, идёт правило использования UNION-запросов: число и порядок полей должно совпадать во всех частях запроса.

Таких UNION-частей может быть очень много, но самое главное после последнего UNION надо обязательно поставить точку с запятой.

Ещё одной хорошей особенностью UNION является отсутствие повторений. Например, если один и тот же человек находится и среди сотрудников, и среди работодателей, разумеется, с той же самой суммой на счету, то в выборке он будет не 2 раза, а только 1, что, как правило, и требуется. А если всё-таки нужны повторения, то тогда есть UNION ALL:

SELECT `login`, `amount` FROM `employers` UNION ALL SELECT `login`, `amount` FROM `staff`;

Вот так используется достаточно простой оператор UNION в SQL-запросе, упрощающий процедуру вывода сразу из множества таблиц однотипных данных, что в свою очередь очень хорошо скажется на производительности.

  • Создано 14.12.2012 10:31:16
  • Михаил Русаков
Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка: <a href="https://myrusakov.ru" target="_blank"><img src="https://myrusakov.ru//images/button.gif" alt="Как создать свой сайт" /></a>

    Она выглядит вот так:

  2. Текстовая ссылка:<a href="https://myrusakov.ru" target="_blank">Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи): [URL="https://myrusakov.ru"]Как создать свой сайт[/URL]

myrusakov.ru