Sql Scholl
Распечатать страницу
Перейти на главную Карта сайта Отправить сообщение

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

Что такое комбинированные запросы

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

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

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

Комбинированные запросы и многократные условия WHERE

Результат комбинирования двух запросов к одной и той же таблице в основном аналогичен результату, полученному при выполнении одного запроса с несколькими требованиями в предложении where. Иначе говоря, как будет показано в следующем разделе, любой оператор select с многократно используемым условием where можно также рассматривать как сложный запрос.

Создание комбинированных запросов

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

ИспользованиеоператораUNION

       Использовать оператор UNION довольно просто. Все, что вы должны сделать, — это указать каждый необходимый вам оператор SELECT и разместить ключевое слово UNION между ними.
Рассмотрим пример. Допустим, вам необходим отчет, содержащий сведения обо всех клиентах из штатов Иллинойс, Индиана и Мичиган. Вы также хотите включить в него данные о клиенте Fun4All независимо от штата. Конечно, можно создать условие WHERE, благодаря которому будет выполнено требуемое, но в данном случае гораздо удобнее использовать оператор UNION.

      Как уже говорилось, применение оператора UNION подразумевает многократное использование операторов SELECT. Вначале рассмотрим отдельные операторы:

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL1,'IN','MI');


cust_name       cust_ontact          cust email 
--------------  ------------------   ----------------------------
Village Toys    John Smith           sales@villagetoys.com
Fun4All         Jim Jones            jjones@fun4all.com
The Toy         Store Kim Howard     NULL 




SELECT cust_name, cus^contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'; 



cust_name        cus_contact           cust_email 
---------------  ----------------      --------------
Fun4All          Jim Jones             jjones@fun4all.com
Fun4All          Denise L. Stephens    dstephens@fun4all.com

      Первый оператор SELECT выбирает все строки, относящиеся к штатам Иллинойс, Индиана и Мичиган, передавая аббревиатуры этих штатов в условие IN. Второй оператор SELECT использует простую проверку на равенство, чтобы найти все местонахождения в таблицах клиента Fun4All.

      Чтобы скомбинировать эти два запроса, выполните следующее.

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN (•IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'; 




cust name        cust contact          cust_email 
-------------    -------------------   ----------------------
Fun4All          Denise L.Stephens     dstephens@fun4all.com
Fun4All          Jim Jones             jjones@fun4all.com
Village          Toys John Smith       sales@villagetoys.com
The Toy          Store Kim Howard      NULL

       Операторы предыдущего примера состоят из обоих предшествующих операторов SELECT, разделенных ключевым словом UNION. Оператор UNION указывает СУБД выполнить оба оператора SELECT и вывести результаты в виде одного набора результатов запроса.

      Для сравнения приводим тот же самый запрос, использующий не оператор UNION, а несколько предложений WHERE:

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN (4L','IN1,'MI')
OR cust_name = 'Fun4All';

      В нашем простом примере применение оператора UNION может оказаться более сложным, чем использование предложения WHERE. Однако если условие фильтрации окажется более сложным или если понадобится выбирать данные из многих таблиц (а не только из одной), то оператор UNION может значительно упростить процесс.

Ограничения оператора UNION

В стандартном SQL не существует ограничений на число операторов select, которые могут быть скомбинированы посредством операторов union. Однако лучше все же обратиться к документации СУБД и убедиться в том, что она не накладывает каких-либо ограничений на максимально допустимое число операторов.

Проблемы, связанные с производительностью

В большинстве хороших СУБД используется внутренний оптимизатор запросов, комбинирующий операторы select, прежде чем СУБД начинает их обработку. Теоретически это означает, что, с точки зрения производительности, нет реальной разницы между использованием многих предложений where и оператора union. Мы говорим "теоретически", потому что на практике многие оптимизаторы запросов не всегда выполняют свою работу так хорошо, как следовало бы. Лучшим вариантом было бы протестировать оба метода и посмотреть, какой из них вам лучше подходит.