Пройдите тест, узнайте какой профессии подходите
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы
Быстрый ответ
Если вам нужно объединить результаты двух SELECT-запросов, используйте оператор UNION, который удаляет повторяющиеся строки:
Если вы хотите учитывать дубликаты, то применяйте UNION ALL:
JOIN используется для объединения данных из разных таблиц на основе определённых критериев:

Роль оператора CASE
Оператор CASE позволяет вводить условную логику в SELECT-запросы. Это дает возможность задавать значения в зависимости от определённых условий:
Не забывайте точно сформулировать условия выбора данных при использовании оператора CASE.
Баланс UNION и JOIN: Вопрос производительности
Выбор между UNION и JOIN имеет значение с точки зрения производительности. UNION может увеличивать время выполнения из-за дополнительных операций по сравнению строк, решением здесь могут быть индексы. В большинстве случаев, JOIN работает эффективнее, предполагая наличие связанных данных в таблицах.
Мастерство подзапросов и оператор EXISTS
Подзапросы — это способ вложения одного SELECT-запроса в другой для сложных манипуляций с данными:
Осторожно используйте подзапросы, так как они могут негативно повлиять на производительность основного запроса.
Визуализация
Представим себе ситуацию, когда вы — повар, у вас есть два рецепта:
Вы должны приготовить блюдо, включающее элементы обоих рецептов.
В терминах SQL, объединение двух SELECT-запросов — это как объединить результаты двух рецептов в «смешанное блюдо»:
«Смешанное блюдо» включает в себя элементы и «🍔», и «🌭».
Псевдонимы в SQL: игра именами
Использование псевдонимов (AS) позволяет сделать запросы более читаемыми, особенно при работе с JOIN или составлении сложных запросов:
В поисках самых свежих данных
Функция MAX() позволяет получить самую свежую запись по определённому полю. Это особенно полезно при работе с датами и временем:
Динамизм SQL
Динамический SQL позволяет строить запросы, адаптируя их под разные условия. Но такую операцию следует проводить с осторожностью, поскольку она повышает риск SQL-инъекций.
Полезные материалы
- Общий взгляд на SQL UNION, его использование и примеры — Здесь можно узнать, как и когда применять UNION для объединения запросов.
- SQL – Можно ли использовать разделители для объединения строк в один столбец? – Stack Overflow — Познакомьтесь со способами совмещения результатов запросов с использованием разделителей строк.
- Оператор SQL UNION — Практическое пособие по использованию оператора UNION со множеством примеров.
- Остерегайтесь использования оператора MERGE в SQL Server — Получите советы по оптимизации использования UNION и избегайте распространённых ошибок.
- Учебник по SQL — Этот ресурс содержит множество учебных материалов и примеров по SQL.
Результаты выполнения SQL запросов можно объединять. Для этого существует оператор UNION.
Общая структура запроса с оператором UNION
SELECT поля_таблиц FROM список_таблиц ... UNION [ALL] SELECT поля_таблиц FROM список_таблиц ... ;
UNION по умолчанию убирает повторения в результирующей таблице. Для отображения с повторением есть необязательный параметр ALL.
- Не путайте операции объединения запросов с операциями объединения таблиц. Для этого служит оператор JOIN.
- Не путайте операции объединения запросов с подзапросами. Подзапросы выполняются для связанных таблиц.
Объединение таблиц оператором UNION выполняется для таблиц никак не связанных, но со схожей структурой.
Для корректной работы UNION нужно, чтобы результирующие таблицы каждого из SQL запросов имели одинаковое число столбцов,
с одним и тем же типом данных и в той же самой последовательности.
Существует два других оператора, чьё поведение крайне схоже с UNION:
- INTERSECT
Комбинирует два запроса SELECT, но возвращает записи только первого SELECT, которые имеют совпадения во втором элементе SELECT. - EXCEPT
Комбинирует два запроса SELECT, но возвращает записи только первого SELECT, которые не имеют совпадения во втором элементе SELECT.
Примеры использования
Например, необходимо вывести наименование всех товаров и имена всех членов семьи (весьма условная задача). Так как типы данных совпадают мы можем это сделать.
SELECT DISTINCT Goods.good_name AS name FROM Goods UNION SELECT DISTINCT FamilyMembers.member_name AS name FROM FamilyMembers;
Афоризм
Что прописали? Свечи? Зажигаем.
Поддержка проекта
Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
• Yandex.Деньги
410013796724260
• Webmoney
R335386147728
Z369087728698
Для объединения результатов двух и более SQL-запросов SELECT в единую
таблицу применяется ключевое слово UNION. Запросыдолжны возвращать одинаковое число и
последовательность совместимых типов данных в соответствующих столбцах.
Синтаксис применения SQL запроса UNION
Оператор UNION размещается между SQL запросами :
select user_id, userName, phone from users UNION [ALL] select city_id, cityName, region from cities UNION [ALL] select company_id, companyName, address from companies
В представленном примере в одну кучу свалили информацию из трех таблиц, имеющих однотипные
столбцы, что, конечно, неправильно, но это работает.
UNION весьма полезен в случаях, когда требуется получить консолидированную информацию,
разделенную на несколько одинаковых таблиц, например рабочая и архивная таблицы. В этом случае,
с использованием UNION можно извлекать данные, сгруппированные по годам и месяцам, включая и
текущий период, а также получить полную информацию, связанную с определенным объектом.
UNION может быть использован совместно с оператором ALL для получения всех записей. Но
необходимо отметить, что UNION ALL работает быстрее, чем просто UNION, поскольку при
использовании оператора UNION проводится дополнительная фильтрация результата аналогичная
SELECT DISTINCT, а при использовании UNION ALL — нет.
Правила применения UNION
При использовании UNION необходимо соблюдать несколько правил, регламентирующих
порядок применения оператора :
- совместимость типов данных в соответствующих столбцах запросов;
- одинаковое число столбцов во всех объединяемых запросах;
- запрет пустых значений (NULL) в любом столбце объединения;
- нельзя использовать UNION в подзапросах.
Тип столбцов нескольких запросов может не совпадать, но обязательно должен быть совместимым
путем неявного преобразования. Следует помнить, что столбцы с типом данных XML должны быть
эквивалентными, т.е. тип столбцов должен быть определен либо в XML-схеме, либо быть
нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем.
Выборка из двух таблиц с использованием UNION
В качестве примера рассмотрим две простенькие таблицы (архивная и рабочая) без определения
первичных и внешних ключей, индексов, ограничений на значения колонок и прочих «прелестей» SQL-языка.
Допускаем, что в архивной таблице хранится информация о заказах за прошедшие годы. В рабочей таблице
размещаются текущие продажи/заказы. Список товаров и услуг, входящих в заказ, не рассматриваем.
Архивная таблица заказов :
create table archive ( id int not null, -- идентификатор записи mid int not null, -- идентификатор менеджера year int not null, -- год month int not null, -- месяц total decimal(9,4) not null ); insert into archive (id, mid, year, month, total) values (1, 2, 2013, 1, 23500); insert into archive (id, mid, year, month, total) values (2, 2, 2013, 2, 11534); insert into archive (id, mid, year, month, total) values (3, 2, 2013, 3, 17532); insert into archive (id, mid, year, month, total) values (4, 2, 2013, 4, 23543); insert into archive (id, mid, year, month, total) values (5, 2, 2013, 5, 23245);
Рабочая таблица заказов :
create table orders ( id int not null, -- идентификатор заказа mid int not null, -- идентификатор менеджера total decimal(9,4) not null, data datetime not null ); insert into orders (id, mid, total, data) values (1, 1, 1350, '2014-02-23'); insert into orders (id, mid, total, data) values (2, 2, 3250, '2014-02-24');
Использование UNION ALL
Запрос выборки данных по продажам товаров (предоставлении услуг) по месяцам за весь период :
select CONCAT(CONVERT(year, CHAR (4)), '.', CAST(month as CHAR(2))) AS data, total from archive UNION ALL select CONVERT(DATE_FORMAT(data, '%Y.%m'), CHAR (7)), SUM(total) from orders GROUP BY DATE_FORMAT(data, '%Y.%m') order by 1;
Не следует относиться критично к конкатенации и функции преобразования даты; для различных СУБД
это может различаться.
Результат выполнения запроса :
data total -------------------- 2013.1 23500.0000 2013.2 11534.0000 2013.3 17532.0000 2013.4 23543.0000 2013.5 23245.0000 2014.2 4600.0000
Использование UNION
Запрос выборки данных по продажам товаров (предоставлении услуг) по месяцам за весь период для
определенного менеджера :
select CONCAT(CONVERT(year, CHAR (4)), '.', CAST(month as CHAR(2))) AS data, total from archive where mid = 2 UNION ALL select CONVERT(DATE_FORMAT(data, '%Y.%m'), CHAR (7)), SUM(total) from orders where mid = 2 GROUP BY DATE_FORMAT(data, '%Y.%m') order by 2;
Результат выполнения запроса :
data total -------------------- 2014.2 3250.0000 2013.2 11534.0000 2013.3 17532.0000 2013.5 23245.0000 2013.1 23500.0000 2013.4 23543.0000
Записи в результирующем наборе можно упорядочить с помощью одного или нескольких полей с
использованием оператором ASC или DESC. Номер 1 и 2 в предложении ORDER BY указывает по какому
столбцу результирующего набора будет упорядочен результат выборки.
Так как столбцы объединения — это столбцы вывода, они не имеют имен, и следовательно, должны
определяться по номеру. Этот номер указывает на их место среди других столбцов вывода.
Внешнее объединение с UNION
При помощи UNION можно создавать полные внешние объединения :
SELECT e.id as eid, d.id as did, e.name as employee, d.name as department FROM employee e LEFT JOIN department d ON e.did = d.id UNION SELECT e.id as eid, d.id as did, e.name as employee, d.name as department FROM employee e RIGHT JOIN department d ON e.did = d.id;
Иногда в запросы вставляют дополнительное отладочное поле, чтобы понять к какому SELECT относится
текущая запись набора.
SELECT e.id as eid, d.id as did, e.name as employee, d.name as department, 'first' FROM employee e LEFT JOIN department d ON e.did = d.id UNION SELECT e.id as eid, d.id as did, e.name as employee, d.name as department, 'second' FROM employee e RIGHT JOIN department d ON e.did = d.id;
UNION — объединение нескольких результатов выборки
Операция UNION
позволяет объединить несколько результатов выборки в один набор строк. Именно объединение строк
отличает
эту операцию от соединения таблиц через JOIN
, которая присоединяет столбцы.
Если не используется ключевое слово ALL
для UNION
, все возвращенные строки будут уникальными, так как по умолчанию
подразумевается DISTINCT
, который удаляет неуникальные значения.
С удалением дублей:
SELECT `имя_столбцов_таблицы_для_вывода`
FROM `имя_таблицы_1` WHERE условие
UNION
SELECT `имя_столбцов_таблицы_для_вывода`
FROM `имя_таблицы_2` WHERE условие;
Без удаления дублей:
SELECT имя_столбцов_таблицы_для_вывода
FROM имя_таблицы_1 WHERE условие
UNION ALL
SELECT имя_столбцов_таблицы_для_вывода
FROM имя_таблицы_2 WHERE условие
Количество столбцов должны совпадать во всех объединяемых наборах. Типы данных для объединяемых столбцов должны
совпадать или хотя бы иметь возможность неявно преобразовываться друг к
другу.
Например, пусть в базе данных будут две отдельные таблицы для клиентов банка (таблица Customers
) и для
сотрудников банка (таблица Employees
), создаем таблицу:
CREATE TABLE Customers
(
Id INT AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(20) NOT NULL,
LastName VARCHAR(20) NOT NULL,
AccountSum DECIMAL
);
CREATE TABLE Employees
(
Id INT AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(20) NOT NULL,
LastName VARCHAR(20) NOT NULL
);
Наполняем соданную таблицу:
INSERT INTO Customers(FirstName, LastName, AccountSum)
VALUES
('Tom', 'Smith', 2000),
('Sam', 'Brown', 3000),
('Mark', 'Adams', 2500),
('Paul', 'Ins', 4200),
('John', 'Smith', 2800),
('Tim', 'Cook', 2800);
INSERT INTO Employees(FirstName, LastName)
VALUES
('Homer', 'Simpson'),
('Tom', 'Smith'),
('Mark', 'Adams'),
('Nick', 'Svensson')
Здесь мы можем заметить, что обе таблицы, несмотря на наличие различных данных, могут характеризоваться двумя общими
атрибутами — именем (FirstName
) и фамилией (LastName
). Выберем сразу всех клиентов банка и
его сотрудников из обеих таблиц:
SELECT FirstName, LastName
FROM Customers
UNION SELECT FirstName, LastName FROM Employees
Здесь из первой таблицы выбираются два значения — имя и фамилия клиента. Из второй таблицы Employees
также выбираются два значения — имя и фамилия сотрудников. То есть при объединении количество выбираемых столбцов и
их тип совпадают для обеих выборок.
При этом названия столбцов объединенной выборки будут совпадать с названия столбцов первой выборки. И если мы захотим
при этом еще произвести сортировку, то в выражениях ORDER BY
необходимо ориентироваться именно на
названия столбцов первой выборки:
SELECT FirstName AS FName, LastName
FROM Customers
UNION SELECT FirstName, LastName
FROM Employees
ORDER BY FName DESC
В данном случае каждая выборка имеет по столбцу FName
из первой выборки. Тем не менее при сортировке
будет учитываться и значение столбца FirstName
из второй выборки.
Если же в одной выборке больше столбцов, чем в другой, то они не смогут быть объединены. Например, в следующем случае
объединение завершится с ошибкой:
SELECT FirstName, LastName, AccountSum
FROM Customers
UNION SELECT FirstName, LastName
FROM Employees
Если оба объединяемых набора содержат в строках идентичные значения, то при объединении повторяющиеся строки
удаляются. Например, в случае с таблицами Customers
и Employees
сотрудники банка могут
быть одновременно его клиентами и содержаться в обеих таблицах. При объединении в примерах выше всех дублирующиеся
строки удалялись. Если же необходимо при объединении сохранить все, в том числе повторяющиеся строки, то для этого
необходимо использовать оператор ALL
:
SELECT FirstName, LastName
FROM Customers
UNION ALL SELECT FirstName, LastName
FROM Employees
ORDER BY FirstName
Объединять выборки можно и из одной и той же таблицы. Например, в зависимости от суммы на счете клиента нам надо
начислять ему определенные проценты:
SELECT FirstName, LastName, AccountSum + AccountSum * 0.1 AS TotalSum
FROM Customers WHERE AccountSum < 3000
UNION SELECT FirstName, LastName, AccountSum + AccountSum * 0.3 AS TotalSum
FROM Customers WHERE AccountSum >= 3000
В данном случае если сумма меньше 3000, то начисляются проценты в размере 10% от суммы на счете. Если на счете больше
3000, то проценты увеличиваются до 30%.
Объединение запросов
Оператор UNION позволяет объединить несколько запросов на выборку. Выборки из каждого запроса попадают в
один общий результат. Оператор UNION используется, когда нужно получить общую выборку из нескольких схожих
таблиц. Например, если для каждой категории товаров создана своя таблица. Теоретически, можно объединить
запросы и для разных таблиц. Но на практике в этом нет смысла, ведь в одном результате будут находиться
разные по смыслу данные. Можно объединить и запросы к одной и той же таблице. Объединённый запрос
выглядит так:
SELECT поле1, поле2 FROM таблица1 WHERE условие UNION
SELECT поле1, поле2 FROM таблица2 WHERE условие
Для запросов есть ограничения: количество полей во всех запросах должно быть одинаковое, а типы полей для
всех запросов должны быть одни и те же. Пример:
+
1 |
<?php header('Content-type: text/html; charset=utf-8'); |
3 |
$db=mysqli_connect('localhost', 'root', '', 'mybase'); $query="SELECT id, inform FROM users UNION SELECT id, text FROM comments"; $result=mysqli_query($db, $query); |
В общую выборку попадают только уникальные записи, как будто
использован оператор DISTINCT. Чтобы получить все записи, нужно к оператору UNION добвить ключевое слово
ALL. Запрос будет такой:
4 |
$query="SELECT id, inform FROM users UNION ALL SELECT id, text FROM comments"; |