На предыдущем
занятии мы видели как можно объединять таблицы между собой, создавая сводный
отчет. На этом занятии продолжим эту тему и поговорим о работе оператора 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-запроса
останется прежним. Но, оставляя только первую строку запроса:
увидим все
записи первой таблицы.
Если же у первой
таблицы во всех полях 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
То есть, здесь
можно использовать все операторы, о которых мы говорили на предыдущих занятиях.