more_products оказываются все строки, включая и повторяющиеся:
П SELECT product_id, product_type_id, name
FROM products
UNION ALL
SELECT prd_id, prd_type_id, name
FROM more_products;
192 Глава 7
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
1 1 Modern Science
2 1 Chemistry
3 Supernova
4 2 Lunar Landing
5 2 Submarine
17 rows s e le c te d .
Эти строки можно отсортировать, используя фразу ORDER BY, следом
за которой идёт позиция столбца в обоих запросах. В приведенном ниже
примере сортировка проводится по первому столбцу:
□ SELECT product_id, product_type_id, name
FROM products
UNION ALL
SELECT prd_id, prd_type_id, name
FROM more_products
ORDER BY 1;
PRODUCT_ID PRODUCT_TYPE_ID NAME
1 1
1 1
2 1
2 1
3 2
3
4 2
4 2
5 2
5 2
6
7 3
8 3
9 4
10 4
11 4
12
Modern Science
Modern Science
Chemistry
Chemistry
Supernova
Supernova
TankWar
Lunar Landing
Z F ile s
Submarine
2412: The Return
Space Force 9
From Another Plan e t
C la s s ic a l Music
Pop 3
C re a tiv e Y e ll
My Front Line
17 rows se le c te d .
Расширенные запросы 19В
Использование оператора UNION
Оператор UNION возвращает все неповторяющиеся строки, полученные запросами.
В приведенном ниже примере используется оператор UNION; обратите
внимание, что встречающиеся повторно ’’Modern Science” и
“Chemistry” не выбраны, и возвращено только 15 строк:
□ SELECT product_id, product_type_id, name
FROM products
UNION
SELECT prd_id, prd_type_id, name
FROM more_products;
PRODUCT_ID PRODUCT_TYPE_ID NAME
1 1 Modern Science
2 1 Chemistry
3 2 Supernova
3 Supernova
4 2 Lunar Landing
4 ^ 2 Tank War
5 ' 2 Submarine
5 2 Z F ile s
6 2 2412: The Return
7 3 Space Force 9
8 3 From Another P lan et
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
15 rows se le c te d .
Использование оператора INTERSECT
Оператор INTERSECT возвращает только строки, отобранные обоими запросами.
В следующем примере используется оператор INTERSECT; обратите
внимание, что возвращены только строки ’’Modern Science” и “Chemistry”:
□ SELECT product_id, product_type_id, name
FROM products
INTERSECT
SELECT prd_id, prd_type_id, name
FROM more_products;
PR0DUCT_ID PRODUCT_TYPE_ID NAME
1 1 Modern Science
2 1 Chemistry
Использование оператора MINUS
Оператор MINUS возвращает строки, которые остаются, если из строк,
отобранных первым запросом, исключить строки, отобранные вторым
194 Глава 7
запросом. В следующем примере используется оператор MINUS; строки из
таблицы more_products исключаются из строк таблицы products, а оставшиеся
строки возвращаются:
□ SELECT product_id, product_type_id, name
FROM products
MINUS
SELECT prd_id, prd_type_id, name
FROM more_products;
.ID PRODUCT_TYPE_ID NAME
3 2 Supernova
4 2 Tank War
5 2 Submarine
5 2 Z F ile s
6 2 2412: The Return
7 3 Space Force 9
8 3 From Another P lan et
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
10 rows s e le c te d .
Комбинирование операторов для работы со множествами
Можно скомбинировать более двух запросов при помощи нескольких операторов
для работы со множествами, причем результаты работы одного
оператора служат входом для следующего. По умолчанию все операторы
для работы со множествами эквивалентны от первого до последнего, но,
тем не менее, рекомендуется скобками указывать порядок их выполнения
на тот случай, если корпорация Oracle в следующих версиях изменит порядок
их выполнения.
В примерах этого раздела используется таблица product_changes, которая
создается сценарием store_schema.sqclass="underline"
П CREATE TABLE product_changes (
рrod u ct_id INTEGER
CONSTRAINT prod_changes_pk PRIMARY KEY,
produ ct_type_ id INTEGER
CONSTRAINT prod_changes_fk_product_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)
);
Следующий запрос возвращает столбцы product_id, produ ct_type_id и
name таблицы product_changes:
□ SELECT product_id, product_type_id, name
FROM product_changes;
Расширенные запросы 195
ID PRODUCT_TYPE_ID NAME
1 1 Modern Science
2 1 New Chemistry
3 1 Supernova
13 2 Lunar Landing
14 2 Submarine
15 2 Airplane
В следующем примере будут выполнены такие действия.
■ Оператор UNION будет использован для объединения результатов из
таблиц products и more_products. (Оператор UNION возвращает только
недублирующиеся строки, выбранные обоими запросами.)
■ Оператор INTERSECT будет использован для объединения результатов
предыдущего оператора UNION с результатами таблицы product_
changes. (Оператор INTERSECT возвращает только строки, выбранные
обоими запросами.)