Команды построения сложных запросов
Обычные и составные запросы
Обычный запрос состоит из одного оператора SELECT, а составной – из двух или более.
Составные запросы строятся с помощью определенных команд, позволяющих связать два запроса в один. Так, в следующем примере для этого используется команда UNION.
Например, оператор SQL может выглядеть следующим образом.
SELECT EMP_ID, SALARY, PAY_RATE FROM EMPLOYEE_PAY_TBL
WHERE SALARY IS NOT NULL OR PAY_RATE IS NOT NULL;
Тот же оператор с помощью UNION можно записать по-другому.
SELECT EMP_ID, SALARY FROM EMPLOYEE_PAY_TBL
WHERE SALARY IS NOT NULL
UNION
SELECT EMP_ID, PAY_RATE FROM EMPLOYEE_PAY_TBL
WHERE PAY_RATE IS NOT NULL;
Оба эти оператора возвратят данные об оплате труда всех служащих, для которых указана либо почасовая оплата, либо ставка.
В случае второго оператора в выводе будет присутствовать два столбца – EMP_ID и SALARY и нормы почасовой оплаты (PAY_RATE) тоже будут помещены в столбец SALARY. При использовании команды UNION названия (или псевдонимы) столбцов в выводе определяются первым из операторов SELECT
Зачем использовать составные запросы?
|
|
Составные запросы используются для того, чтобы комбинировать результаты двух операторов SELECT. Использование составного запроса позволяет организовать или, наоборот, подавить вывод повторяющихся записей. С помощью таких запросов можно выводить одновременно аналогичные данные, хранящиеся в разных столбцах
Составные запросы позволяют комбинировать результаты нескольких запросов в одном выводимом наборе данных. Такие запросы часто строятся проще, чем запросы со сложными условиями, и часто допускают большую гибкость в решении разнообразных задач извлечения данных.
Команды, использующиеся для построения сложных запросов, зависят от конкретной реализации языка. Стандарт ANSI определяет команды UNION, UNION ALL, INTERSECT и EXCEPT. Все они обсуждаются ниже.
Команда UNION используется для объединения результатов двух или более операторов SELECT с исключением повторяющихся строк. Другими словами, если строка попадает в вывод одного запроса, то второй раз она не выводится, даже если она возвращается вторым запросом. При использовании UNION в каждом из связываемых операторов SELECT должно быть выбрано одинаковое число столбцов, столбцы должны быть одинакового типа и следовать в том же порядке.
В InterBase применима ТОЛЬКО конструкция [UNION <select_expr> [ALL]]
Синтаксис оператора должен быть следующим.
SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ] [ WHERE ]
UNION
SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ] [ WHERE ]
Рассмотрим пример.
SELECT EMP_ID FROM EMPLOYEE_TBL
UNION
SELECT EMP_ID FROM EMPLOYEE_PAY_TBL;
В результате табельные номера, имеющиеся в обеих таблицах, отобразятся только по одному разу.
|
|
Для построения примеров с реальными данными используем следующие простые запросы к двум таблицам.
SELECT PROD_DESC FROM PRODUCTS_TBL;
PROD_DESC
КОСТЮМ ВЕДЬМЫ
ПЛАСТИКОВЫЕ ТЫКВЫ
ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ
ФОНАРИ
КОСТЮМЫ В АССОРТИМЕНТЕ
СЛАДКАЯ КУКУРУЗА
ТЫКВЕННЫЕ КОНФЕТЫ
ПЛАСТИКОВЫЕ ПАУКИ
МАСКИ В АССОРТИМЕНТЕ
ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ
ПОЛОЧКА ИЗ ДУБА
SELECT PROD_DESC FROM PRODUCTS_TMP;
PROD_DESC
КОСТЮМ ВЕДЬМЫ
ПЛАСТИКОВЫЕ ТЫКВЫ
ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ
ФОНАРИ
КОСТЮМЫ В АССОРТИМЕНТЕ
СЛАДКАЯ КУКУРУЗА
ТЫКВЕННЫЕ КОНФЕТЫ
ПЛАСТИКОВЫЕ ПАУКИ
МАСКИ В АССОРТИМЕНТЕ
Таблица PRODUCTS_TMP была создана в ходе урока 3. Обратитесь к уроку 3 снова, если вам необходимо воссоздать эту таблицу.
Теперь объединим эти два запроса с помощью команды UNION, чтобы получить следующий составной запрос
SELECT PROD_DESC FROM PRODUCTS_TBL
UNION
SELECT PROD_DESC FROM PRODUCTS_TMP;
PROD_DESC
ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ
КОСТЮМ ВЕДЬМЫ
КОСТЮМЫ В АССОРТИМЕНТЕ
МАСКИ В АССОРТИМЕНТЕ
ПЛАСТИКОВЫЕ ПАУКИ
ПЛАСТИКОВЫЕ ТЫКВЫ
ПОЛОЧКА ИЗ ДУБА
СЛАДКАЯ КУКУРУЗА
ТЫКВЕННЫЕ КОНФЕТЫ
ФОНАРИ
ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ
Этот запрос тоже возвращает 11 записей, как и два предыдущих, поскольку при объединении двух запросов с помощью команды UNION повторяющиеся в таблицах записи повторно не выводятся.
В следующем примере с помощью команды UNION комбинируются два независимых запроса.
SELECT PROD_DESC FROM PRODDCTS_TBL
UNION
SELECT LAST_NAME FROM EMPLOYEE_TBL;
PROD_DESC
GLASS
GLASS
PLEW
SPURGEON
STEPHENS
WALLACE
ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ
КОСТЮМ ВЕДЬМЫ
КОСТЮМЫ В АССОРТИМЕНТЕ
МАСКИ В АССОРТИМЕНТЕ
ПЛАСТИКОВЫЕ ПАУКИ
ПЛАСТИКОВЫЕ ТЫКВЫ
ПОЛОЧКА ИЗ ДУБА
СЛАДКАЯ КУКУРУЗА
ТЫКВЕННЫЕ КОНФЕТЫ
ФОНАРИ
ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ
Здесь значения столбцов PROD_DESC и LAST_NAME оказываются перечисленными вместе, причем для заголовка столбца использовано имя столбца, выбранного в первом запросе.