Выбрать главу

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 возвращает только строки, выбранные

обоими запросами.)