Команды для работы с данными таблиц баз данных

Все команды из двух предыдущих подразделов («Команды для манипулирования базами данных» и «Команды для работы с таблицами БД») относятся к языку DDL (Data Definition Language), являющемуся частью языка SQL, которая обеспечивает работу со схемой БД. Другая, не менее важная, часть SQL — язык DML (Data Manipulation Language), позволяющий манипулировать самими данными в таблицах баз данных. К нему относятся команды, речь о которых пойдет уже в этом подразделе.

1. Для добавления строк в таблицу используется команда INSERT. В качестве аргументов ей передается название таблицы и набор всех значений для одной из строк или набор из названий атрибутов и соответствующих им значений, подразумевая, что значения остальных атрибутов будут заполнены автоматически.

Пример добавления строки в таблицу "news" с 4 атрибутами ("id", "posted", "content", "author") с указанием всех значений:

INSERT INTO `news` VALUES (1, NOW(), "Текст новости", "Редактор");

Использованное в запросе выражение "NOW()" — это обращение к встроенной в MySQL функции, которая возвращает текущее время, Таким образом, в качестве значения "posted" для добавляемой строки запишется текущее время.

Пример добавления строки в таблицу "news" с 4 атрибутами ("id", "posted", "content", "author") с указанием только некоторых значений:

INSERT INTO `news` (`posted`, `content`) VALUES (NOW(), "Текст новости");

В данном случае для добавляемой строки мы задали только значения атрибутов "posted" и "content". В поле "id" автоматически запишется число, которое будет на единицу больше последнего значения "id" в таблице (или 1, если добавляемая строка — первая), а в поле "author" для этой строки запишется значение NULL — отметка об отсутствии значения (не путайте ее с нулевым значением).

2. Для изменения данных в строке таблицы используется команда UPDATE. В качестве аргументов ей передаются название таблицы, названия атрибутов, значения которых будут изменены, и новые значения этих атрибутов.

Например, для того, чтобы изменить значение поля "author" во всех строках таблицы "news" на "Пользователь", а значение поля "content" — на "Пустой текст", нужно выполнить следующую команду:

UPDATE `news` SET `author` = "Пользователь", `content` = "Пустой текст";

В данном случае будут изменены все строки таблицы, но зачастую нужно изменять значения только в определенных строках. Для этого предусмотрена возможность установления условия отбора тех строк (WHERE), для которых будут проведены изменения.

Например, чтобы теперь изменить значение поля "content" на "Новый текст" только для строки с "id", равным 1, в таблице "news", нужно выполнить следующую команду:

UPDATE `news` SET `content` = "Новый текст" WHERE id = 1;

Правила формирования условий запросов подробно описаны в следующем подразделе — «Команда выборки».

3. Для удаления данных из таблицы используется команда DELETE. В качестве аргумента ей передается только название таблицы. Кроме того, можно ограничить список удаляемых строк, задав условие с помощью WHERE (по аналогии с тем, как это делалось в команде UPDATE) — тогда СУБД выберет строки, соответствующие условию, и удалит из таблицы только их. Без указания условия будут удалены все строки из таблицы.

Например, чтобы удалить из таблицы "news" строку с "id", равным 1, нужно выполнить следующую команду:

DELETE FROM `news` WHERE id = 1;

Команда выборки

О выборке

Для получения значений атрибутов таблиц БД используется команда SELECT. Общий вид команды представляется следующим образом:

SELECT `my_field1`, `my_field2`, ..., `my_fieldN`

FROM `my_table`

WHERE условие;

Здесь:

§ my_field1, my_field2 и т.д. — это перечисление названий атрибутов, значения которых мы "выбираем", т.е. в результирующей таблице будут выведены только значения указанных атрибутов. В случае, если требуется вывод значений всех атрибутов результирующей таблицы, для упрощения записи запроса используется символ звездочки («*»).

§ my_table — это название таблицы, из которой будет сделана выборка.

§ условие WHERE может иметь сложную структуру или отсутствовать.

Например, для выборки всех значений всех атрибутов из таблицы "news" достаточно ввести следующую команду:

