- •Конспект лекций
- •Часть 3 «Язык запросов sql»
- •5.080406 – «Эксплуатация систем обработки информации и принятия решения»
- •Введение
- •Лекция 1 «Введение в структурированный язык запросов sql»
- •2 Введение в технологию клиент-сервер
- •3 Типы команд sql
- •4 Преимущества языка sql
- •2 Строки
- •3 Числа
- •4 Логические данные
- •5 Дата и время
- •6 Интервалы
- •2 Изменение таблицы
- •3 Удаление таблицы
- •4 Индексы
- •1 Ограничения для таблиц
- •2 Внешние ключи
- •1 Ограничения для таблиц
- •2 Внешние ключи
- •2 Оператор from
- •3 Оператор where
- •3.1 Сравнение
- •3.2 Диапазон
- •3.3 Принадлежность множеству
- •3.4 Соответствие шаблону
- •3.5 Значение null
- •2 Использование итоговых функций
- •3 Предложение group by
- •4 Предложение having
- •2 Использование подзапросов, возвращающих единичное значение
- •3 Использование операций in и not in
- •4 Использование ключевых слов any и all
- •5 Использование операций exists и not exists
- •1 Определение представления
- •2 Обновление данных в представлениях
- •1 Определение представления
- •2 Обновление данных в представлениях
2 Внешние ключи
Одна из важнейших разновидностей ограничений связана с определением внешних ключей. Внешний ключ – это столбец или группа столбцов, соответствующих первичному ключу другой таблицы. Чтобы понять синтаксис выражения, определяющего внешний ключ, рассмотрим пример.
Пусть в базе данных имеются две таблицы:
– Заказы (ID_заказа, ID_клиента) – содержит сведения о том, какие заказы сделал тот или иной клиент;
– Клиенты (ID_клиента, Имя, Адрес, Телефон) — сведения о клиентах (справочник).
В таблице клиенты столбец ID_клиента является первичным ключом, т. е. его значения отличны от null и уникальны. В таблице заказы столбец ID_клиента не обязан иметь уникальные значения, поскольку один и тот же клиент может сделать несколько заказов. Вместе с тем любому значению столбца Заказы.ID_клиента соответствует единственное значение столбца клиенты.ID_клиента. При описанных условиях столбец ID_клиента таблицы Заказы является внешним ключом, ссылающимся на первичный ключ ID_клиента таблицы Клиенты.
Внешний ключ определяется как ограничение для таблицы в выражении с ключевыми словами constrain foreign key (ограничение «внешний ключ»):
CONSTRAINT FOREIGN KEY внешнийКлюч REFERENCES внешняя Та блица (первичныйКлюч)
Здесь внешнийКлюч – имя столбца или список столбцов, разделенных запятыми, которые определяют внешний ключ, за ключевым словом references (ссылки) указывается внешняя таблица и ее первичный ключ, на который ссылается внешний ключ.
Для рассмотренного ранее примера таблицу заказы можно определить следующим образом:
CREATE TABLE Заказы
( ID_заказа INTEGER,
ID_клиента INTEGER,
CONSTRAINT FOREIGN KEY ID_клиента REFERENCES Клиенты (ID_клиента));
Использование внешних ключей обеспечивает сохранение ссылочной целостности базы данных при изменении и удалении записей. Если бы таблицы Заказы и Клиенты не были связаны, то при удалении записи из таблицы Клиенты в таблице Заказы могли остаться ссылки на клиента, о котором уже нет сведений. Этот факт обычно расценивается как аномалия удаления. В случае определения в таблице заказы внешнего ключа ID_клиента из таблицы Клиенты не удастся удалить клиента, если он сделал хотя бы один заказ. Если требуется удалить из базы данных все, что касается определенного клиента, то сначала удаляются записи в таблице Заказы, а потом – в таблице Клиенты.
Аналогичная ситуация может произойти и при обновлении данных. Например, в таблице клиенты необходимо изменить идентификатор клиента, имеющего заказы и, таким образом, внешнему ключу теперь не на что ссылаться. Это аномалия изменения. В данном случае необходимо сначала добавить новую запись в таблицу клиенты, указав в ней необходимое значение ID_клиента, затем изменить в таблице заказы все старые значения ID_клиента на то, которое только что ввели в новой записи таблицы клиенты, а затем удалить из таблицы клиенты запись со старым идентификатором клиента.
Чтобы в таблицах, связанных внешним ключом, не делать модификацию данных в несколько этапов, в выражении constrain foreign key можно использовать дополнительные ключевые слова:
– on delete cascade | set null (при удалении каскадировать | установить null);
– ON UPDATE CASCADE | SET NULL (при обновлении каскадировать | установить null).
Здесь вертикальная черта не является элементом синтаксиса, а лишь разделяет возможные варианты ключевых слов.
Так, при использовании on delete cascade в случае удаления записи со значением первичного ключа, которое имеется во внешнем ключе другой таблицы, соответствующие записи удаляются автоматически из двух таблиц. Например, при удалении из таблицы клиенты записи о клиенте, имеющем заказы, в таблице Заказы также будут удалены все записи, ссылающиеся на данного клиента. Чтобы данная стратегия выполнялась, таблица Заказы должна быть определена следующим образом:
CREATE TABLE Заказы
(ID_заказа INTEGER,
ID_клиента INTEGER,
CONSTRAINT FOREIGN KEY ID_клиента
REFERENCES Клиенты (ID_клиента)
ON DELETE CASCADE);
Однако на практике обычно предпочитают сначала убедиться, что клиент не имеет заказов, и лишь затем вычеркнуть его из справочника.
Вариант set null обычно используется при обновлении данных. Например:
CREATE TABLE Заказы ( ID_заказа INTEGER,
ID клиента INTEGER,
CONSTRAINT FOREIGN KEY ID_клиента
REFERENCES Клиенты (ID_клиента)
ON UPDATE SET NULL);
В данном случае при изменении (в том числе и при удалении) в таблице клиенты записи, на которую ссылается внешний ключ таблицы Заказы, значения внешнего ключа устанавливаются в null. Однако этот вариант не сработает, если на столбец Заказы.ID_клиента наложено ограничение not null. Обычно так и бывает, поскольку при оформлении заказа клиент должен быть обязательно указан. Поэтому, на всякий случай, лучше использовать ключевые слова on update cascade.
Лекция 5 «Выполнение запросов в SQL»
План
1 Оператор SELECT
2 Оператор FROM
3 Оператор WHERE
3.1 Сравнение
3.2 Диапазон
3.3 Принадлежность множеству
3.4 Соответствие шаблону
3.5 Значение NULL
4 Предложение ORDER BY
1 Оператор SELECT
Оператор SELECT – один из наиболее важных и самых распространенных операторов SQL. Он позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Будучи очень мощным, он способен выполнять действия, эквивалентные операторам реляционной алгебры, причем в пределах единственной выполняемой команды. При его помощи можно реализовать сложные и громоздкие условия отбора данных из различных таблиц.
Оператор SELECT – средство, которое полностью абстрагировано от вопросов представления данных, что помогает сконцентрировать внимание на проблемах доступа к данным. Примеры его использования наглядно демонстрируют один из основополагающих принципов больших (промышленных) СУБД: средства хранения данных и доступа к ним отделены от средств представления данных. Операции над данными производятся в масштабе наборов данных, а не отдельных записей. Оператор SELECT имеет следующий формат:
SELECT [ALL | DISTINCT ] {*|[имя_столбца
[AS новое_имя]] [,...n]
FROM имя_таблицы [[AS] псевдоним] [,...n]
[WHERE <условие_поиска>]
[GROUP BY имя_столбца [,...n]]
[HAVING <критерии выбора групп>]
[ORDER BY имя_столбца [,...n]]
Оператор SELECT определяет поля (столбцы), которые будут входить в результат выполнения запроса. В списке они разделяются запятыми и приводятся в такой очередности, в какой должны быть представлены в результате запроса. Если используется имя поля, содержащее пробелы или разделители, его следует заключить в квадратные скобки. Символом * можно выбрать все поля, а вместо имени поля применить выражение из нескольких имен.
Если обрабатывается ряд таблиц, то (при наличии одноименных полей в разных таблицах) в списке полей используется полная спецификация поля, т.е. Имя_таблицы.Имя_поля.
