Рис. 6.2.
Операция пересечения
110
Глава 6. Работа с множествами
множество данных, объединяющее множества А и В целиком, а затем
применить вторую операцию, чтобы удалить область пересечения. Ес
ли составное множество описать как
A
union
B
, а область пересечения –
как
A
intersect
B
, операция, необходимая для формирования представ
ленного на рис. 6.4 множества, выглядела бы так:
(A union B) except (A intersect B)
Конечно, часто есть несколько способов получения одного и того же
результата. Аналогичное множество можно было бы получить с помо
щью следующей операции:
(A except B) union (B except A)
A
B
= A except B
Рис. 6.3.
Операция разности
A
B
= ????
Рис. 6.4.
Загадочное множество данных
Теория множеств на практике
111
Эти концепции, наглядно представленные диаграммами, достаточно
просты для понимания. В следующих разделах будет показано, как
эти идеи реализуются в реляционных СУБД с помощью SQLоперато
ров работы с множествами.
Теория множеств на практике
Круги, представляющие множества данных на диаграммах предыду
щего раздела, никак не отражают содержимое множеств. Однако при
работе с реальными данными необходимо описывать структуру таб
лиц, если предполагается их комбинирование. Представим, например,
что произошло бы при попытке сгенерировать объединение описанных
ниже таблиц
product
и
customer
:
mysql>
DESC product
;
+++++++
| Field | Type | Null | Key | Default | Extra |
+++++++
| product_cd | varchar(10) | | PRI | | |
| name | varchar(50) | | | | |
| product_type_cd | varchar(10) | | MUL | | |
| date_offered | date | YES | | NULL | |
| date_retired | date | YES | | NULL | |
+++++++
5 rows in set (0.23 sec)
mysql>
DESC customer
;
+++++++
| Field | Type | Null | Key | Default | Extra |
+++++++
| cust_id | int(10) unsigned | | PRI | NULL | auto_increment |
| fed_id | varchar(12) | | | | |
| cust_type_cd | enum('I','B') | | | I | |
| address | varchar(30) | YES | | NULL | |
| city | varchar(20) | YES | | NULL | |
| state | varchar(20) | YES | | NULL | |
| postal_code | varchar(10) | YES | | NULL | |
+++++++
7 rows in set (0.04 sec)
После комбинирования первый столбец результирующей таблицы был
бы комбинацией столбцов
product.product_cd
и
customer.cust_id
, второй –
комбинацией столбцов
product.name
и
customer.fed_id
и т. д. Хотя неко
торые пары столбцов сочетаются без труда (т. е. два столбца числового
типа), неясно, как должны объединяться пары столбцов разного типа,
такие как числовой со строковым или строковый с датой. Кроме того,
в шестом и седьмом столбцах комбинированной таблицы будут только
данные шестого и седьмого столбцов таблицы
customer
, поскольку в таб
лице
product
всего пять столбцов. Очевидно, что таблицы, подлежащие
объединению, должны обладать некоторой общностью.
|