- •Введение в модель данных sql
- •1. Лекция: Язык баз данных sql: общее введение, типы данных и средства определения доменов Введение
- •Краткая история языка sql
- •Структура языка sql
- •Типы данных sql
- •Tочные числовые типы
- •Истинно целые типы
- •Точные типы, допускающие наличие дробной части
- •Приближенные числовые типы
- •Типы символьных строк
- •Типы битовых строк
- •Типы даты и времени
- •Тип даты
- •Типы времени
- •Типы временной метки
- •Типы времени и временной метки с временной зоной
- •Типы временных интервалов
- •Булевский тип
- •Типы коллекций
- •Типы массивов
- •Типы мультимножеств
- •Анонимные строчные типы
- •Типы, определяемые пользователем
- •Ссылочные типы
- •Средства определения, изменения определения и отмены определения доменов
- •Определение домена
- •Примеры определений доменов
- •Изменение определения домена
- •Примеры изменения определения домена
- •Отмена определения домена
- •Неявные и явные преобразования типа или домена
- •Неявные преобразования типов в sql
- •Явные преобразования типов или доменов и оператор cast
- •Заключение
- •2. Лекция: Язык баз данных sql: средства определения базовых таблиц и ограничений целостности
- •Введение
- •Средства определения, изменения и ликвидации базовых таблиц
- •Определение базовой таблицы
- •Определение столбца
- •Значения столбца по умолчанию
- •Ограничения целостности столбца
- •Определение табличного ограничения
- •Табличное ограничение первичного или возможного ключа
- •Проверочное табличное ограничение
- •Табличное ограничение внешнего ключа
- •Разновидности способов сопоставления значений внешнего и возможного ключей
- •Поддержка ссылочной целостности и ссылочные действия
- •Примеры определений базовых таблиц
- •Изменение определения базовой таблицы
- •Добавление, изменение или удаление определения столбца
- •Примеры изменения определения столбца
- •Изменение набора табличных ограничений
- •Примеры изменения набора табличных ограничений
- •Отмена определения (уничтожение) базовой таблицы
- •Средства определения и отмены общих ограничений целостности
- •Определение общих ограничений целостности
- •Отмена определения общего ограничения целостности
- •Немедленная и откладываемая проверка ограничений
- •Заключение
- •3. Лекция: Язык баз данных sql: общая характеристика оператора select и организация списка ссылок на таблицы в разделе from
- •4. Лекция: Язык баз данных sql: предикаты раздела where оператора select
- •Предикат сравнения
- •Примеры запросов с использованием предиката сравнения
- •Предикат between
- •Примеры запросов с использованием предиката between
- •Предикат null
- •Примеры запросов с использованием предиката null
- •Предикат in
- •Примеры запросов с использованием предиката in
- •Предикат like
- •Примеры запросов с использованием предиката like
- •Предикат similar
- •Примеры запросов с использованием предиката similar
- •Предикат exists
- •Примеры запросов с использованием предиката exists
- •Предикат unique
- •Примеры запросов с использованием предиката unique
- •Предикат overlaps
- •Примеры запросов с использованием предиката overlaps
- •Предикат сравнения с квантором
- •Примеры запросов с использованием предиката сравнения с квантором
- •Предикат match
- •Примеры запросов с использованием предиката match
- •Предикат distinct
- •Примеры запросов с использованием предиката distinct
- •Заключение
- •5. Лекция: Язык баз данных sql: группировка и условия раздела having, порождаемые и соединенные таблицы
- •Логические выражения раздела having
- •Предикаты сравнения
- •Предикат between
- •Предикат null
- •Предикат in
- •Предикат like
- •Предикат exists
- •Предикат unique
- •Предикаты сравнения с квантором
- •Предикат distinct
- •Более сложные конструкции оператора выборки
- •Соединенные таблицы
- •Формальные определения
- •Примеры соединений разного вида
- •Примеры запросов с использованием соединенных таблиц
- •6. Лекция: Язык баз данных sql: средства формулировки аналитических и рекурсивных запросов
- •Возможности формулирования аналитических запросов
- •Раздел group by rollup
- •Агрегатная функция grouping
- •Раздел group by cube
- •Рекурсивные запросы
- •Определения, относящиеся к рекурсии
- •Рекурсивные запросы с разделом with
- •Раздел search
- •Раздел cyrcle
- •Рекурсивные представления
- •Заключение
- •7. Лекция: Язык баз данных sql: средства манипулирования данными
- •Введение
- •Базовые средства манипулирования данными
- •Оператор insert для вставки строк в существующие таблицы
- •Вставка всех строк указанной таблицы
- •Вставка явно заданного набора строк
- •Вставка строк результата запроса
- •Оператор update для модификации существующих строк в существующих таблицах
- •Оператор delete для удаления строк в существующих таблицах
- •Представления, над которыми возможны операции обновления
- •Представления, допускающие применение операций обновления, в стандарте sql/92
- •Представления, допускающие применение операций обновления, в стандарте sql:1999
- •Критерии применимости операций обновления
- •Правила функциональных зависимостей
- •Раздел with check option определения представления
- •Режимы проверки cascaded и local
- •Примеры результатов действия раздела with check option
- •Исторический очерк
Примеры соединений разного вида
Основное назначение приводимых ниже примеров состоит не в том, чтобы продемонстрировать практическую значимость разнообразных соединений, а лишь в том, чтобы помочь в них разобраться.1) Поэтому мы будем использовать упрощенные и формальные таблицы и показывать заголовки и тела результирующих таблиц.
Итак, пусть имеются таблицы table1 (a1, a2, c1, c2) и table2 (b1, b2, c1, c2) со следующими телами:
table1 | |||||||
a1 |
a2 |
c1 |
c2 | ||||
1 |
1 |
1 |
1 | ||||
1 |
1 |
2 |
3 | ||||
1 |
1 |
2 |
3 | ||||
2 |
3 |
4 |
NULL | ||||
3 |
NULL |
NULL |
5 | ||||
table2 |
| ||||||
b1 |
b2 |
c1 |
c2 |
| |||
1 |
1 |
1 |
1 |
| |||
1 |
2 |
2 |
3 |
| |||
3 |
3 |
2 |
3 |
| |||
4 |
4 |
4 |
4 |
| |||
3 |
NULL |
NULL |
5 |
| |||
3 |
NULL |
NULL |
5 |
|
Обозначим через JR таблицу, являющуюся результатом соединения. Тогда для операции table1 INNER JOIN table2 ON a1=b1 AND a2<b2 (внутреннее соединение по условию) тело JR будет следующим:
JR | |||||||
a1 |
a2 |
table1.c1 |
table1.c2 |
b1 |
b2 |
table2.c1 |
table2.c2 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
Строки-дубликаты появились в JR, поскольку в первом операнде присутствовали строки-дубликаты, удовлетворяющие условию соединения.
Результатом операции table1 INNER JOIN table2 USING (c2) (внутреннее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица.
JR | ||||||
a1 |
a2 |
table1.c1 |
c2 |
b1 |
b2 |
table2.c1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
Результат операции table1 INNER JOIN table2 USING (c1,c2):
JR | |||||
a1 |
a2 |
c1 |
c2 |
b1 |
b2 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
Такой же результат будет получен при выполнении операции table1 NATURAL INNER JOIN table2 (естественное внутреннее соединение). Более того, для произвольных таблиц table1 и table2 результаты операций table1 INNER JOIN table2 USING (с1, c2, ...cn) и table1 INNER NATURAL JOIN table2 совпадают в том и только в том случае, когда список имен столбцов с1, c2, ...cn включает все имена столбцов, общие для таблиц table1 и table2.
Результатом операции table1 LEFT OUTER JOIN table2 ON a1=b1 AND a2<b2 (левое внешнее соединение по условию>) будет следующая таблица:
JR | |||||||
a1 |
a2 |
table1.c1 |
table1.c2 |
b1 |
b2 |
table2.c1 |
table2.c2 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
2 |
3 |
4 |
NULL |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
NULL |
NULL |
Как видно, в результате левого внешнего соединения сохраняются все данные первого (левого) операнда.
Результатом операции table1 RIGHT OUTER JOIN table2 ON a1=b1 AND a2<b2 (правое внешнее соединение по условию) будет следующая таблица:
JR | |||||||
a1 |
a2 |
table1.c1 |
table1.c2 |
b1 |
b2 |
table2.c1 |
table2.c2 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
1 |
1 |
1 |
1 |
NULL |
NULL |
NULL |
NULL |
3 |
3 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
4 |
4 |
4 |
4 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
Как видно, в результате правого внешнего соединения сохраняются все данные второго (правого) операнда.
Результатом операции table1 FULL OUTER JOIN table2 ON a1=b1 AND a2<b2 (полное внешнее соединение по условию) будет следующая таблица:
JR | |||||||
a1 |
a2 |
table1.c1 |
table1.c2 |
b1 |
b2 |
table2.c1 |
table2.c2 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
3 |
2 |
3 |
4 |
NULL |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
1 |
1 |
1 |
1 |
NULL |
NULL |
NULL |
NULL |
3 |
3 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
4 |
4 |
4 |
4 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
Как видно, в результате полного внешнего соединения сохраняются данные обоих операндов. Кстати, полное внешнее соединение иногда называют еще симметричным внешним соединением. Очевидно, что все операции внутреннего соединения и операция полного внешнего соединения коммутативны, а операции левого и правого соединения коммутативными не являются.
Результатом операции table1 LEFT OUTER JOIN table2 USING (c2) (левое внешнее соединение по совпадению значений указанных одноименных столбцов>) будет следующая таблица:
JR | ||||||
a1 |
a2 |
table1.c1 |
c2 |
b1 |
b2 |
table2.c1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
2 |
3 |
4 |
NULL |
NULL |
NULL |
NULL |
Результатом операции table1 RIGHT OUTER JOIN table2 USING (c2) (правое внешнее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица:
JR | ||||||
a1 |
a2 |
table1.c1 |
c2 |
b1 |
b2 |
table2.c1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
NULL |
NULL |
NULL |
4 |
4 |
4 |
4 |
Результатом операции table1 FULL OUTER JOIN table2 USING (c2) (полное внешнее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица:
JR | ||||||
a1 |
a2 |
table1.c1 |
c2 |
b1 |
b2 |
table2.c1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
1 |
1 |
2 |
3 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
2 |
3 |
4 |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
4 |
4 |
4 |
4 |
Результатом операции table1 LEFT OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL LEFT OUTER JOIN table2 - естественное левое внешнее соединение) будет следующая таблица:
JR | |||||
a1 |
a2 |
c1 |
c2 |
b1 |
b2 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
3 |
4 |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
Результатом операции table1 RIGHT OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL RIGHT OUTER JOIN table2 - естественное правое внешнее соединение) будет следующая таблица:
JR | |||||
a1 |
a2 |
c1 |
c2 |
b1 |
b2 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
NULL |
NULL |
4 |
4 |
4 |
4 |
NULL |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
NULL |
NULL |
5 |
3 |
NULL |
Результатом операции table1 FULL OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL FULL OUTER JOIN table2 - естественное полное внешнее соединение) будет следующая таблица:
JR | |||||
a1 |
a2 |
c1 |
c2 |
b1 |
b2 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
1 |
1 |
2 |
3 |
1 |
2 |
1 |
1 |
2 |
3 |
3 |
3 |
2 |
3 |
4 |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
NULL |
NULL |
4 |
4 |
4 |
4 |
NULL |
NULL |
NULL |
5 |
3 |
NULL |
NULL |
NULL |
NULL |
5 |
3 |
NULL |
Наконец, результатом операции table1 UNION JOIN table2 (соединение объединением) будет следующая таблица:
JR | |||||||
a1 |
a2 |
table1.c1 |
table1.c2 |
b1 |
b2 |
table2.c1 |
table2.c2 |
1 |
1 |
1 |
1 |
NULL |
NULL |
NULL |
NULL |
1 |
1 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
1 |
1 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
2 |
3 |
4 |
NULL |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
1 |
1 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
1 |
2 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
3 |
3 |
2 |
3 |
NULL |
NULL |
NULL |
NULL |
4 |
4 |
4 |
4 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |
NULL |
NULL |
NULL |
NULL |
3 |
NULL |
NULL |
5 |