Комбинированные запросы

В большинстве SQL-запросов используется один оператор, посредством которого возвращаются данные из одной или нескольких таблиц. SQL позволяет также выполнять множественные запросы (за счет многократного использования оператора SELECT) и возвращать результаты в виде одного набора результатов запроса. Эти комбинированные запросы обычно называют соединениями или сложными запросами.

Можно назвать два основных сценария, при выполнении которых вам понадобятся сложные запросы:

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

Запросы в языке SQL комбинируются с помощью оператора UNION. Оператор UNION позволяет многократно указывать оператор SELECT, и по завершении их работы может быть выведен один набор результатов.

Использовать оператор UNION довольно просто. Все, что вы должны сделать, — это указать каждый необходимый вам оператор SELECT и разместить оператор UNION между ними.

Упрощенный синтаксис оператора UNION имеет следующий вид:

onepaтop_select
UNION
onepaтop_select

Несмотря на простоту использования оператора UNION, существует несколько правил создания комбинированных запросов:

  • каждый запрос в операторе UNION должен содержать одни и те же столбцы, выражения или статистические функции (кроме того, столбцы должны быть перечислены в одном и том же порядке);
  • типы данных столбцов должны быть совместимыми;
  • для сортировки результата комбинированного запроса используется предложение ORDER BY, которое появится после заключительного оператора SELECT.
IDevice IconПример
Нужно получить список услуг, указав для каждой из них текущую цену, процентное снижение цены и новую стоимость. Стоимость услуг до 100 у.е. снижается на 10 процентов, для услуг, стоимостью от 100 у.е до 200 у.е снижение составит 20 процентов, для услуг стоимостью выше 200у.е. — 30 процентов.

Без оператора UNION вам потребовалось бы выполнить три отдельных запроса и поместить результаты в новую таблицу.

Оператор UNION выполняет все это за один проход:

SQL:
SELECT '10% off ' AS sale, price AS old_price, price*0.90 AS new_price
FROM tbl_service
WHERE price<100
UNION
SELECT '20% off ' AS sale, price
AS old_price, price*0.80 AS new_price
FROM tbl_service
WHERE price BETWEEN 100 AND 200
UNION
SELECT '30% off ' AS sale, price
AS new_price , price*0.70 AS new_price
FROM tbl_service
WHERE price >200

Результат:

sale old_price new_price
10% off 50 45
10% off 20 18
20% off 200 160
20% off 100 80
20% off 150 120
30% off 320 224
30% off 250 175