Реляционные операторы
В этой главе…
- Объединение таблиц, имеющих похожую структуру
- Объединение таблиц, имеющих разную структуру
- Получение нужных данных из множества таблиц
SQL – это язык запросов, используемый в реляционных базах данных. Почти во всех примерах предыдущих глав рассматривались простые базы данных с одной таблицей. Теперь настало время показать, в чем же состоит реляционность реляционной базы. Вообще говоря, эти базы называются "реляционными" потому, что состоят из множества связанных друг с другом таблиц (а "связанные друг с другом" – это по-английски "related").
Так как данные, хранящиеся в реляционной базе, распределены по множеству таблиц, то запрос обычно извлекает данные из более чем одной таблицы. В SQL:2003 имеются операторы, которые объединяют данные из множества исходных таблиц в одну. Это операторы UNION, INTERSECTION и EXCEPT, а также семейство операторов объединения JOIN. Причем каждый из них объединяет данные своим особым способом.
UNION
Оператор UNION (объединение) – это реализация в языке SQL оператора объединения из реляционной алгебры. Оператор UNION дает возможность получать информацию из нескольких таблиц, имеющих одинаковую структуру. Одинаковая структура означает следующее.
- Во всех таблицах имеется одинаковое количество столбцов.
- У всех соответствующих столбцов должны быть идентичный тип данных и одинаковая длина.
При соблюдении этих критериев таблицы являются совместимыми для объединения. В результате объединения двух таблиц возвращаются все строки, имеющиеся в каждой из них. Не возвращаются только повторяющиеся строки.
Скажем, вы создаете базу данных по бейсбольной статистике (см. главу 9). Она состоит из двух таблиц, совместимых для объединения, которые называются AMERICAN (Американская лига) и NATIONAL (Национальная лига). В каждой из них имеются по три столбца, и типы у всех соответствующих столбцов совпадают. На самом деле даже имена у таких столбцов одинаковые, хотя для объединения это условие не является обязательным.
В таблице NATIONAL перечислены имена, фамилии питчеров Национальной лиги и количество тех игр, в которых они все время были на подаче. Эти данные находятся в столбцах FirstName (имя), LastName (фамилия) и CompleteGames (полностью сыгранные игры). Та же информация, но только о питчерах Американской лиги, содержится в таблице AMERICAN. Если объединить таблицы NATIONAL и AMERICAN с помощью оператора UNION, то в результате получится виртуальная таблица со всеми строками из первой и второй таблиц. В этом примере, чтобы показать работу оператора UNION, я вставил в каждую таблицу всего лишь по несколько строк:
SELECT * FROM NATIONAL; | ||
FirstName | LastName | СompleteGames |
----------- | ----------- | ------------------ |
Sal | Maglie | 11 |
Don | Newcombe | 9 |
Sandy | Koufax | 13 |
Don | Drysdale | 12 |
SELECT * FROM AMERICAN; | ||
FirstName | LastName | СompleteGames |
----------- | ----------- | ------------------ |
Whitey | Ford | 12 |
Don | Larson | 10 |
Bob | Turley | 8 |
Allie | Reynolds | 14 |
SELECT * FROM NATIONAL | ||
UNION | ||
SELECT * FROM AMERICAN; | ||
FirstName | LastName | СompleteGames |
----------- | ----------- | ------------------ |
Allie | Reynolds | 14 |
Bob | Turley | 8 |
Don | Drysdale | 12 |
Don | Larson | 10 |
Don | Newcombe | 9 |
Sal | Maglie | 11 |
Sandy | Koufax | 13 |
Whitey | Ford | 12 |