Как объединить результаты двух запросов sql
The results of two queries can be combined using the set operations union, intersection, and difference. The syntax is
where query1 and query2 are queries that can use any of the features discussed up to this point.
UNION effectively appends the result of query2 to the result of query1 (although there is no guarantee that this is the order in which the rows are actually returned). Furthermore, it eliminates duplicate rows from its result, in the same way as DISTINCT , unless UNION ALL is used.
INTERSECT returns all rows that are both in the result of query1 and in the result of query2 . Duplicate rows are eliminated unless INTERSECT ALL is used.
EXCEPT returns all rows that are in the result of query1 but not in the result of query2 . (This is sometimes called the difference between two queries.) Again, duplicates are eliminated unless EXCEPT ALL is used.
In order to calculate the union, intersection, or difference of two queries, the two queries must be “ union compatible ” , which means that they return the same number of columns and the corresponding columns have compatible data types, as described in Section 10.5.
Set operations can be combined, for example
which is equivalent to
As shown here, you can use parentheses to control the order of evaluation. Without parentheses, UNION and EXCEPT associate left-to-right, but INTERSECT binds more tightly than those two operators. Thus
You can also surround an individual query with parentheses. This is important if the query needs to use any of the clauses discussed in following sections, such as LIMIT . Without parentheses, you’ll get a syntax error, or else the clause will be understood as applying to the output of the set operation rather than one of its inputs. For example,
is accepted, but it means
| Prev | Up | Next |
| 7.3. Select Lists | Home | 7.5. Sorting Rows ( ORDER BY ) |
Submit correction
If you see anything in the documentation that is not correct, does not match your experience with the particular feature or requires further clarification, please use this form to report a documentation issue.
Как объединить результаты двух запросов sql
Результаты двух запросов можно обработать, используя операции над множествами: объединение, пересечение и вычитание. Эти операции записываются соответственно так:
Здесь запрос1 и запрос2 — это запросы, в которых могут использоваться все возможности, рассмотренные до этого.
UNION по сути добавляет результаты второго запроса к результатам первого (хотя никакой порядок возвращаемых строк при этом не гарантируется). Более того, эта операция убирает дублирующиеся строки из результата так же, как это делает DISTINCT , если только не указано UNION ALL .
INTERSECT возвращает все строки, содержащиеся в результате и первого, и второго запроса. Дублирующиеся строки отфильтровываются, если не указано ALL .
EXCEPT возвращает все строки, которые есть в результате первого запроса, но отсутствуют в результате второго. (Иногда это называют разницей двух запросов.) И здесь дублирующиеся строки отфильтровываются, если не указано ALL .
Чтобы можно было вычислить объединение, пересечение или разницу результатов двух запросов, эти запросы должны быть « совместимыми для объединения » , что означает, что они должны иметь одинаковое число столбцов и соответствующие столбцы должны быть совместимых типов, как описывается в Разделе 10.5.
Операции над множествами можно объединять, например
Как показано выше, вы можете использовать круглые скобки, чтобы управлять очередью обработки. Без круглых скобок UNION и EXCEPT объединяются слева направо, но оператор INTERSECT имеет больший приоритет, чем первые два. Таким образом,
Вы также можете заключить отдельный запрос в круглые скобки. Это важно, если в запросе необходимо использовать любое из предложений, обсуждаемых в следующих разделах, например LIMIT . Без круглых скобок возникнет синтаксическая ошибка или предложение будет восприниматься как относящееся к результату операции над множествами, а не к её аргументам. Например,
SQL-Урок 12. Комбинированные запросы (UNION)
В большинстве SQL-запросов используется один оператор, с помощью которого возвращаются данные из одной или нескольких таблиц. SQL также позволяет выполнять одновременно несколько отдельных запросов и отображать результат в виде единого набора данных. Такие комбинированные запросы обычно называют сочетаниями или сложными запросами.
1. Использование оператора UNION
Запросы в языке SQL комбинируются с помощью оператора UNION. Для этого необходимо указать каждый запрос SELECT и разместить между ними ключевое слово UNION. Ограничений по количеству использованного оператора UNION в одном общем запросе нет. В предыдущем разделе мы отмечали, что Access не имеет возможности создавать полное внешнее объединение, теперь мы посмотрим, как можно этого достичь через оператор UNION.
SELECT *
FROM Sumproduct LEFT JOIN Sellers ON Sumproduct.City = Sellers.City
UNION
SELECT *
FROM Sumproduct RIGHT JOIN Sellers ON Sumproduct.City = Sellers.City
Видим, что запрос отобразил как все колонки из первой таблицы — так и с другой, независимо от того, все ли записи имеют соответствия в другой таблице.
- запрос UNION должен включать два и более операторов SELECT, отделенных между собой ключевым словом UNION (т.е. если в запросе используется четыре оператора SELECT, то должно быть три ключевых слова UNION)
- каждый запрос в операторе UNION должен иметь одни и те же столбцы, выражения или статистические функции, которые, к тому же, должны быть перечислены в одинаковом порядке
- типы данных столбцов должны быть совместимыми. Они не обязательно должны быть одного типа, однако обязаны иметь подобный тип, чтобы СУБД могла их однозначно преобразовать (например, это могут быть различные числовые типы данных или различные типы даты).
2. Включение или выключение повторяющихся строк
Запрос с UNION автоматически удаляет все повторяющиеся строки из набора результатов запроса (то есть, ведет себя как предложения WHERE с несколькими условиями в одном операторе SELECT ). Такое поведение оператора UNION по умолчанию, но при желании мы можем изменить это. Для этого нам следует использовать оператор UNION ALL вместо UNION.
3. Сортировка результатов комбинированных запросов
Результаты выполнения оператора SELECT сортируются с помощью предложения ORDER BY. При комбинировании запросов с помощью UNION только одно предложение ORDER BY может быть использовано, и оно должно быть проставлено в последнем операторе SELECT. Действительно, на практике нет особого смысла часть результатов сортировать в одном порядке, а другую часть — в другом. Поэтому несколько предложений ORDER BY применять не разрешается.
Операция объединения в SQL
Для объединения результатов работы нескольких запросов SELECT в единый набор данных в MySQL используется команда UNION. Команда UNION имеет следующий синтаксис:
SELECT .
UNION [ALL]
SELECT .
Для корректной работы команды UNION, структура наборов, которые возвращают запросы SELECT , должна быть одинаковой, чтобы их можно было совместить в один набор. То есть все запросы должны содержать одинаковое количество полей в одинаковом порядке. Поля с одним и тем же порядковым номером в разных запросах должны совпадать по типу, размеру, допустимости значения NULL.
Инструкция ALL подразумевает, что при наличии совершенно одинаковых записей в результирующий набор будут включены обе записи. Если инструкция ALL отсутствует, то по умолчанию подразумевается инструкция DISTINCT, которая исключает дубли.
Команда Union может использоваться в следующих случаях:
- Выборка данных из одной таблицы;
- Выборка данных из двух таблиц;
- Реализация оператора FULL JOIN (полного внешнего объединения).
Выборка данных из одной таблицы
Имеется таблица с фамилиями клиентов некоторого предприятия и датами обращения.
Необходимо вывести данные об обращениях клиентов с фамилиями Иванов и Петров. Эту задачу можно решить с помощью следующего запроса:
SELECT * from booking where fio LIKE «Иванов%»
SELECT * from booking where fio LIKE «Петров%»;
Стоит заметить, что полностью эквивалентный результат можно получить без использования UNION, применяя логический оператор OR:
SELECT * from booking where fio LIKE «Иванов%» OR «Петров%»;
Выборка данных из двух таблиц
Пуст имеется две таблицы с названиями городов и численностью населения.
Необходимо построить таблицу, куда войдут города из обеих таблиц с численностью между 3 млн. и 13млн.
SELECT city_name,population FROM city1 WHERE population>3000000 AND population
SELECT city_name,population FROM city2 WHERE population>3000000 AND population
При наличии инструкции ORDER BY внутри запросов SELECT, следует использовать круглые скобки:
(SELECT a,b,c FROM table1 WHERE a=10 AND b=20 ORDER BY c)
UNION
(SELECT a,b,c FROM table2 WHERE c=20 OR b=30 ORDER BY b);
Реализация FULL JOIN с помощью UNION
Чаще всего команда UNION используется для реализации оператора FULL JOIN, который в MySQL отсутствует. Рассмотрим реализацию FULL JOIN на примере следующей задачи:
В базе данных хранятся две таблицы. В таблице «orders» указаны количества заказанной продукции. В таблице «prod» указано количество произведенной продукции.
При этом есть продукция, которая заказана и не произведена (Торт «Прага»), и есть продукция, которая произведена, но не заказывалась (Зефир фруктовый). Необходимо определить расхождение между заказом и реально произведенным количеством по каждому виду товара.
Если построить запрос на основе prod left join orders, то в результате будут видны все произведенные товары, но не будут видны те товары, которые были заказаны, но не были произведены.
SELECT prod.product, ifnull(prod.amount,0)-ifnull(orders.amount,0) from prod left join orders on orders.product=prod.product;
В результирующей таблице отсутствует товар «Торт Прага».
Если построить запрос на основе orders left join prod, то в результате будут видны все заказанные товары, но не будут видны те товары, которые были произведены без предварительного заказа.
SELECT orders.product, ifnull(prod.amount,0)-ifnull(orders.amount,0) from orders left join prod on prod.product=orders.product;
В результирующей таблице отсутствует товар «Зефир фруктовый».
Для того чтобы получить полную картину, необходимо объединить результаты двух предыдущих запросов командой UNION.