Простой оператор объединения
Простой оператор объединения
Любой многотабличный запрос является оператором объединения. Исходные таблицы объединяются в том смысле, что в таблице, полученной в результате этого объединения, будет находиться информация из всех исходных таблиц. Самым простым оператором объединения является оператор SELECT, выполняемый с двумя таблицами и не имеющий никаких ограничителей из предложения WHERE. Так что каждая строка из первой таблицы объединяется с каждой строкой из второй. В результате получается таблица, которая является декартовым произведением двух исходных таблиц. Понятие декартова произведения обсуждалось в главе 9 в связи с использованием предложения FROM. Количество строк в полученной таблице равно произведению числа строк в первой исходной таблице и числа строк во второй.
Представьте, что вы, например, являетесь в какой-либо компании менеджером по персоналу и что часть вашей работы состоит в том, чтобы вести учет сотрудников. Большинство данных о сотруднике, таких, например, как домашний адрес и номер телефона, не являются особо засекреченными. Однако доступ к некоторым данным, таким, например, как зарплата, должен быть только утех, кто имеет соответствующее разрешение. Чтобы защитить секретную информацию, держите ее в отдельной таблице, имеющей парольную защиту. Посмотрите на следующие две таблицы:
EMPLOYEE (сотрудник) | COMPENSATION (компенсация) |
-------------------------- | --------------------------------- |
EmpID (идентификатор сотрудника) | Employ (сотрудник) |
FName (имя) | Salary (зарплата) |
LName (фамилия) | Bonus (премиальные) |
City (город) | |
Phone (телефон) |
Заполните таблицы какими-либо взятыми для примера данными.
EmpID | FName | LName | City | Phone | Employ | Salary | BONUS |
-------- | -------- | -------- | ---- | ------- | -------- | ------- | -------- |
1 | Whitey | Ford | Orange | 555-1001 | 1 | 33000 | 10000 |
2 | Don | Larson | Newark | 555-3221 | 2 | 18000 | 2000 |
3 | Sal | Maglie | Nutley | 555-6905 | 3 | 24000 | 5000 |
4 | Bob | Turley | Passaic | 555-8908 | 4 | 22000 | 7000 |
Создайте виртуальную таблицу с помощью следующего запроса:
SELECT *
FROM EMPLOYEE, COMPENSATION ;
Вот что вышло:
EmpID | FName | LName | City | Phone | Employ | Salary | Bonus |
------- | -------- | -------- | ---- | ------- | -------- | ------- | ------- |
1 | Whitey | Ford | Orange | 555-1001 | 1 | 33000 | 10000 |
1 | Whitey | Ford | Orange | 555-1001 | 2 | 18000 | 2000 |
1 | Whitey | Ford | Orange | 555-1001 | 3 | 24000 | 5000 |
1 | Whitey | Ford | Orange | 555-1001 | 4 | 22000 | 7000 |
2 | Don | Larson | Newark | 555-3221 | 1 | 33000 | 10000 |
2 | Don | Larson | Newark | 555-3221 | 2 | 18000 | 2000 |
2 | Don | Larson | Newark | 555-3221 | 3 | 24000 | 5000 |
2 | Don | Larson | Newark | 555-3221 | 4 | 22000 | 7000 |
3 | Sal | Maglie | Nutley | 555-6905 | 1 | 33000 | 10000 |
3 | Sal | Maglie | Nutley | 555-6905 | 2 | 18000 | 2000 |
3 | Sal | Maglie | Nutley | 555-6905 | 3 | 24000 | 5000 |
3 | Sal | Maglie | Nutley | 555-6905 | 4 | 22000 | 7000 |
4 | Bob | Turley | Passaic | 555-8908 | 1 | 33000 | 10000 |
4 | Bob | Turley | Passaic | 555-8908 | 2 | 18000 | 2000 |
4 | Bob | Turley | Passaic | 555-8908 | 3 | 24000 | 5000 |
4 | Bob | Turley | Passaic | 555-8908 | 4 | 22000 | 7000 |
В получившейся таблице, представляющей собой декартово произведение таблиц EMPLOYEE и COMPENSATION, имеется значительный излишек данных. Кроме того, эта таблица не имеет большого смысла. В ней каждая строка из таблицы EMPLOYEE добавляется к каждой строке из таблицы COMPENSATION. Единственными строками в этой таблице, передающими содержательную информацию, являются те, в которых число из столбца EmpID, взятого из таблицы EMPLOYEE, равняется числу из столбца Employ, взятого из таблицы COMPENSATION. В этих строках имя, фамилия и адрес сотрудника объединены с выплатами того же сотрудника.
Когда вы пытаетесь получить из множества таблиц полезную информацию, то декартово произведение, созданное с помощью простого объединения, почти никогда не бывает тем, что вам нужно. Впрочем, почти всегда первым шагом к тому, что вам нужно, бывает декартово произведение. Отфильтровывать из объединения ненужные строки можно с помощью ограничений, указываемых в предложении WHERE. Самым распространенным объединением, использующим фильтрующее предложение WHERE, является объединение, основанное на равенстве.