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

SQL — Условия UNION

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

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

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

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

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

Онлайн курс «PHP-разработчик»

Изучите курс и создайте полноценный проект — облачное хранилище файлов

С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.

Узнать подробнее

Освоите PHP, MySQL, SQL, фрейсворк Laravel

Научитесь работать со стандартом REST и RESTful API

Упор на практику. Поддержка экспертов

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

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

Синтаксис

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

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

UNION

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

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

Пример

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

SQL — Условия UNION

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

SQL — Условия UNION

Теперь давайте объединим эти две таблицы в инструкции 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;

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

SQL — Условия UNION

Условие 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]

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

Пример

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

SQL — Условия UNION

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

SQL — Условия UNION

Теперь давайте объединим эти две таблицы в инструкции 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;

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

SQL — Условия UNION

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

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

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

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

Онлайн курс «PHP-разработчик»

Изучите курс и создайте полноценный проект — облачное хранилище файлов

С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.

Узнать подробнее

Освоите PHP, MySQL, SQL, фрейсворк Laravel

Научитесь работать со стандартом REST и RESTful API

Упор на практику. Поддержка экспертов

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

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

Описание

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

  • UNION удаляет повторяющиеся строки
  • Оператор UNION ALL не удаляет повторяющиеся строки

Синтаксис

Синтаксис для оператора UNION в SQL.

SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions]
UNION
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];

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

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

Примечание

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

Пример — одиночное поле с тем же именем

Давайте посмотрим, как использовать SQL оператор UNION, который возвращает одно поле. В этом простом примере поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.
Например.

SELECT supplier_id

  FROM suppliers

UNION

SELECT supplier_id

  FROM orders

ORDER BY supplier_id;

В этом SQL примере оператора UNION, если supplier_id появилось в таблицах suppliers и orders, оно будет один раз в вашем наборе результатов. Оператор UNION удаляет дубликаты. Если вы не хотите удалить дубликаты, попробуйте использовать оператор UNION ALL.
Теперь давайте рассмотрим этот пример, далее приведем некоторые данные.
Если у вас была таблица suppliers, заполненная следующими записями.

supplier_id supplier_name
1000 Yandex
2000 Google
3000 Oracle
4000 Bing

И таблица orders заполнена следующими записями.

order_id order_date supplier_id
2019-07-01 2000
2019-07-01 6000
2019-07-02 7000
2019-07-03 8000

И вы выполнили следующий запрос UNION.

SELECT supplier_id

  FROM suppliers

UNION

SELECT supplier_id

  FROM orders

ORDER BY supplier_id;

Вы получите следующие результаты.

supplier_id
1000
2000
3000
4000
6000
7000
8000

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

Пример — разные имена полей

Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми, соответствующими типами данных.
Если у вас нет одинаковых имен столбцов между операторами SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY.
Давайте посмотрим, как использовать оператор UNION с разными именами столбцов и упорядочиванием результатов запроса.
Например.

SELECT supplier_id,

       supplier_name

  FROM suppliers

WHERE supplier_id > 2000

UNION

SELECT company_id,

       company_name

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

В этом SQL примере UNION, поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в ORDER BY по их положению в наборе результатов. В этом примере мы отсортировали результаты по supplier_id / company_id в порядке возрастания, как обозначено ORDER BY 1. Поля supplier_id / company_id находятся в позиции № 1 в наборе результатов.

Теперь давайте рассмотрим этот пример подробнее с данными.
Если у вас была таблица suppliers, заполненная следующими записями.

supplier_id supplier_name
1000 Microsoft
2000 Oracle
3000 Apple
4000 Samsung

И таблица companies заполнилась следующими записями.

company_id company_name
1000 Microsoft
3000 Apple
7000 Sony
8000 IBM

И вы выполнили следующий оператор UNION.

SELECT supplier_id,

       supplier_name

  FROM suppliers

WHERE supplier_id > 2000

UNION

SELECT company_id, company_name

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

Вы получите следующие результаты.

supplier_id supplier_name
3000 Apple
4000 Samsung
7000 Sony
8000 IBM

Во-первых, обратите внимание, что запись с supplier_id, равной 3000, появляется только один раз в наборе результатов, поскольку запрос UNION удалил повторяющиеся записи.
Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются supplier_id и supplier_name. Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION.
Если бы вы хотели, вы могли бы присвоить псевдонимы столбцам следующим образом.

SELECT supplier_id AS ID_Value,

   supplier_name AS Name_Value

  FROM suppliers

WHERE supplier_id > 2000

UNION

SELECT company_id AS ID_Value,

       company_name AS Name_Value

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

Теперь заголовки столбцов в результате будут иметь псевдоним как ID_Value для первого столбца и Name_Value для второго столбца.

ID_Value Name_Value
3000 Apple
4000 Samsung
7000 Sony
8000 IBM


UNION

Оператор UNION используется для объединения результирующего набора из двух или более заявлений SELECT.

  • Каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов
  • Столбцы также должны иметь схожие типы данных
  • Столбцы в каждом заявлении SELECT также должны располагаться в том же порядке

Синтаксис UNION

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

Синтаксис UNION ALL

Оператор UNION по умолчанию выбирает только отдельные значения. Чтобы разрешить повторяющиеся значения, использовать UNION ALL:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

Примечание: Имена столбцов в результирующем наборе обычно равны именам столбцов в первом заявлении SELECT в UNION.


Демо база данных

В этом уроке мы будем использовать хорошо известный пример базы данных Northwind.

Ниже приведен выбор из таблицы «Customers»:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

И выбор из таблицы «Suppliers»:

SupplierID SupplierName ContactName Address City PostalCode Country
1 Exotic Liquid Charlotte Cooper 49 Gilbert St. London EC1 4SD UK
2 New Orleans Cajun Delights Shelley Burke P.O. Box 78934 New Orleans 70117 USA
3 Grandma Kelly’s Homestead Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA


Пример SQL UNION