SELECT * FROM `news`;

При выполнении запроса в оперативной памяти создается виртуальная таблица, состоящая из всех данных, удовлетворяющих условию отбора, а исходная таблица при этом никак не изменяется.

Условия выборки

Для решения некоторых задач условие отбора (WHERE) может иметь сложную структуру. Для построения таких условий используют логические операторы AND, OR, NOT и некоторые другие возможности языка SQL. Для группировки условий используются разделительные скобки («(» и «)»).

1. Для сравнения выражений предусмотрены: равенство («=»); больше или равно («>=»), меньше или равно («<=»), не равно («<>» или «!=»). Например, выборка значений атрибута "content" из таблицы "news", в строках которой значение атрибута "id" меньше 42, осуществляется следующим образом:

SELECT `content` FROM `news` WHERE `id` < 42;

2. Логическое умножение (И) записывается как AND и используется, когда требуется одновременное выполнение двух и более условий. Пример выборки значений атрибута "content" из таблицы "news", в строках которой значение атрибута "id" больше 21 и меньше 42:

SELECT `content` FROM `news` WHERE `id` > 21 AND `id` < 42;

3. Логическое сложение (ИЛИ) записывается как OR и используется, когда требуется, чтобы выполнялось хотя бы одно из нескольких условий. Пример выборки значений атрибута "content" из таблицы "news", в строках которой значение атрибута "id" больше 21 или меньше 10:

SELECT `content` FROM `news` WHERE `id` > 21 OR `id` < 10;

Логическое сложение имеет меньший приоритет чем логическое умножение, поэтому для корректной записи логических формул может потребоваться использование разделяющих скобок. Пример выборки значений атрибута "content" из таблицы "news", в строках которой значение атрибута "id" либо больше 21 и меньше 42, либо больше 84:

SELECT `content` FROM `news` WHERE ( `id` > 21 AND `id` < 42 ) OR `id` > 84;

4. Логическое отрицание (НЕ) записывается как NOT и используется для инвертирования последующего условия. Например, выборку значений атрибута "content" из таблицы "news", в строках которой значение атрибута "id" меньше 21 или больше 42, можно осуществить так:

SELECT `content` FROM `news` WHERE NOT ( `id` >= 21 AND `id` <= 42 );

5. Если у атрибута отсутствует значение, то оно записывается как NULL (NULL — символ отсутствия значения, что не путать с пустым значением: пустое значение существует, а NULL указывает на его отсутствие). Для составления условий на выборку подобных отсутствующих значений предусмотрено специальное выражение IS NULL. Пример выборки значений атрибута "content" из таблицы "news", в строках которой значение атрибута "author" отсутствует:

SELECT `content` FROM `news` WHERE `author` IS NULL;

6. Для указания принадлежности значения атрибута какому-либо интервалу предусмотрено выражение BEETWEEN .. AND. Выражение "BETWEEN a AND b". Пример выборки значений атрибута "content" из таблицы "news", в строках которой значение атрибута "id" больше 21 и меньше 42:

SELECT `content` FROM `news` WHERE `id` BETWEEN 21 AND 42;

7. Для указания принадлежности значения атрибута какому-либо множеству предусмотрено выражение IN. Пример выборки значений атрибута "content" из таблицы "news", в строках которой значение атрибута "id" принимает значения 21, 42, 84 или 168:

SELECT `content` FROM `news` WHERE `id` IN (21, 42, 84, 168);

8. Для поиска строковых значений, содержащих заданную строку по шаблону, предусмотрена выражение LIKE. В качестве аргумента оператору LIKE передается шаблон в виде строки, в которой помимо текста могут содержаться метасимволы «_» (обозначает любой одиночный символ) и «%» (набор любых символов любой длины). Пример выборки значений атрибута "content" из таблицы "news", в строках которой значение атрибута "author" соответствует шаблону «_user%» (т.е. строка, которая строится как любой символ + user + любая последовательность символов):

SELECT `content` FROM `news` WHERE `author` LIKE "_user%";

Такому шаблону будут удовлетворять значения атрибута вроде «1user», «1user222», «xuser42» и т.д.