SQL. Особенности SQL применительно к СУБД MySQL
Вначале мы рассмотрим особенности SQL применительно к СУБД MySQL.
Предложения модификации данных SQL
Модификация данных может выполняться с помощью предложений DELETE (удалить), INSERT (вставить) и UPDATE (обновить).
Предложение DELETE
Предложение DELETE имеет формат
1.
DELETE [LOW_PRIORITY] FROM table
[WHERE definition]
[ORDER BY...]
[LIMIT rows]
2.
DELETE [LOW_PRIORITY] table [, table...]
FROM table_references
[WHERE definition]
3.
DELETE [LOW_PRIORITY]
FROM table [, table...]
USING table_references
[WHERE definition]
Оператор DELETE удаляет из таблицы table строки, удовлетворяющие заданным в where условиям, и возвращает число удаленных записей.
Если оператор DELETE запускается без определения WHERE, то удаляются все строки:
Удалить все поставки.
DELETE LOW_PRIORITYА
FROM Поставки;
Если указано ключевое слово LOW_PRIORITY, выполнение данной команды DELETE будет задержано до тех пор, пока другие пользователи не завершат работу с этой таблицы.
Использовании второго и третьего формата позволяет удалять единовременно строки из нескольких таблиц, а также использовать для поиска дополнительные таблицы.
Примеры:
1)
DELETE t1,t2
FROM t1,t2,t3
WHERE t1.id=t2.id
AND t2.id=t3.id
2)
DELETE
FROM t1,t2
USING t1,t2,t3
WHERE t1.id=t2.id
AND t2.id=t3.id
В предыдущем случае просто удалены строки из таблиц t1 и t2, в которых совпадают поля id.
3)
DELETE
FROM блюда
USING блюда, основы
WHERE блюда.О=основы.О
AND основы.Основа="Закуска";
Если применяется выражение ORDER BY, то строки будут удалены в указанном порядке. В действительности это выражение полезно только в сочетании с LIMIT. Например:
DELETE FROM АНАЛИЗЫ
WHERE Пациент = 'Петров'
ORDER BY Дата_Анализа
LIMIT 2
Данный оператор удалит две самые старые записи об анализах пациента Петрова.
|
Специфическая для MySQL опция LIMIT для команды DELETE указывает серверу максимальное количество строк, которые следует удалить.
Примеры:
Удаление единственной записи
Удалить поставщика с ПС = 7.
DELETE
FROM Поставщики
WHERE ПС = 7;
Если таблица Поставки содержит в момент выполнения этого предложения какие-либо поставки для поставщика с ПС = 7, то такое удаление нарушит непротиворечивость базы данных. Механизмы поддержания целостности могут позволить отменить некорректное удаление или каскадировать удаление на несколько таблиц.
Удаление с вложенным подзапросом
Удалить все поставки для поставщика из Петербург.
DELETE
FROM Поставки
WHERE ПС IN
(SELECT ПС
FROM Поставщики, Город
WHERE Поставщики.Г=Города.Г
AND Город = "Петербург");
Предложение INSERT
Синтаксис оператора INSERT
1.
INSERT [LOW_PRIORITY] [IGNORE]
[INTO] таблица [(столбец [,столбец]...)]
VALUES (значение [,значение]...)
[ON DUPLICATE KEY UPDATE столбец =значение,... ];
2.
INSERT [LOW_PRIORITY] [IGNORE]
[INTO] таблица [(столбец [,столбец]...)]
SELECT <…>;
значение ={столбец | константа | переменная | выражение}
В первом формате в таблицу вставляется строка со значениями полей, указанными в перечне фразы VALUES, причем i-е значение соответствует i-му столбцу в списке столбцов. Столбцы, не указанные в списке, заполняются NULL-значениями. Если в списке VALUES фразы указаны все столбцы модифицируемой таблицы и порядок их перечисления соответствует порядку столбцов в описании таблицы, то список столбцов в фразе INTO можно опустить. Однако этого не следует делать, так как при изменении описания таблицы (перестановка столбцов или изменение их числа) придется переписы-вать и INSERT предложение.
|
Во втором формате сначала выполняется подзапрос, т.е. по предложению SELECT в памяти формируется рабочая таблица, а потом строки рабочей таблицы загружаются в модифицируемую таблицу. При этом i-й столбец рабочей таблицы (i-й элемент списка SELECT) соответствует i-му столбцу в списке столбцов модифицируемой таблицы. Здесь также при выполнении указанных выше условий может быть опущен список столбцов фразы INTO.
Любой столбец, для которого явно не указано значение, будет установлен в свое значение по умолчанию. Например, если в заданном списке столбцов не указаны все столбцы в данной таблице, то не упомянутые столбцы устанавливаются в свои значения по умолчанию. (Установка значений по умолчанию описывается в разделе Синтаксис оператора CREATE TABLE).
Выражение может относится к любому столбцу, который ранее был внесен в список значений. Например, можно указать следующее:
INSERT
INTO table (col1,col2)
VALUES(15,col1*2);
Но нельзя указать:
INSERT
INTO table (col1,col2)
VALUES(col2*2,15);
Ключевое слово LOW_PRIORITY. Выполнение данной команды INSERT аналогично выполнению команды DELETE.
Ключевое слово IGNORE. Все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не будут внесены. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа.
Ключевое слово ON DUPLICATE KEY UPDATE. Если производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY) или уникального (UNIQUE) ключа, то выполняется UPDATE старой строки. Например:
|
INSERT INTO table (a,b,c)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Если a определяется как UNIQUE и уже содержит 1, то тогда вышеуказанная команда будет аналогична следующей:
UPDATE table
SET c=c+1
WHERE a=1;
Если столбец b также является уникальным ключем, то UPDATE переписывается как:
UPDATE table
SET c=c+1
WHERE a=1 OR b=2
LIMIT 1;
и если несколько записей соответствуют a=1 OR b=2 только одна запись будет обновлена!
В общем случае, следует избегать использования ON DUPLICATE KEY в таблицах со множеством уникальных (UNIQUE) ключей.
При внесении NULL - значения в столбец, который был объявлен, как NOT NULL, данный столбец устанавливается в значение, заданное по умолчанию.
При установке числового столбца в значение, лежащее за пределами его допустимого диапазона, данная величина усекается до соответствующей конечной точки этого диапазона.
Занесение в числовой столбец такой величины, как '10.34 a'. Конечные данные удаляются и вносится только оставшаяся числовая часть. Если величина вовсе не имеет смысла как число, то столбец устанавливается в 0.
При внесении в столбцы типа CHAR, VARCHAR, TEXT или BLOB строки, превосходящей максимальную длину столбца, данная величина усекается до максимальной длины столбца.
Внесение в столбец даты или времени строки, недопустимой для данного типа столбца. Этот столбец устанавливается в нулевую величину, соответствующую данному типу.
Примеры: