Как объединить два запроса sql
Перейти к содержимому

Как объединить два запроса sql

  • автор:

Как применять оператор SQL UNION для объединения результатов запросов

Оператор языка SQL UNION предназначен для объединения результирующих таблиц базы данных, полученных с применением слова SELECT. Условие объединения результирующих таблиц: совпадение числа, порядка следования и типа данных столбцов. ORDER BY следует применять к результату объединения и размещать только в конце составного запроса. Оператор UNION имеет следующий синтаксис:

В этой конструкции объединяемые запросы могут иметь условия в секции WHERE, а могут не иметь их. При помощи оператора UNION можно объединить запросы на извлечение данных как из одной таблицы, так и из разных.

При использовании оператора UNION без слова ALL результат не содержит дубликатов, а со словом ALL — содержит дубликаты.

Итоги и индивидуальные значения в одной таблице с помощью оператора SQL UNION

Одним запросом можно вывести из таблицы индивидуальные значения столбцов, например, число лет, проработанных сотрудниками фирмы, размеры их заработной платы и другие. Другим запросом — с использованием агрегатных функций — можно получить, например, сумму заработных плат, получаемых сотрудниками отделов или занимающих те или иные должности, или среднее число лет трудового стажа (в таких запросах применяется группировка с помощью оператора GROUP BY).

А если нам требуется получить в одной таблице и сводку всех индивидуальных значений, и итоговые значения? Здесь на помощь приходит оператор SQL UNION, с помощью которого два запроса объединяются. К результату объединения требуется применить упорядочение, используя оператор ORDER BY. Для чего это необходимо, будет лучше понятно из примеров.

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.

Пример 1. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Salary (размер заработной платы), Job (должность) и Years (длительность трудового стажа). Первый запрос возвращает индивидуальные размеры заработной платы, упорядоченные по должностям:

Результатом выполнения запроса будет следующая таблица:

Name Job Salary
Sanders Mgr 18357.5
Marenghi Mgr 17506.8
Pernal Sales 18171.2
Doctor Sales 12322.4
Factor Sales 16228.7

Второй запрос вернёт суммарную заработную плату по должностям. Мы уже готовим этот запрос для соединения с первым, поэтому будем помнить, что условием соединения является равное число столбцов, совпадение их названий, порядка следования и типов данных. Поэтому включаем в таблицу с итогами также столбец Name с произвольным значением ‘Z-TOTAL’:

Результатом выполнения запроса будет следующая таблица:

Name Job Salary
Z-TOTAL Mgr 35864.3
Z-TOTAL Sales 46722.3

Теперь объединим запросы при помощи оператора UNION и применим оператору ORDER BY к результату объединения. Группировать следует по двум столбцам: должность (Job) и имя (Name), чтобы строки с итоговыми (суммарными) значениями, в которых значение имени — ‘Z-TOTAL’, находились ниже строк с индивидуальными значениями. Объединение результатов запросов будет следующим:

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

Name Job Salary
Marenghi Mgr 17506.8
Sanders Mgr 18357.5
Z-TOTAL Mgr 35864.3
Doctor Sales 12322.4
Factor Sales 16228.7
Pernal Sales 18171.2
Z-TOTAL Sales 46722.3

Написать запросы с использованием UNION самостоятельно, а затем посмотреть решение

Пример 2. Данные — те же, что в примере 1, но задача немного посложнее. Требуется вывести в одной таблице не только индивидуальные размеры заработной платы, упорядоченные по должностям и суммарную заработную плату по должностям, но суммарную заработную плату по всем сотрудникам.

Пример 3. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Name (фамилия), Dept (номер отдела), и Years (длительность трудового стажа).

Name Dept Years
Sanders 20 7
Pernal 20 8
Marenghi 38 5
Doctor 20 5
Factor 38 8

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

Другие случаи объединения запросов к одной таблице с помощью оператора SQL UNION

Пример 4. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Salary (размер заработной платы), Job (должность) и Years (длительность трудового стажа). Первый запрос нужен для получения данных о сотрудниках, заработная плата которых более 21000:

Результатом выполнения запроса будет следующая таблица:

ID Name
140 Fraye
160 Molinare
260 Jones

Второй запрос возвращает имена сотрудников, должность которых «менеждер», а число лет трудового стажа — менее 8:

Результатом выполнения запроса будет следующая таблица:

ID Name
10 Sanders
30 Marenghi
100 Plotz
140 Fraye
160 Molinare
240 Daniels

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

Результатом выполнения запроса с оператором UNION будет следующая таблица:

ID Name
10 Sanders
30 Marenghi
100 Plotz
140 Fraye
160 Molinare
240 Daniels
260 Jones

Запрос с оператором UNION может возвращать и большее количество столбцов, важно, повторимся, чтобы в объединяемых запросах число столбцов, порядок их следования и типы данных совпадали.

Теперь работаем с базой данных «Портал объявлений — 1». Скрипт для создания этой базы данных, её таблицы и заполения таблицы данных — в файле по этой ссылке

Пример 5. Есть база данных портала объявлений.

Пусть сначала требуется получить данные о категориях и частях категорий объявлений, в которых подано более 100 объявлений в неделю. Пишем следующий запрос:

Результатом выполнения запроса будет следующая таблица:

Category Part Units Money
Транспорт Автомашины 110 17600
Транспорт Мотоциклы 131 20960
Электротехника Телевизоры 127 8255
Электротехника Холодильники 137 8905
Стройматериалы Регипс 112 11760
Досуг Музыка 117 7605

Теперь требуется извлечь данные о категориях и частях категорий объявлений, за которые выручено более 10000 денежных единиц в неделю. Пишем следующий запрос:

Результатом выполнения запроса будет следующая таблица:

Category Part Units Money
Транспорт Автомашины 110 17600
Недвижимость Квартиры 89 18690
Недвижимость Дачи 57 11970
Транспорт Мотоциклы 131 20960
Стройматериалы Регипс 112 11760

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

Результатом выполнения запроса будет следующая таблица:

Транспорт Автомашины 110 17600
Транспорт Мотоциклы 131 20960
Недвижимость Квартиры 89 18690
Недвижимость Дачи 57 11970
Электротехника Телевизоры 127 8255
Электротехника Холодильники 137 8905
Стройматериалы Регипс 112 11760
Досуг Музыка 117 7605

Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об операторах INSERT, UPDATE, DELETE, HAVING.

How do I combine 2 select statements into one?

I have a table with lots of rows and columns of course 😛 Lets say it looks like this:

Now I want to create an advanced select statement that gives me this combined (pseudo SQLish here):

The output would be:

How would I combine those two select statements into one nice select statement?

Would it work if I complicated the SQL like below (because my own SQL statement contains an exists statement)? I just want to know how I can combine the selects and then try to apply it to my somewhat more advanced SQL.

My REAL SQL statement is this one:

which gives me a result. But I want to combine it with a copy of this select statement with an added AND on the end and the ‘Status’ field would be changed with a string like ‘DELETED’.

Оператор UNION в SQL

Оператор UNION в SQL выбирает строки из двух или более таблиц. Если строки в таблицах повторяются, то они выводятся только один раз (т.е. без дублей). Например:

Здесь мы извлекаем столбец age из таблиц Teachers и Students, игнорируя повторяющиеся строки.

Нюансы использования оператора UNION

Чтобы использовать оператор UNION в SQL, следует знать, что:

Количество столбцов во всех таблицах должно быть одинаковым. Например, в примере выше в таблицах Teachers и Students по три столбца.

Типы данных столбцов должны быть одинаковыми. Например, в примере выше столбец age в таблице Teachers является целочисленного типа данных, как и столбец age в таблице Students.

Столбцы должны находится в одинаковом порядке в каждой таблице. Например, в примере выше порядок столбцов в таблице Teachersid-name-age, как и в таблице Students.

Оператор UNION ALL в SQL

Оператор UNION ALL выбирает строки из двух или более таблиц, подобно работе оператора UNION . Однако, в отличие от UNION , оператор UNION ALL не игнорирует повторяющиеся строки (т.е. выводит дубли).

Давайте попробуем выполнить предыдущую команду SQL, используя UNION ALL вместо UNION :

SQL UNION Operator

The UNION operator is used to combine the result-set of two or more SELECT statements.

  • Every SELECT statement within UNION must have the same number of columns
  • The columns must also have similar data types
  • The columns in every SELECT statement must also be in the same order

UNION Syntax

UNION ALL Syntax

The UNION operator selects only distinct values by default. To allow duplicate values, use UNION ALL :

Note: The column names in the result-set are usually equal to the column names in the first SELECT statement.

Demo Database

In this tutorial we will use the well-known Northwind sample database.

Below is a selection from the «Customers» table:

And a selection from the «Suppliers» table:

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 Example

The following SQL statement returns the cities (only distinct values) from both the «Customers» and the «Suppliers» table:

Example

Note: If some customers or suppliers have the same city, each city will only be listed once, because UNION selects only distinct values. Use UNION ALL to also select duplicate values!

SQL UNION ALL Example

The following SQL statement returns the cities (duplicate values also) from both the «Customers» and the «Suppliers» table:

Example

SQL UNION With WHERE

The following SQL statement returns the German cities (only distinct values) from both the «Customers» and the «Suppliers» table:

Example

SQL UNION ALL With WHERE

The following SQL statement returns the German cities (duplicate values also) from both the «Customers» and the «Suppliers» table:

Example

Another UNION Example

The following SQL statement lists all customers and suppliers:

Example

Notice the «AS Type» above — it is an alias. SQL Aliases are used to give a table or a column a temporary name. An alias only exists for the duration of the query. So, here we have created a temporary column named «Type», that list whether the contact person is a «Customer» or a «Supplier».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *