Оператор UNION объединения нескольких таблиц

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

Предположим, у нас имеются две таблицы с одинаковой структурой:

Все эти записи можно объединить в один сводный отчет с помощью оператора UNION:

SELECT score, `from` FROM tab1
UNION SELECT val, type FROM tab2

Мы здесь записали поле `from` в обратных одинарных кавычках, чтобы указать, что это не оператор FROM, а поле с именем from.

После выполнения этого запроса, получим следующее:

Имеем таблицу с шестью записями, причем, строки из исходных таблиц tab1 и tab2 объединялись по значениям первого поля: сначала 100, потом 200 для tab1 и 200 для tab2 и так далее.

Но, если указать только первые столбцы из наших таблиц в SQL-запросе:

SELECT score FROM tab1
UNION SELECT val FROM tab2

То результат уже будет таким:

Здесь остались только уникальные (неповторяющиеся) значения. Вообще, оператор UNION оставляет только уникальные значения записей.

Даже если в первую таблицу добавить еще одну строку со значением 100:

100   tab1

то результат работы SQL-запроса останется прежним. Но, оставляя только первую строку запроса:

SELECT score FROM tab1

увидим все записи первой таблицы.

Если же у первой таблицы во всех полях from укажем имя tab2:

UPDATE tab1 SET `from` = 'tab2'

то исходный запрос:

SELECT score, `from` FROM tab1
UNION SELECT val, type FROM tab2

Приведет к результату:

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

Вернем записям первой таблицы значения tab1:

UPDATE tab1 SET `from` = 'tab1'

И сформируем вот такой запрос:

SELECT score, 'table 1' as tbl FROM tab1
UNION SELECT val, 'table 2' FROM tab2

Смотрите, мы здесь явно указали значение второго поля как 'table 1' для первой таблицы и 'table 2' – для второй. И чтобы СУБД «знала» какое имя присвоить второму столбцу, оно указано в виде алиаса tbl. На выходе получим следующий результат:

Также можно добавить сортировку сводной таблицы, например, по полю score:

SELECT score, 'table 1' as tbl FROM tab1
UNION SELECT val, 'table 2' FROM tab2
ORDER BY score DESC

Или, добавить фильтр и ограничение максимального числа записей:

SELECT score, 'table 1' as tbl FROM tab1 WHERE score IN(300, 400)
UNION SELECT val, 'table 2' FROM tab2
ORDER BY score DESC
LIMIT 3

То есть, здесь можно использовать все операторы, о которых мы говорили на предыдущих занятиях.