Язык запросов SQL

Простой оператор объединения



Простой оператор объединения

Любой многотабличный запрос является оператором объединения. Исходные таблицы объединяются в том смысле, что в таблице, полученной в результате этого объединения, будет находиться информация из всех исходных таблиц. Самым простым оператором объединения является оператор 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, является объединение, основанное на равенстве.



Содержание раздела