Реляционные операторы
Заполните таблицы какими-либо взятыми для примера данными.
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, является объединение, основанное на равенстве.