- •Введение в модель данных 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
- •Исторический очерк
Примеры запросов с использованием предиката similar
SELECT DEPT_NAME, DEPT_NO
FROM DEPT
WHERE DEPT_NAME SIMILAR TO
'(HARD|SOFT)WARE%\_[:DIGIT:]+' ESCAPE '\';
Пример 14.14. Найти номера и названия отделов, название которых начинается со слов 'Hardware' или 'Software', а за ними (не обязательно непосредственно) следует последовательность десятичных цифр, предваряемых символом подчеркивания. (html, txt)
SELECT DEPT_NAME, DEPT_NO
FROM DEPT
WHERE DEPT_NAME SIMILAR TO '[^1-9]+%';
Пример 14.15. Найти номера и названия проектов, название которых не начинается с последовательности цифр. (html,txt)
Предикат exists
Предикат exists определяется следующим синтаксическим правилом:
exists_predicate ::= EXISTS (query_expression)
Значением условия EXISTS (query_expression) является true в том и только в том случае, когда мощность таблицы-результата выражения запросов больше нуля, иначе значением условия является false.
Примеры запросов с использованием предиката exists
SELECT DEPT.DEPT_NO
FROM DEPT
WHERE EXISTS
(SELECT EMP.EMP_NO
FROM EMP
WHERE EMP.DEPT_NO = DEPT.DEPT_NO
AND EXISTS
(SELECT PRO.PRO_MNG
FROM PRO
WHERE PRO.PRO_MNG = EMP.EMP_NO));
Пример 14.16. Найти номера отделов, среди сотрудников которых имеются менеджеры проектов. (html,txt)
Эту формулировку можно упростить, избавившись от самого вложенного запроса (пример 14.16.1):
SELECT DEPT.DEPT_NO
FROM DEPT
WHERE EXISTS
(SELECT EMP.EMP_NO
FROM EMP, PRO
WHERE EMP.DEPT_NO = DEPT.DEPT_NO
AND PRO.PRO_MNG = EMP.EMP_NO);
Пример 14.16.1. (html,txt)
Далее заметим, что по смыслу предикат предиката EXISTS список выборки во вложенном подзапросе является несущественным, и формулировку запроса можно изменить, например, следующим образом (пример 14.16.2):
SELECT DEPT.DEPT_NO
FROM DEPT
WHERE EXISTS
(SELECT *
FROM EMP, DEPT
WHERE EMP.DEPT_NO = DEPT.DEPT_NO
AND PRO.PRO_MNG = EMP.EMP_NO);
Пример 14.16.2. (html,txt)
Запросы с предикатом EXISTS можно также переформулировать в виде запросов с предикатом сравнения (пример 14.16.3):
SELECT DEPT.DEPT_NO
FROM DEPT
WHERE (SELECT COUNT(*)
FROM EMP, DEPT
WHERE EMP.DEPT_NO = DEPT.DEPT_NO
AND PRO.PRO_MNG = EMP.EMP_NO ) >= 1;
Пример 14.16.3. (html, txt)
SELECT DEPT.DEPT_NO
FROM DEPT
WHERE NOT EXISTS
(SELECT *
FROM EMP EMP1, EMP EMP2
WHERE EMP1.EMP_NO = DEPT.DEPT_MNG AND
EMP2.DEPT_NO = DEPT.DEPT_NO AND
EMP2.EMP_SAL > EMP1.EMP_SAL);
Пример 14.17. Найти номера отделов, размер заработной платы сотрудников которых не превышает размер заработной платы руководителя отдела. (html,txt)
Предикат unique
Этот предикат позволяет сформулировать условие отсутствия дубликатов в результате запроса:
unique_predicate ::= UNIQUE (query_expression)
Результатом вычисления условия UNIQUE (query_expression) является true в том и только в том случае, когда в таблице-результате выражения запросов отсутствуют какие-либо две строки, одна из которых является дубликатом другой. В противном случае значение условия есть false.
Примеры запросов с использованием предиката unique
SELECT DEPT_NO
FROM DEPT
WHERE UNIQUE
(SELECT EMP_NAME, EMP_BDATE
FROM EMP
WHERE EMP.DEPT_NO = DEPT.DEPT_NO);
Пример 14.18. Найти номера отделов, сотрудников которых можно различить по имени и дате рождения. (html,txt)
Возможна альтернативная, но более сложная формулировка этого запроса с использованием предиката NOT EXISTS (пример 14.18.1):
SELECT DEPT_NO
FROM DEPT
WHERE NOT ESISTS
(SELECT *
FROM EMP, EMP EMP1
WHERE EMP1.EMP_NO <> EMP.EMP_NO
AND EMP.DEPT_NO = DEPT.DEPT_NO
AND EMP1.DEPT_NO = DEPT.DEPT_NO
AND EMP1.EMP_NAME = EMP.EMP_NAME
AND(EMP1.EMP_BDATE = EMP.EMP_BDATE
OR (EMP.EMP_BDATE IS NULL
AND EMP1.EMP_BDATE IS NULL)));
Пример 14.18.1. (html,txt)
Если же ограничиться требованием уникальности имен служащих, то возможна следующая формулировка (пример 14.18.2):
SELECT DEPT_NO
FROM DEPT
WHERE (SELECT COUNT (EMP_NAME)
FROM EMP
WHERE EMP.DEPT_NO = DEPT.DEPT_NO) =
(SELECT COUNT (DISTINCT EMP_NAME)
FROM EMP
WHERE EMP.DEPT_NO = DEPT.DEPT_NO);
Пример 14.18.2. (html,txt)