Безопасность систем баз данных. Учебное пособие
.pdfmysql> INSERT INTO prestuplenie
-> (gruppirovka_id, prestupnik_id,
-> prestuplenie_name, prestuplenie_id) -> VALUES (7, 2,‘Kvartirnaya krazha’,1);
Query OK, 1 row affected (0.00 sec)
Поскольку не указали столбцыprestuplenie_srok и data_osvobozhdeniya, то по умолчанию они остались пустые(о чем свидетельствует значение Null в данных полях). Это можно проверить с помощью следующего запроса:
mysql> SELECT * FROM prestuplenie WHERE
->gruppirovka_id = 7
-> AND prestupnik_id = 2;
Можно применить данный метод для групповой вставки, например, напишем запрос для добавления преступлений для преступника «Pomoev Artur Vladimirovich»:
mysql> INSERT INTO prestuplenie
-> (gruppirovka_id, prestupnik_id,
-> prestuplenie_id, prestuplenie_name,
-> prestuplenie_srok, data_osvobozhdeniya) -> VALUES (7,1,1,’Kvartirnaya krazha’,3, -> ’1995-10-22’),
-> (7,1,2, ‘Ograblenie magazina’,5, -> ’2001-09-18’);
Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0
Недостатки этого метода состоят в том, что, вводя по памяти имена столбцов, некоторые значения можно случайно пропус-
тить. Пропущенным столбцам будут присвоены значения по умолчанию.
Существует еще один тип синтаксисаINSERT. Можно указать имя столбца вместе со значением. Таким образом, не потре-
буется мысленно сопоставлять список значений со списком столбцов. Далее представлен пример добавления даниловской (Danilovskaya) с использованием этого синтаксиса:
mysql> INSERT INTO gruppirovka
71
-> SET gruppirovka_id = 7, gruppirovka_name=’ Danilovskaya’;
Query OK, 1 row affected (0.00 sec)
Синтаксис требует указать имя таблицы, ключевое слово SET, а затем пары«столбец-значение», разделенные запятыми. Неназванным столбцам присваиваются значения по умолчанию.
Основным недостатком метода является вероятность случайного пропуска значения для столбцов при вводе их имен. Немаловажным является и тот факт, что такой метод нельзя использовать для групповой вставки.
6.2. Удаление записей в таблицах базы данных. Инструкция DELETE
Инструкция DELETE используется для удаления одной или нескольких строк из базы данных. Опишем удаление в отдельной таблице.
Базовая инструкция DELETE.
Инструкцию DELETE лучше всего использовать для удаления всех строк таблицы. Предположим, нужно очистить таблицу gruppirovka. Применим для этого следующую инструкцию:
mysql> DELETE FROM gruppirovka;
Query OK. 7 rows affected (0.07 sec)
Данная инструкция удаляет все строки, включая те, которые добавили ранее. Удалено 7 строк.
Синтаксис DELETE не включает имена столбцов, поскольку он используется для удаления целых строк, а не значений из
строки. Для сброса или модифицирования значения в строке применяется инструкция UPDATE, описанная далее. Инструкция DELETE не удаляет саму таблицу. Например, после удаления всех строк из таблицыgruppirovka все еще можно ее запрашивать:
mysql> SELECT * FROM gruppirovka;
Empty set (0.00 sec)
Естественно, также можно продолжать анализировать ее структуру посредством инструкцииDESCRIBE или SHOW CREATE TABLE и вставлять новые строки с помощью инструк-
72
ции INSERT. Для удаления таблицы используется инструкция
DROP.
Использование выражений WHERE, ORDER BY и LIMIT.
Для удаления из таблицы одной или нескольких, но не всех, строк используется выражение WHERE. Оно работает точно так же, как и в случае с инструкциейSELECT. Предположим, что нужно удалить из таблицы преступников рожденных после1980 года. Для этого используется следующий запрос:
mysql> DELETE FROM prestupnik WHERE prestupnik_god_rozhdeniya>1980;
Query OK, 5 rows affected (0.00 sec)
В результате будут удалены пять строк из таблицыprestupnik, соответствующие этому критерию.
Для удаления всей информации о какой-то преступной группировке, удалим, например, все данные, касающиеся Даниловской (Danilovskaya) преступной группировки. Для начала определите значение gruppirovka_id в таблице gruppirovka, которое используем для удаления данных из всех трех таблиц (рис. 6.7):
mysql> SELECT gruppirovka_id FROM gruppirovka
-> WHERE gruppirovka_name = "Danilovskaya";
Рис. 6.7. Удаление данных из трех таблиц
Теперь удалим строку из таблицы gruppirovka.
mysql> DELETE FROM gruppirovka WHERE gruppirovka_id = 7;
Query OK, 1 row affected (0.00 sec)
Затем сделаем то же самое для таблицprestupnik и prestuplenie:
mysql> DELETE FROM prestupnik WHERE gruppirovka_id = 7;
Query OK, 2 rows affected (0.01 sec)
mysql> DELETE FROM prestuplenie WHERE gruppirovka_id = 7;
73
Query OK, 3 rows affected (0.00 sec)
Поскольку существует возможность объединить все три таблицы с помощью столбцаgruppirovka_id, можное выполнить весь процесс удаления в одной инструкции DELETE.
Вместе с инструкциейDELETE рекомендуется использовать выражения ORDER BY и LIMIT. Обычно они применяются для ограничения количества удаляемых строк, времени выполнения запроса или для сохранения специфических размеров таблицы. Сортировка множества записей в поле без индекса может занять много времени.
Удаление всех строк с помощью инструкцииTRUNCATE. Для удаления из таблицы всех строк существует более быстрый метод, чем DELETE. Во время использования инструкции TRUNCATE TABLE сервер MySQL применяет сокращенную команду сброса таблицы, то есть удаляет структуру таблицы и создает ее заново. Для таблиц с большим количеством строк этот метод работает значительно быстрее.
Удаляя данные из таблицыprestuplenie, использум следующую инструкцию:
mysql> TRUNCATE TABLE prestuplenie;
Query OK, 0 rows affected (0.00 sec)
Обратите внимание, количество затронутых (affected) строк равно нулю: для быстрого удаления всех данных из таблицы MySQL не подсчитывает количество удаленных строк, так что выведенное число (обычно нуль, однако не всегда) не отображает реальное число удаленных строк.
Естественно, во время выполнения стандартных операций не принято удалять целые таблицы. Исключением являются временные таблицы, которые используются для временного хранения результатов запроса в сеансе отдельного пользователя и могут быть удалены без потерь исходных данных.
6.3. Изменение данных в таблицах базы данных. Инструкция UPDATE
Инструкция UPDATE используется для изменения данных. В этом разделе мы опишем, как обновлять одну или несколько строк в отдельной таблице.
Инструкцию UPDATE проще всего использовать для изменения всех строк в таблице. Не будем изменять все строки в таб-
74
лице базы данныхprestupnost, поскольку это будет слишком натянутый пример, но все равно выполним эту операцию. Для изменения имен преступников на верхний регистр можно использовать следующую инструкцию:
mysql> UPDATE prestupnik SET prestupnik_name =
-> UPPER(prestupnik_name);
Query OK, 17 rows affected (0.04 sec) Rows matched: 17 Changed: 17 Warnings: 0
Функция UPPER() представляет собой функциюMySQL, которая возвращает в верхнем регистре версию текста, переданного в качестве параметра. Например, запись Andreev Sergey Ruslanovich будет возвращена какANDREEV SERGEY RUSLANOVICH. Имена всех преступников модифицированы, поскольку в отчете указывается о семнадцати затронутых строках.
Функция LOWER() выполняет обратное преобразование всего текста в нижний регистр.
Во второй строке отчета по инструкцииUPDATE указан общий эффект инструкции. В данном примере может быть следующее:
Rows matched: 17 Changed: 17 Warnings: 0
В первом столбце указано количество строк, извлеченных как результаты инструкции. В связи с отсутствием выражений WHERE и LIMIT запросу соответствуют все семнадцать строк таблицы. Во втором столбце указывается количество строк, которые потребовалось изменить. Оно всегда меньше или равно количеству строк, соответствующих критерию. Поскольку в данном примере ни одна из семнадцати строк не была полностью в верхнем регистре, изменены все семнадцать строк. Если повторить инструкцию, то получим иной результат:
mysql> UPDATE prestupnik SET prestupnik_name = -> UPPER(prestupnik_name);
Query OK, 0 rows affected (0.00 sec) Rows matched: 17 Changed: 0 Warnings: 0
Поскольку на этот раз все строки уже были в верхнем регистре, критерию инструкции соответствуют семнадцать строк, но ни одна из них не была изменена. Отметим также, что количество измененных строк всегда равно количеству затронутых строк, указанному в первой строке выходных данных.
75
В нашем предыдущем примере каждое значение каждого столбца обновлялось относительно текущего значения. Столбцам можно также задать отдельное значение. Например, нам необходимо перевести всех преступников в первую преступную группи-
ровку(gruppirovka_id=1):
mysql> UPDATE prestupnik SETgruppirovka_id= 1;
Query OK, 17 rows affected (0.00 sec) Rows matched: 17 Changed: 17 Warnings: 0
Обычно изменять все строки в таблице нет необходимости. Можно обновить одну или несколько строк, отвечающих заданному критерию. Как и в случае с инструкциямиSELECT и DELETE, для этой задачи применяется выражениеWHERE. Кроме того, можно таким же образом использовать вместе выражения ORDER BY и LIMIT для управления количеством обновляемых строк в упорядоченном списке.
Приведем пример модификации одной строки в таблице. Предположим необходимо поменять дату рождения преступника с ФИО Anisimov Vitaliy Abramovich:
mysql> UPDATE prestupnik SET
-> prestupnik_god_rozhdeniya = 1974
-> WHERE prestupnik_name=’Anisimov Vitaliy -> Abramovich’;
Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
Как и ожидалось, условию соответствовала одна строка, и изменена была одна строка.
Для управления количеством обновлений можно использовать комбинацию выражений ORDER BY и LIMIT. Как и в случае с инструкцией DELETE, такая комбинация используется для выполнения инструкции в течение управляемого временного периода или для модификации лишь некоторых строк. Предположим, что нужно поместить 5 самых молодых преступников в третью
преступную группировку. Для этого используется следующая инструкция:
mysql> UPDATE prestupnik SET gruppirovka_id=3 -> ORDER BY prestupnik_god_rozhdeniya LIMIT 5;
Query OK, 5 rows affected (0.00 sec) Rows matched: 5 Changed: 5 Warnings: 0
76
Таким образом, 5 строк соответствовали условию запроса,
и5 строк были изменены.
Впредыдущем запросе также был продемонстрирован важный аспект обновлений. Обновления разделены на две фазы: поиск соответствий, где определяются строки, соответствующие условию выражения WHERE; и фазу модификации, где обновляются строки, которые требуется изменить. В предыдущем приме-
ре выражение «ORDER BY prestupnik_god_rozhdeniya» ис-
пользовалось в фазе поиска соответствия для сортировки данных после их считывания из таблицы. В фазе модификации затем было обработано 5 строк с обновлением тех из них, которые требовалось изменить. Начиная с версииMySQL 4.0.13, выражение LIMIT управляет максимальным числом строк соответствия. До этого выражение LIMIT управляло максимальным количеством изменяемых строк. Новая реализация имеет больше преимуществ. В старой версии приходилось ждать окончания обработки обновлений множества строк, соответствующих заданному критерию, при необходимости изменить лишь некоторых из них.
Контрольные вопросы
1.Какой оператор языка SQL позволяет добавлять записи в таблицы?
2.Какой оператор языка SQL позволяет удалять записи из таблицы?
3.Какой оператор языка SQL позволяет изменять записи в таблицах?
4.Какова структура классического запроса на добавление одной строки?
5.Какова структура альтернативного запроса на добавление одной строки?
6. Какова структура запроса на добавление нескольких строк?
7.Какова структура запроса на удаление строк из таблицы?
8.Какова структура запроса на изменение данных в полях таблицы?
9.Каково назначение функций APPER и LOWER?
77
7. ПСЕВДОНИМЫ И АГРЕГИРОВАНИЕ ДАННЫХ
(ПК-35)
7.1. Псевдонимы столбцов и таблиц
Псевдонимы столбцов пригодятся для более четкого выражения запросов, снижения количества вводимых символов, а также для работы с такими языками, как РНР. Далее рассмотрим простой пример (рис. 7.1):
mysql> SELECT gruppirovka_name AS
-> prestupnie_gruppirovki FROM gruppirovka;
Рис. 7.1. Столбец, обозначенный псевдонимом
Столбец gruppirovka_name обозначен псевдонимом prestupnie_gruppirovki. В выходных данных заголовок столбца gruppirovka_name заменен псевдонимом prestupnie_gruppirovki.
Преимущество такого подхода заключается в том, что псевдоним prestupnie_gruppirovki более понятен пользователям. Кроме того, хотя в данном случае это и не нужно, зато отлично иллюстрирует суть: для столбца вы добавляете ключевое словоAS, а затем по своему усмотрению вводите строку, которая будет представлять данный столбец.
Теперь применим псевдонимы столбцов для чего-нибудь действительно полезного. Далее представлен пример, в котором используется функция CONCAT() и выражение ORDER BY
(рис. 7.2):
mysql> SELECT CONCAT(‘В преступную -> группировку ’,gruppirovka_name,
78
-> ‘ входит преступник ’, prestupnik_name) -> AS prestupniki
-> FROM gruppirovka INNER JOIN prestupnik
-> USING (gruppirovka_id) ORDER BY prestupniki;
Рис. 7.2. Функция CONCAT()
Функция CONCAT() выполняет конкатенацию строк, являющихся параметрами. В данном случае это постоянная строка
В преступную группировку, поле gruppirovka_name, постоянная строка входит преступник и поле prestupnik_name, которые вместе выдают такой результат, как «В преступную группировку
Aleksandrovskaya входит преступник Getrov Ivan Gennadievich».
Для функции добавим псевдоним AS prestupniki, чтобы на протяжении запроса ссылаться на нее как наprestupniki. Сделаем это, например, в выражении ORDER BY, где MySQL указано отсортировать выходные данные по возрастанию значенияprestupniki. Такой метод более удобен, и не требует вновь вводить полное имя функции CONCAT() как в следующем примере (рис. 7.3);
mysql> SELECT CONCAT(‘В преступную ->группировку ’,gruppirovka_name,
-> ‘входит преступник’, prestupnik_name) -> FROM gruppirovka INNER JOIN prestupnik -> USING (gruppirovka_id) ORDER BY
79
-> CONCAT(‘В преступную группировку’,
-> gruppirovka_name, ‘входит преступник’, -> prestupnik_name);
Рис. 7.3. Сортировка выходных данных по возрастанию
При использовании полных имен повышается риск неправильно ввести выражение ORDER BY и получить ошибочные результаты.
Существуют ограничения |
на применение псевдонимов. |
Так, нельзя их использовать в |
выраженииWHERE, а также в |
USING и ОN. Это означает, что запросы нельзя записывать таким образом:
mysql> SELECT gruppirovka_name AS a
-> FROM gruppirovka WHERE a = "Andreev Sergey -> Ruslanovich";
ERROR 1054 (42S22): Unknown column 'a' in 'where clause'
Причина состоит в том, что MySQL не всегда знает значение столбца перед выполнением выраженияWHERE. Тем не менее, можно использовать псевдонимы для столбцов в утвержде-
нии ORDER BY, а также в выраженияхGROUP BY и HAVING,
описанных далее.
Ключевое слово AS является опциональным. По этой причине два следующих запроса идентичны (рис. 7.4):
mysql> SELECT gruppirovka_id AS id
80