Следующая инструкция SQL возвращает города (только отдельные значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

Попробуйте сами »

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


Пример SQL UNION ALL

Следующая инструкция SQL возвращает города (также повторяющиеся значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;

Попробуйте сами »


Пример SQL UNION с WHERE

Следующая инструкция SQL возвращает немецкие города (только отдельные значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City, Country FROM Customers
WHERE Country=’Germany’
UNION
SELECT City, Country FROM Suppliers
WHERE Country=’Germany’
ORDER BY City;

Попробуйте сами »


Пример SQL UNION ALL с WHERE

Следующая инструкция SQL возвращает немецкие города (также повторяющиеся значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City, Country FROM Customers
WHERE Country=’Germany’
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country=’Germany’
ORDER BY City;

Попробуйте сами »


Пример UNION другой

Следующая инструкция SQL содержит список всех клиентов и поставщиков:

Пример

SELECT ‘Customer’ As Type, ContactName, City, Country
FROM Customers
UNION
SELECT ‘Supplier’, ContactName, City, Country
FROM Suppliers;

Попробуйте сами »

Обратите внимание на «AS Type» выше — это псевдоним.
Псевдонимы SQL используются для присвоения таблице или столбцу временного имени.
Псевдоним существует только на время выполнения запроса.
Итак, здесь мы создали временный столбец с именем «Type», который перечисляет, является ли контактное лицо «клиентом» или «поставщиком».

UNION
объединяет информацию из 2-х и более
отдельных запросов SELECT
в один курсор или таблицу. При этом в
команде SELECT
можно использовать до 10 членов UNION,
связывая каждую инструкцию SELECT
с предыдущей. Результирующий набор,
созданный первой командой SELECT,
определяет требуемую структуру для
остальных команд SELECT.
Порядок, количество, размер и тип полей
в первой команде SELECT
определяет структуру для всех последующих
команд SELECT.

Например, для
получения списка всех студентов и
преподавателей фамилии которых заключены
между буквами «К» и «С»:

SELECT
SFAM, SIMIA FROM STUD; WHERE SFAM BETWEEN ‘K’ AND
‘C’; UNION; SELECT TFAM, TIMIA FROM TEACHER; WHERE TFAM BETWEEN
‘K’ AND ‘C’

Когда 2 или более
запросов подвергаются объединению, их
столбцы вывода должны быть совместимы
для объединения. Это означает для каждого
запроса необходимость включения
одинакового числа столбцов в том же
порядке, что и 1, 2, 3 и т.д. и при этом должна
присутствовать совместимость типов.

Например: символьные
поля должны иметь одинаковое число
символов. Кроме того нельзя использовать
агрегатные функции в запросе SELECT
при объединении. Агрегатные функции –
MIN,
MAX,
AVG,
SUM.
Также UNION
будет автоматически исключать дубликаты
строк из вывода.

Пусть таблица
STUD1
содержит поле, состоящее из 30 символов,
которые включают Имя и Фамилию.

Таблица TEACHER
содержит отдельные поля для имени и
фамилии. Сумма длин этих полей также
равна 30 символам.

В таблице STUD1
определено поле для хранения факультета,
а в таблице TEACHER
– нет. Для объединения данных результирующих
наборов необходимо согласовать эти
различия.

SELECT
STUD1.FAC
FROM
STUD;

UNION;

SELECT
PADR (ALLTRIM(TEACHER.FIRSTNAME)+ALLTRIM(TEACHER.LASTNAME), 30);

AS NAME, SPACE (10) AS FAK;

FROM
TEACHER

Член SPACE(10)
играет роль «заглушки», которая относится
к полю, содержащему имя факультета в
файле TEACHER.
Этот член заполняет поле с именем
факультета в объединенные результирующие
таблицы пробелами. Без подобной заглушки
операция UNION
корректно работать не будет. Подобную
заглушку можно поставить в любой
инструкции SELECT.
Можно поместить заглушку в первую
команду SELECT,
чтобы зарезервировать строку пробелов
для поля, которое существует только в
последующих командах SELECT.
Можно включить пробелы в одну из
внутренних команд SELECT,
чтобы обеспечить совпадение с первой
командой SELECT.

Функция ALLTRIM
удаляет пробелы слева и справа из
соответствующего имени учителя.

Функция PADR
создает поле с заданной длиной. Между
именем и фамилией поставлен разделительный
пробел (+). Если общая длина поля меньше
30-символьного ограничения, то будет
усечен последний символ.

Воздействие
ключевого слова UNION
аналогично действию DISTINCT.
Это значит, что каждая добавленная в
результирующий набор запись проверяется
на уникальность. Члены UNION
используются только для объединения
запросов, но никак не влияют на подзапросы.

Правила объединения
с помощью UNION:

  1. Любое поле,
    включенное в первый список полей, должно
    быть представлено полем или заглушкой
    в последующих списках полей.

  2. Любое поле из
    последующих списков полей, которое не
    входит в первый список полей, должно
    быть представлено заглушкой в первом
    списке

  3. В первом списке
    не должно быть вычисляемых полей

  4. Члены ORDER
    BY
    и INTO
    могут входить в любую инструкцию SELECT,
    но только 1 раз и применяются ко всему
    результату.

  5. Член ORDER
    BY
    должен ссылаться на поля, по их позициям
    в списке, а не по имени.

  6. При отсутствии
    члена ORDER
    BY
    для сортировки используется порядок
    следования полей в списке.

  7. Члены GROUP
    BY
    и HAVING
    могут присутствовать в каждой инструкции
    SELECT,
    причем их влияние ограничено только
    результатами работы данной инструкции
    SELECT.

  8. С помощью членов
    UNION
    нельзя объединять результаты подзапросов,
    то есть члены UNION
    нельзя применить к инструкциям SELECT,
    используемым внутри члена WHERE
    других инструкций SELECT.

  9. При построении
    объединения можно использовать не
    более 10 членов 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 условие

Таблицы для примеров

таблица countries

id
айди
name
название
1 Беларусь
2 Россия
3 Украина
таблица cities

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,
    которая объединяет связанные таблицы

Понравилась статья? Поделить с друзьями:

Новое и полезное:

  • Исполнение обязанностей в соответствии с должностной инструкцией
  • Исполнение бюджета программа инструкция по применению
  • Исполнение бюджета информационно аналитическая система инструкция
  • Источник чистоты сибирское здоровье инструкция по применению цена
  • Источник чистоты сибирское здоровье инструкция отзывы

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии