Реляционные операторы
Объединение, основанное на равенстве
Объединение, основанное на равенстве, – это простое объединение с предложением WHERE, в котором находится условие, определяющее, что значение из одного столбца первой таблицы должно быть равно значению из соответствующего столбца второй таблицы. Если применить такое объединение к таблицам, имеющимся в примере из предыдущего раздела, то можно получить намного более содержательный результат:
SELECT * FROM EMPLOYEE, COMPENSATION WHERE EMPLOYEE.EmpID = COMPENSATION.Employ;
И вот что вышло:
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 |
В этой таблице зарплаты и премии, расположенные справа, прилагаются к данным о сотрудниках, находящимся слева. Впрочем, лишние данные есть и в этой таблице, так как столбец EmpID повторяет столбец Employ. Исправить этот недостаток можно, сформулировав запрос немного по-другому:
SELECT EMPLOYEE.*, COMPENSATION.SALARY, COMPENSATION.Bonus FROM EMPLOYEE, COMPENSATION WHERE EMPLOYEE.EmpID = COMPENSATION.Employ;
В результате получилось следующее:
EmpID | FName | LName | City | Phone | Salary | Bonus |
---|---|---|---|---|---|---|
1 | Whitey | Ford | Orange | 555-1001 | 33000 | 10000 |
2 | Don | Larson | Newark | 555-3221 | 18000 | 2000 |
3 | Sal | Maglie | Nutley | 555-6905 | 24000 | 5000 |
4 | Bob | Turley | Passaic | 555-8908 | 22000 | 7000 |
Эта таблица сообщает вам то, что вы хотите знать, при этом не "нагружая" вас никакими лишними данными. Впрочем, писать сам запрос было несколько утомительно. Чтобы избежать двусмысленности, в именах столбцов приходилось явно указывать имена таблиц. Единственная выгода от этого – тренировка пальцев.
Можно облегчить труд по вводу кода SQL, если использовать псевдонимы (или имена корреляции). Псевдоним – это другое, более короткое имя таблицы. Если переделать предыдущий запрос с помощью псевдонимов, то получится примерно следующее:
SELECT Е.*, С.Salary, С.Bonus FROM EMPLOYEE E, COMPENSATION С WHERE E.EmpID = С.Employ;
В этом примере Е – это псевдоним для EMPLOYEE, а С – для COMPENSATION. Действие псевдонима ограничено только тем оператором, в котором он определен. После объявления псевдонима в предложении FROM его необходимо использовать в пределах оператора. При этом нельзя одновременно использовать и длинную форму имени таблицы, и псевдоним.