возвращенному однострочным подзапросом. Следующий оператор
UPDATE устанавливает зарплату служащего № 4 равной возвращаемому
подзапросом среднему значению всех максимальных зарплат тарифной
сетки:
□ UPDATE employees
SET s a la r y =
(SELECT AVG(high_salary)
FROM SALARY_GRADES)
WHERE employee_id = 4;
3
4
24.975
13.24
13.99
13.49
1 row updated
188 Глава 6
В результате зарплата служащего № 4 увеличивается с $500000 до
$625000 (именно этой величине равняется среднее значение всех максимальных
зарплат из таблицы salary_grades).
Примечание Если вы выполнили этот оператор UPDATE, не забудьте выполнить и оператор
ROLLBACK, чтобы отменить внесенные в таблицу изменения. В этом случае ваши результаты
будут совпадать с результатами примеров в следующих главах книги.
Написание операторов DELETE, содержащих подзапросы
Возвращаемые подзапросом результаты можно использовать во фразе
WHERE оператора DELETE. Следующий оператор DELETE удаляет служащих, чья
зарплата выше, чем среднее значение максимальных зарплат тарифной
сетки, возвращаемое подзапросом:
□ DELETE FROM employees
WHERE s a la r y >
(SELECT AVG(high_salary)
FROM sa la ry_ g rad e s );
1 row d e le ted .
Этот оператор DELETE удалит служащего № 1.
Примечание Если вы выполнили оператор DELETE, не забудьте выполнить и оператор
ROLLBACK для отмены внесенных в таблицу изменений. ___________
Итоги
В этой главе вы узнали, что
■ Подзапросом называется запрос, помещенный внутрь операторов
SELECT, UPDATE или DELETE.
■ Однострочные подзапросы возвращают ноль строк или одну строку.
■ Многострочные подзапросы возвращают одну или несколько строк.
■ Многостолбцовые подзапросы возвращают более одного столбца.
■ В коррелированных подзапросах используется один или несколько
столбцов из внешнего оператора SQL.
■ Вложенными подзапросами называются запросы, помещенные
внутрь других подзапросов.
В следующей главе вы ознакомитесь с расширенными запросами.
Глава 7
Расширенные
запросы
Использование операторов для работы со множествами
Операторы для работы со множествами позволяют комбинировать строки,
возвращаемые двумя или более запросами. В таблице 7.1 показаны четыре
оператора для работы со множествами.
При работе со множествами следует иметь в виду следующее ограничение:
число столбцов, возвращаемых запросами, и их типы должны совпадать,
хотя имена столбцов могут быть различными.
Таблица 7.1. Операторы для работы со множествами
Оператор Описание
UNION ALL Возвращает все строки, полученные с помощью запросов, включая и повторяющиеся
строки.
UNION Возвращает все неповторяющиеся строки, полученные с помощью запросов.
INTERSECT Возвращает строки, отобранные обоими запросами.
MINUS Возвращает строки, остающиеся после того, как строки, отобранные вторым
запросом, вычитаются из строк, отобранных первым запросом.
Ниже показано, как использовать каждый из операторов, показанных в
таблице 7.1. Сначала рассмотрим таблицы для примеров, которые будут
использованы в этом разделе.
Таблицы для примеров
Таблицы products и more_products создаются с помощью сценария store_
schema.sql следующим образом:
□ CREATE TABLE products (
p rodu ct_id INTEGER
CONSTRAINT products_pk PRIMARY KEY,
produ ct_type_id INTEGER
CONSTRAINT produ cts_ fk_ products_types
REFERENCES p ro d u c t_ ty p e s (p ro d u c t_ typ e _ id ),
name VARCHAR2(30) NOT NULL,
d e s c r ip tio n VARCHAR2(50),
p r ic e NUMBER(5, 2)
);
CREATE TABLE more_products (
prd_id INTEGER
Расширенные запросы 191
CONSTRAINT more_products_pk PRIMARY KEY,
prd_type_id INTEGER
CONSTRAINT more_products_fk_products_types
REFERENCES pro d u ct_ typ e s (p ro d u ct_ typ e_ id ),
name VARCHAR2(30) NOT NULL,
a v a ila b le CHAR(1) );
Следующий запрос извлекает из таблицы products значения столбцов
product_id, produ ct_type_id и name:
□ SELECT produ ct_id, product._type_id, name
FROM products;
PRODUCT_ID PRODUCT_TYPE_ID NAME
1 1 Modern Science
2 1 Chemistry
3 2 Supernova
4 2 Tank War
5 2 Z F ile s
6 - 2 2412: The Return
7 3 Space Force 9
8 3 From Another P lan e t
9 4 C la s s ic a l Music
10 4 Pop 3
11 4 C re a tiv e Y e ll
12 My Front Line
Следующий запрос извлекает из таблицы more_products значения
столбцов prd_id, prd_type_id и name:
□ SELECT prd_id, prd_type_id, name
FROM more_products;
p r d _ i d p r d _t y p e _ i d n a m e
1 1 Modern Science
2 1 Chemistry
3 Supernova
4 2 Lunar Landing
5 2 Submarine
Использование оператора UNION ALL
Оператор UNION ALL возвращает все строки, отобранные участвующими в нем
запросами, в том числе и повторяющиеся. Ниже приводится пример применения
оператора UNION ALL. Отметим, что отобранными из таблиц products и