
- •Информационное обеспечение систем управления Построение запросов при работе с базой данных (Учебное пособие)
- •Тестовая база данных
- •Выборка данных. Команда select
- •Синтаксис оператора select
- •Простые варианты поиска данных
- •Упорядочение результата запроса. Предложение order by
- •Использование ключевого слова distinct
- •Предложение where
- •Синтаксис предложения where
- •Использование операторов сравнения
- •Использование варианта between
- •Проверка на присутствие в списке значений (вариант in)
- •Проверка на пустое значение
- •Поиск в строковых столбцах
- •Вариант like
- •Использование логических операций в условиях поиска
- •Порядок выполнения логических операций
- •Преобразование данных при выборке
- •Обобщение Данных с помощью Агрегатных Функций
- •Использование distinct с count
- •Предложение group by
- •Предложение having
- •Соединение таблиц
- •Внутренние соединения (связывание по равенству)
- •Внешние соединения
- •Левое внешнее соединение
- •Правое внешнее соединение
- •Полное внешнее соединение
- •Более сложные примеры соединений
- •Рефлексивное соединение, или самосоединение
- •Использование подзапросов в операторах sql
- •Выбор одного
- •Использование в подзапросе агрегатных функций
- •Связанные подзапросы
- •Использование оператора exists
- •Использование варианта in с подзапросами
- •Использование not exists
- •Объединение запросов
- •Команда union
- •Добавление данных. Команда insert
- •Добавление отдельной строки
- •Добавление группы строк
- •Обновление уже имеющихся данных. Команда update
- •Удаление данных из таблиц. Команда delete
- •Генераторы и их использование
- •Создание генераторов
- •Использование генераторов
- •Увеличение значения генератора
- •Получение значения генератора в приложение
- •Триггер
Удаление данных из таблиц. Команда delete
Для удаления данных из таблиц используется команда DELETE. Команда DELETE предназначена не для того, чтобы удалять значения отдельных столбцов, а для того, чтобы удалять целые записи. Оператор DELETE следует применять с осторожностью — слишком уж безотказно он работает.
Чтобы удалить одну или несколько записей из таблицы, используйте следующий синтаксис оператора DELETE.
DELETE FROM имя_таблицы
[WHERE условие];
Если ключевое слово WHERE в операторе DELETE опущено, будут удалены все строки таблицы. Поэтому практически всегда необходимо использовать ключевое слово WHERE в операторе DELETE.
В качестве примера удалим все сведенья о билетах с датой вылета ранее 1 января 2000 года: lvii
DELETE FROM TICKET
WHERE TC_FL_DATE < '01.01.2000'
При использовании команды DELETE бывает полезно использование вложенных запросов SELECT. Удалим из таблицы PERSON тех людей кто ни разу не летал в качестве пассажира или члена экипажа. Чтобы выполнить это, нужно найти коды личностей всех членов экипажа (из таблицы EQUIPAGE) и всех пассажиров с билетами (из таблицы TICKET). Получаем запрос на удаление: lviii
DELETE FROM PERSON
WHERE NOT PR_CODE IN
(SELECT EQ_PR_CODE FROM EQUIPAGE)
AND NOT PR_CODE IN
(SELECT TC_PR_CODE FROM TICKET)
Здесь используются два вложенных запроса. Первый возвращает коды личностей членов экипажа из таблицы EQUIPAGE, а второй коды личностей из таблицы TICKET. В результате будут удалены все строки из таблицы PERSON коды личностей которых не попадают в результат вывода каждого из этих двух запросов.
Генераторы и их использование
При заполнении таблиц с суррогатным первичным ключом нам приходится вручную проставлять его значение, например - 1, 2, 3..., 10, 20, 30, и т.п. Это в частности, не дает возможности добавить в таблицу несколько строк одной командой INSERT, при помощи конструкции SELECT, как это было показано в предшествующем разделе.
Для решения этой проблемы большинство SQL-серверов имеет специальные механизмы для создания уникальных идентификаторов. В Interbase и Firebird для этого существует механизм генераторов. Генераторы предназначены для получения последовательностей уникальных чисел. (1, 2, 3.. и т.д.). Например, в таблице аэропортов для их нумерации введен столбец AP_CODE, по которому построен первичный ключ. Столбец можно заполнять значениями генератора.
Нужно сразу заметить, что сами по себе генераторы не обеспечивают сохранение последовательности номеров в случае удаления записей - генератор всего лишь выдает числа по очереди увеличивая их на некоторую величину и обеспечивая уникальность выданных значений. То есть, генератор выглядит как переменная типа Integer , которая находится в памяти, и над которой можно выполнять операции Inc и Dec (прибавления и убавления).
Создание генераторов
Генератор - это специальный объект базы данных, который генерирует уникальные последовательные числа. Эти числа могут быть использованы в качестве идентификаторов (например, код аэропорта, код личности и т.п.). Для создания генератора необходимо использовать оператор:
CREATE GENERATOR generatorname;
Как правило, генераторы, предназначаемые для заполнения поля будем называть по имени таблицы с прибавлением вначале строки «GEN_», а в конце «_ID». (Именно такое соглашение по именам использует IBExpert) Например, запрос на создание генератора для таблицы AIRPORT (ключевого поля AP_CODE) будет иметь вид
CREATE GENERATOR GEN_AIRPORT_ID
После создания генератора его значения можно получать при помощи функции
GEN_ID(generatorname, inc_value)
где inc_value - число, на которое необходимо прирастить значение а
Таким образом можно заранее узнать какое число выдаст генератор при следующем обращении, так для генератора предназначенного для выдачи первичного ключа таблицы.
Генераторы возвращают значения (и сохраняют свои значения на диске) вне контекста транзакции пользователя. Это означает, что если значение генератора было увеличено с 10 до 11 (инкремент 1), то даже при откате транзакции (ROLLBACK) значение генератора, выданное в этой транзакции, не вернется к предыдущему. Вместе с этим гарантируется, что каждому пользователю будет всегда возвращено уникальное значение генератора (вызов функции GEN_ID всегда происходит «монопольно», то есть непараллельно для любого числа одновременных вызовов, чтобы исключить возможность получения разными пользователями одного и того же значения).