Запрос SQL на добавление и удаление записей. Transact-SQL - изменение и удаление данных Модифицирование только определенных строк

04.09.2023 Гаджеты

ПРИМЕНЯЕТСЯ К: SQL Server (начиная с 2008)База данных SQL AzureХранилище данных SQL AzureParallel Data Warehouse

Удаляет одну или несколько строк из таблицы или представления в SQL Server.

Syntax for SQL Server and Azure SQL Database [ WITH [ ,...n ] ] DELETE [ TOP (expression) [ PERCENT ] ] [ FROM ] { { table_alias | | rowset_function_limited [ WITH (table_hint_limited [ ...n ] ) ] } | @table_variable } [ ] [ FROM table_source [ ,...n ] ] [ WHERE { | { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ] [ OPTION ( [ ,...n ] ) ] [; ] ::= { [ server_name.database_name.schema_name. | database_name. [ schema_name ] . | schema_name. ] table_or_view_name }

WITH <обобщенноетабличное выражение>
Задает временный именованный результирующий набор, также называемый обобщенным табличным выражением, который определяется в области действия инструкции DELETE. Результирующий набор получается из инструкции SELECT.

Обобщенные табличные выражения также можно использовать в инструкциях SELECT, INSERT, UPDATE и CREATE VIEW. Дополнительные сведения см. в разделе .

TOP (expression ) [ PERCENT ]
Задает количество или процент удаляемых случайных строк. expression может быть либо числом, либо процентом от числа строк. Строки, на которые ссылается выражение TOP, используемое с инструкциями INSERT, UPDATE и DELETE, не упорядочиваются. Дополнительные сведения см. в разделе .

FROM
Необязательное ключевое слово, которое можно использовать между ключевым словом DELETE и целевым table_or_view_name , или rowset_function_limited .

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

имя_сервера

Имя сервера (с использованием имени связанного сервера или функционировать в качестве имени сервера) на котором расположена таблица или представление. Если имя_сервера указан, имябазы данных и schema_name являются обязательными.

имябазы данных
Имя базы данных.

schema_name
Имя схемы, которой принадлежит таблица или представление.

table_or view_name
Имя таблицы или представления, откуда удаляются строки.

Табличную переменную в пределах ее области действия также можно использовать в качестве источника таблицы в инструкции DELETE.

Представление ссылается table_or_view_name должно быть обновляемым и ссылаться ровно одну базовую таблицу в предложении FROM определения представления. Дополнительные сведения об обновляемых представлениях см. в разделе .

rowset_function_limited


Возвращает удаленные строки или выражения, основанные на них, как часть операции DELETE. Предложение OUTPUT не поддерживается ни в каких инструкциях DML, направленных на представления и удаленные таблицы. Дополнительные сведения см. в разделе .

ИЗ table_source
Задает дополнительное предложение FROM. Это Transact-SQL расширение DELETE позволяет задавать данные из и удалять соответствующие строки из таблицы в первом предложении.

Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания удаляемых строк.

Дополнительные сведения см. в разделе .

WHERE
Указывает условия, используемые для ограничения числа удаляемых строк. Если предложение WHERE не указывается, инструкция DELETE удаляет все строки из таблицы.

Предусмотрено два вида операций удаления в соответствии с тем, что указывается в предложении WHERE.

    Операции удаления с поиском указывают условие поиска для уточнения строк, которые будут удалены. Например, ГДЕ column_name = значение .

    Операции удаления по позиции используют предложение CURRENT OF для указания курсора. Удаление осуществляется в текущей позиции курсора. Это может быть более точной, чем инструкция DELETE по найденному, использующая предложение search_condition предложение для указания удаляемых строк. Инструкция DELETE по найденному удаляет несколько строк, если условие поиска не определяет уникально одну строку.


Указывает ограничивающие условия для удаляемых строк. Количество предикатов, которое может содержать условие поиска, не ограничено. Дополнительные сведения см. в разделе .

CURRENT OF
Указывает выполнение инструкции DELETE в текущей позиции указанного курсора.

GLOBAL
Указывает, что cursor_name ссылается на глобальный курсор.

cursor_name
Имя открытого курсора, из которого производится выборка. Если как глобальный, так и локальный курсор с именем cursor_name существует, этот аргумент ссылается на глобальный курсор, если GLOBAL указанного; в противном случае, он ссылается на локальный курсор. Курсор должен позволять производить обновления.

cursor_variable_name
Имя переменной курсора. Переменная курсора должна содержать ссылку на курсор, обновления которого разрешены.

OPTION ( [ , ... n ] )
Ключевые слова, которые указывают, что подсказки оптимизатора применяются при настройке способа Компонент Database Engine обрабатывает инструкцию. Дополнительные сведения см. в разделе .

Для удаления всех строк в таблице воспользуйтесь инструкцией TRUNCATE TABLE. Инструкция TRUNCATE TABLE выполняется быстрее, чем инструкция DELETE, и использует меньше системных ресурсов и ресурсов журнала транзакций. Инструкция TRUNCATE TABLE имеет ограничения, например, таблица не может участвовать в репликации. Дополнительные сведения см. в разделе

Используйте @@ROWCOUNT функцию для возврата количества удаленных строк клиентскому приложению. Дополнительные сведения см. в разделе .

Для инструкции DELETE можно реализовать обработку ошибок, заключив ее в конструкцию TRY…CATCH.

При выполнении инструкции DELETE может произойти ошибка, если она нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице с помощью ограничения FOREIGN KEY. Если инструкция DELETE удаляет несколько строк и одна из удаленных строк нарушает триггер или ограничение, то эта инструкция отменяется, т.е. возвращается ошибка и строки не удаляются.

В случае арифметической ошибки (переполнение, деление на ноль или выход за пределы допустимых значений), возникающей в ходе вычисления выражения при выполнении инструкции DELETE, компонент Компонент Database Engine будет обрабатывать эти ошибки, как если бы параметр SET ARITHABORT имел значение ON. Оставшаяся часть пакетной операции отменяется и возвращается сообщение об ошибке.

Инструкцию DELETE можно использовать в тексте определяемой пользователем функции, если изменяемым объектом является табличная переменная.

При удалении строки, содержащей столбец FILESTREAM, также удаляются и связанные с ней файлы файловой системы. Базовые файлы удаляются сборщиком мусора FILESTREAM. Дополнительные сведения см. в разделе .

Предложение FROM нельзя указывать в инструкции DELETE, ссылающейся (прямо или косвенно) на представление, в котором указан триггер INSTEAD OF. Дополнительные сведения о триггерах INSTEAD разделе .

При использовании выражения TOP в инструкции DELETE строки, на которые имеются ссылки, не упорядочиваются, а предложение ORDER BY не может быть прямо указано в этой инструкции. Если необходимо с помощью предложения TOP удалять строки в значимом хронологическом порядке, то вместе с ним в инструкции вложенного запроса выборки следует использовать ORDER BY. См. подраздел «Примеры» далее в этом разделе.

Предложение TOP не может быть использовано вместе с инструкцией DELETE для секционированных представлений.

По умолчанию инструкция DELETE всегда получает монопольную блокировку (X) на таблицу, которую она изменяет, и держит блокировку до тех пор, пока транзакция не завершится. Если ресурс удерживается монопольной (X) блокировкой, то другие транзакции не могут изменять данные. Операции считывания будут допускаться только при наличии подсказки NOLOCK или уровня изоляции незафиксированной операции чтения. Можно переопределить поведение оптимизатора запросов по умолчанию с помощью табличных подсказок на время выполнения инструкции DELETE указанием другого способа блокировки, но использовать подсказки рекомендуется только опытным разработчикам и администраторам баз данных и только при крайней необходимости. Дополнительные сведения см. в разделе .

Когда строки удаляются из кучи, компонент Компонент Database Engine может использовать строку или страницу блокировки для операции. В результате пустые страницы, в которых выполняются операции удаления, остаются размещенными для кучи. Если их не освободить, занимаемое ими место не может быть использовано под другие объекты базы данных.

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

    Задайте указания TABLOCK в инструкции DELETE. Использование TABLOCK приведет к тому, что при выполнении операции удаления будет установлена монопольная блокировка таблицы, а не блокировка строки или страницы, что позволит освободить страницы. Дополнительные сведения о подсказке TABLOCK см. в разделе .

    Если из таблицы удаляются все строки, пользуйтесь инструкцией TRUNCATE TABLE.

    Перед удалением строк создайте в куче кластеризованный индекс. Потом его можно будет удалить. Этот метод потребует больше времени и потребляет больше временных ресурсов.

Инструкция DELETE всегда полностью регистрируется в журнале.

Permissions

Разрешения DELETE необходимы для целевой таблицы. Разрешения SELECT также необходимы, если инструкция содержит предложение WHERE.

Удаление разрешения по умолчанию для членов sysadmin фиксированной серверной роли db_owner и db_datawriter фиксированных ролей базы данных и владельца таблицы. Члены sysadmin , db_owner и db_securityadmin ролей, а также владелец таблицы могут передавать разрешения другим пользователям.

Базовый синтаксис

В примерах в этом разделе описывается базовая функциональность инструкции DELETE с помощью минимального необходимого синтаксиса.

А. Использование инструкции DELETE без предложения WHERE

Следующий пример удаляет все строки из таблицы SalesPersonQuotaHistory в базе данных AdventureWorks2012 , поскольку не указано предложение WHERE, ограничивающее количество удаляемых строк.

DELETE FROM Sales.SalesPersonQuotaHistory; GO

Ограничение удаляемых строк

В примерах в этом разделе описываются способы ограничения количества удаляемых строк.

A. Использование предложения WHERE для удаления набора строк

Следующий пример удаляет все строки таблицы ProductCostHistory в базе данных AdventureWorks2012 , у которых значение в столбце StandardCost больше 1000.00 .

В следующем примере показано использование более сложного предложения WHERE. Предложение WHERE определяет два условия, которые должны быть выполнены для определения удаляемых строк. Значение в столбце StandardCost должно быть в диапазоне от 12.00 до 14.00 , а значение в столбце SellEndDate должно быть равно NULL. В этом примере также выводится значение из **@@ROWCOUNT ** функцию для возврата количества удаленных строк.

Б. Использование курсора для определения удаляемой строки

Следующий пример удаляет одну строку из EmployeePayHistory в таблице AdventureWorks2012 базы данных с помощью курсора my _ cursor . Операция удаления затрагивает только одну строку, выбранную в данный момент курсором.

DECLARE complex_cursor CURSOR FOR SELECT a.BusinessEntityID FROM HumanResources.EmployeePayHistory AS a WHERE RateChangeDate <> (SELECT MAX (RateChangeDate) FROM HumanResources.EmployeePayHistory AS b WHERE a.BusinessEntityID = b.BusinessEntityID) ; OPEN complex_cursor; FETCH FROM complex_cursor; DELETE FROM HumanResources.EmployeePayHistory WHERE CURRENT OF complex_cursor; CLOSE complex_cursor; DEALLOCATE complex_cursor; GO

В. Использование операторов объединения и вложенных запросов к данным в одной таблице для удаления строк в другой таблице

В следующих примерах показано два способа удаления строк в одной таблице на основании данных в другой таблице. В обоих примерах строки из SalesPersonQuotaHistory в таблице AdventureWorks2012 удалить базу данных на основе продаж с начала года, хранящиеся в SalesPerson таблицы. Первый DELETE инструкции показано решение совместимый ISO вложенный запрос, а второй - DELETE инструкции Transact-SQL из расширения для соединения двух таблиц.

A. Ограничение числа удаляемых строк с помощью ключевого слова TOP

Когда TOP (n ) с помощью удаления используется предложение, операция удаления производится над случайно выбранных n строк. Следующий пример удаляет 20 случайных строк из таблицы PurchaseOrderDetail в базе данных AdventureWorks2012 , имеющих дату ранее 1 июля 2006 г.:

Если необходимо с помощью предложения TOP удалять строки в значимом хронологическом порядке, то вместе с ним в инструкции вложенного запроса выборки следует использовать ORDER BY. Следующий запрос удаляет из таблицы PurchaseOrderDetail 10 строк, имеющих самую раннюю дату. Чтобы гарантировать удаление только 10 строк, столбец, указанный в инструкции подзапроса выборки (PurchaseOrderID) должен являться первичным ключом таблицы. Использование неключевого столбца в инструкции подзапроса выборки может привести к удалению более чем 10 строк, если указанный столбец содержит повторяющиеся значения.

Удаление строк из удаленной таблицы

В примерах в этом разделе описаны способы удаления строк из удаленной таблицы с использованием в качестве ссылки на удаленную таблицу или . Удаленная таблица существует на другом сервере или экземпляре SQL Server.

Применимо к : от SQL Server 2008 до SQL Server 2016.

A. Удаление данных из удаленной таблицы с помощью связанного сервера

В следующем примере будет удалена строка из удаленной таблицы. Пример начинается с создания ссылки на удаленный источник данных с помощью . Имя связанного сервера, MyLinkServer , затем определяется как часть четырехчастного имени объекта в виде server.catalog.schema.object .

USE master; GO -- Create a link to the remote data source. -- Specify a valid server name for @datasrc as "server_name" or "server_name\instance_name" . EXEC sp_addlinkedserver @server = N"MyLinkServer" , @srvproduct = N" " , @provider = N"SQLNCLI" , @datasrc = N"server_name" , @catalog = N"AdventureWorks2012" ; GO

Б. Удаление данных из удаленной таблицы с помощью функции OPENQUERY

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

В. Удаление данных из удаленной таблицы с помощью функции OPENDATASOURCE

В следующем примере выполняется удаление строк из удаленной таблицы с помощью вызова функции , возвращающей набор строк. Укажите допустимое имя сервера для источника данных с использованием формата имя_сервера или server_name\instance_name .

Оператор UPDATE изменяет имеющиеся данные в таблице. Команда имеет следующий синтаксис

UPDATE <имя таблицы>
SET {имя столбца = {выражение для вычисления значения столбца
| NULL
| DEFAULT},...}
[ {WHERE <предикат>}];

С помощью одного оператора могут быть заданы значения для любого количества столбцов. Однако в одном и том же операторе UPDATE можно вносить изменения в каждый столбец указанной таблицы только один раз. При отсутствии предложения WHERE будут обновлены все строки таблицы.

Если столбец допускает NULL-значение, то его можно указать в явном виде. Кроме того, можно заменить имеющееся значение на значение по умолчанию (DEFAULT ) для данного столбца.

Естественно, типы данных столбцов hd и ram должны быть совместимы. Для приведения типов может использоваться выражение CAST .

Если требуется изменять данные в зависимости от содержимого некоторого столбца, можно воспользоваться выражением CASE . Если, скажем, нужно поставить жесткие диски объемом 20 Гб на ПК-блокноты с памятью менее 128 Мб и 40 гигабайтные - на остальные ПК-блокноты, то можно написать такой запрос:

Необходимо сказать несколько слов об автоинкрементируемых столбцах. Если столбец code в таблице Laptop определен как IDENTITY(1,1) , то следующий оператор

Разумеется, другой строки со значением code =5 в таблице быть не должно.

В Transact-SQL оператор UPDATE расширяет стандарт за счет использования необязательного предложения FROM . В этом предложении специфицируется таблица, обеспечивающая критерий для операции обновления. Дополнительную гибкость здесь дает использование операций соединения таблиц.

Пример . Пусть требуется указать "No PC" (нет ПК) в столбце type для тех моделей ПК из таблицы Product PC . Решение посредством соединения таблиц можно записать так:

Оператор DELETE

Оператор DELETE удаляет строки из временных или постоянных базовых таблиц, представлений или курсоров, причем в двух последних случаях действие оператора распространяется на те базовые таблицы, из которых извлекались данные в эти представления или курсоры. Оператор удаления имеет простой синтаксис:

DELETE FROM <имя таблицы > ;

Если предложение WHERE отсутствует, удаляются все строки из таблицы или представления (представление должно быть обновляемым). Более быстро эту операцию (удаление всех строк из таблицы) в Transact-SQL можно также выполнить с помощью команды

Однако есть ряд отличий в реализации команды TRUNCATE TABLE по сравнению с использованием оператора DELETE , которые следует иметь в виду:

1. Не журнализируется удаление отдельных строк таблицы. В журнал записывается только освобождение страниц, которые были заняты данными таблицы.
2. Не отрабатывают триггеры, в частности, триггер на удаление.
3. Команда неприменима, если на данную таблицу имеется ссылка по внешнему ключу, и даже если внешний ключ имеет опцию каскадного удаления.
4. Значение счетчика (IDENTITY ) сбрасывается в начальное значение.

Пример . Требуется удалить из таблицы Laptop все ПК-блокноты с размером экрана менее 12 дюймов.

TRUNCATE TABLE Laptop

Transact-SQL расширяет синтаксис оператора DELETE , вводя дополнительное предложение FROM

FROM <источник табличного типа>

При помощи источника табличного типа можно конкретизировать данные, удаляемые из таблицы в первом предложении FROM .

При помощи этого предложения можно выполнять соединения таблиц, что логически заменяет использование подзапросов в предложении WHERE для идентификации удаляемых строк.

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

Используя стандартный синтаксис, эту задачу можно решить следующим запросом:

Здесь используется внешнее соединение, в результате чего столбец pc.model для моделей ПК, отсутствующих в таблице PC , будет содержать NULL-значение, что и используется для идентификации подлежащих удалению строк.

Команда TRUNCATE имеет следующий синтаксис:

TRUNCATE TABLE имя_таблицы;

Пример 1

Если нужно полностью очистить таблицу tovar, то следует выполнить команду:

TRUNCATE TABLE tovar;

Команда TRUNCATE позволяет очистить таблицу сразу и полностью и не позволяет удалять отдельные строки, удовлетворяющие каким-либо условиям.

Команда DELETE удаляет из таблицы записи, удовлетворяющие некоторому условию. Она выполняет удаление двух видов:

  • Удаление из одной таблицы;
  • Каскадное удаление из нескольких таблиц.

Удаление из одной таблицы

DELETE FROM имя_таблицы

;

  • Если указана инструкция LOW_PRIORITY, то удаление не произойдет, пока все пользователи не завершат чтение таблицы.
  • Инструкция QUICK запрещает объединять индексы при выполнении удаления. Это несколько ускоряет процесс удаления.
  • Инструкция ORDER BY позволяет упорядочить записи перед удалением. Сама по себе эта опция не имеет смысла. Ее полезно использовать в сочетании с инструкцией LIMIT.
  • Инструкция LIMIT задает количество удаляемых записей.

Каскадное удаление

При каскадном удалении удаляется не только основная запись, но и записи из других таблиц, содержащие внешний ключ основной записи. В MySQL существует два вида таблиц:

  • InnoDB, которые поддерживают механизм связи по внешним ключам.
  • MyISAM, которые не поддерживают механизма связи по внешним ключам. В этом случае все связи хранятся исключительно в памяти администратора базы данных и программистов.

Для таблиц InnoDB при построении внешнего ключа всегда описывается реакция СУБД на удаление связанных записей. Реакция может быть трех видов:

  • RESTRICT – ограничение;
  • CASCADE – каскадное удаление;
  • SET NULL – установить значение NULL вместо значений удаленного внешнего ключа.

Пример 4

Пусть имеется таблица tovar, содержащая внешний ключ - categ со ссылкой на таблицу category.

Таким образом, каждый товар относится к определенной категории:

Необходимо удалить категорию «Лакокрасочные» из таблицы category и каскадно удалить все связанные с ней записи из таблицы tovar. Если во время создания внешнего ключа categ была указана реакция CASCADE при удалении, то для решения задачи достаточно выполнить команду:

DELETE FROM category WHERE category.categ_name=”лакокрасочные”;

Все товары, относящиеся к категории «лакокрасочные» автоматически удалятся из связанной таблицы tovar.

Однако, если пользователь работает с таблицами MyIsam, то СУБД не знает ни о каких внешних ключах и каскадного удаления не произойдет. В этом случае пригодятся специальные формы команды DELETE, предназначенные для каскадного удаления:

DELETE имя_таблицы [ ,имя_таблицы...]

DELETE

FROM имя_таблицы, [имя_таблицы...] USING таблица_ссылка

Пример 5

Задачу из примера 4 можно решить двумя эквивалентными командами:

DELETE tovar, category FROM tovar join category on category.itcateg=tovar.categ where category.name_categ=”Лакокрасочные”;

DELETE from tovar, category using tovar join category on category.itcateg=tovar.categ where category.name_categ=”Лакокрасочные”;

Замечание 1

На первый взгляд кажется, что команды

TRUNCATE имя_таблицы;

DELETE FROM имя_таблицы;

совершенно эквивалентны. Действительно, они обе полностью очищают таблицу от всех записей. Однако, разница все же есть.

Если используется TRUNCATE, то удаляются сразу все записи и при повторном заполнении таблицы поля с автоинкрементом получат значения начиная с 1. Если используется DELETE, то удаление происходит по одной записи и при повторном заполнении таблицы поля с автоинкрементом получат значение на 1 больше последнего удаленного значения (то есть автоинкрементирование продолжится).

Эта глава представляет команды которые управляют значениями представляемыми в таблице. Когда вы закончите эту главу, вы будете способны помещать строки в таблицу, удалять их, и изменять индивидуальные значения представленные в каждой строке. Будет показано использование запросов в формировании полной группы строк для вставки, а также, как может использоваться предикат для управления изменения значений и удаления строк. Материал в этой главе составляет полный объем знаний показывающий, как создавать и управлять информацией в базе данных. Более мощные способы проектировани предикатов будут обсуждены в следующей главе .

КОМАНДЫ МОДИФИКАЦИИ ЯЗЫКА DML

Значения могут быть помещены и удалены из полей, трем командами языка DML (Язык Манипулирования Данными): INSERT (ВСТАВИТЬ), UPDATE (МОДИФИЦИРОВАТЬ), DELETE (УДАЛИТЬ). Не смущайтесь, все они упоминались ранее в SQL, как команды модификации.

ВВОД ЗНАЧЕНИЙ

Все строки в SQL вводятся с использованием команды модификации INSERT. В самой простой форме, INSERT использует следующий синтаксис: INSERT INTO VALUES (, . . .); Так, например, чтобы ввести строку в таблицу Продавцов, вы можете использовать следующее условие: INSERT INTO Salespeople VALUES (1001, "Peel", "London", .12); Команды DML не производят никакого вывода, но ваша программа должна дать вам некоторое подтверждение того что данные были использованы.

Им таблицы (в нашем случае - Salespeople (Продавцы)), должно быть предварительно определено, в команде CREATE TABLE (см. Главу 17), а каждое значение пронумерованное в предложении значений, должно совпадать с типом данных столбца, в который оно вставляется. В ANSI, эти значения не могут составлять выражений, что означает что 3 - это доступно, а выражение 2 + 1 - нет. Значения, конечно же, вводятся в таблицу в поименном порядке, поэтому первое значение с именем, автоматически попадает в столбец 1, второе в столбец 2, на так далее.

ВСТАВКА ПУСТЫХ УКАЗАТЕЛЕЙ (NULL)

Если вам нужно ввести пустое значение(NULL), вы вводите его точно так- же как и обычное значение. Предположим, что еще не имелось пол city для мистера Peel. Вы можете вставить его строку со значением=NULL в это поле, следующим образом: INSERT INTO Salespeople VALUES (1001, "Peel", NULL, .12); Так как значение NULL - это специальный маркер, а не просто символьное значение, он не включается в одиночные кавычки.

ИМЕНОВАНИЕ СТОЛБЦА ДЛЯ ВСТАВКИ (INSERT)

Вы можете также указывать столбцы, куда вы хотите вставить значение имени. Это позволяет вам вставлять имена в любом порядке. Предположим что вы берете значения для таблицы Заказчиков из отчета выводимого на принтер, который помещает их в таком порядке: city, cname, и cnum, и для упрощения, вы хотите ввести значения в том же порядке: INSERT INTO Customers (city, cnamе, cnum) VALUES ("London", "Honman", 2001); Обратите внимание что столбцы rating и snum - отсутствуют. Это значит, что эти строки автоматически установлены в значение - по умолчанию. По умолчанию может быть введено или значение NULL или другое значе- ние определяемое как - по умолчанию. Если ограничение запрещает использование значения NULL в данном столбце, и этот столбец не установлен как по умолчанию, этот столбец должен быть обеспечен значением для любой команды INSERT которая относится к таблице(смотри Главу 18 для информации об ограничениях на NULL и на "по умолчанию").

ВСТАВКА РЕЗУЛЬТАТОВ ЗАПРОСА

Вы можете также использовать команду INSERT чтобы получать или вы- бирать значения из одной таблицы и помещать их в другую, чтобы использовать их вместе с запросом. Чтобы сделать это, вы просто заменяете предложение VALUES (из предыдущего примера) на соответствующий запрос: INSERT INTO Londonstaff SELECT * FROM Salespeople WHERE city = "London"; Здесь выбираются все значения произведенные запросом - то есть все строки из таблицы Продавцов со значениями city = "London" - и помещаются в таблицу называемую Londonstaff. Чтобы это работало, таблица Londonstaff должна отвечать следующим условиям:

* Она должна уже быть создана командой CREATE TABLE.

* Она должна иметь четыре столбца которые совпадают с таблицей

Продавцов в терминах типа данных; то есть первый, второй, и так далее, столбцы каждой таблицы, должны иметь одинаковый тип данных (причем они не должны иметь одинаковых имен).

Общее правило то, что вставляемые столбцы таблицы, должны совпадать со столбцами выводимыми подзапросом, в данном случае, для всей таб- лицы Продавцов. Londonstaff - это теперь независима таблица которая получила некоторые значения из таблицы Продавцов(Salespeople). Если значения в таблице Продавцов будут вдруг изменены, это никак не отразится на таблице Londonstaff (хотя вы могли бы создать такой эффект, с помощью Представ- лени(VIEW), описанного в Главе 20). Так как или запрос или команда INSERT могут указывать столбцы по имени, вы можете, если захотите, переместить только выбранные столбцы а так- же переупорядочить только те столбцы которые вы выбрали.

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

Понимая что таблица Порядков охватывает последний финансовый год, а не только несколько дней, как в нашем примере, вы можете видеть преимущество использования следующего условия INSERT в подсчете и вводе значений INSERT INTO Daytotals (date, total) SELECT odate, SUM (amt) FROM Orders GROUP BY odate; Обратите внимание что, как предложено ранее, имена столбцов таблицы Порядков и таблицы Daytotals - не должны быть одинаковыми. Кроме того, если дата приобретения и общее количество - это единственные столбцы в таблице, и они находятся в данном порядке, их имена могут быть исключены из вывода из-за их очевидной простоты.

УДАЛЕНИЕ СТРОК ИЗ ТАБЛИЦ

Вы можете удалять строки из таблицы командой модификации - DELETE. Она может удалять только введенные строки, а не индивидуальные значе- ни полей, так что параметр пол является необязательным или недоступным. Чтобы удалить все содержание таблицы Продавцов, вы можете ввести следующее условие: DELETE FROM Salespeople; Теперь когда таблица пуста ее можно окончательно удалить командой DROP TABLE (это объясняется в Главе 17). Обычно, вам нужно удалить только некоторые определенные строки из таб- лицы. Чтобы определить какие строки будут удалены, вы используете предикат, так же как вы это делали для запросов. Например, чтобы удалить продавца Axelrod из таблицы, вы можете ввести DELETE FROM Salespeople WHERE snum = 1003; Мы использовали поле snum вместо пол sname потому, что это лучшая тактика при использовании первичных ключей когда вы хотите чтобы действию подвергалась одна и только одна строка. Для вас - это аналогично действию первичного ключ. Конечно, вы можете также использовать DELETE с предикатом который бы выбирал группу строк, как показано в этом примере: DELETE FROM Salespeople WHERE city = "London";

ИЗМЕНЕНИЕ ЗНАЧЕНИЙ ПОЛЯ

Теперь, когда вы уже можете вводить и удалять строки таблицы, вы должны узнать как изменять некоторые или все значения в существующей строке. Это выполняется командой UPDATE. Эта команда содержит предложение UPDATE в которой указано им используемой таблицы и предложение SET которое указывает на изменение которое нужно сделать для определенного столбца. Например, чтобы изменить оценки всех заказчиков на 200, вы можете ввести UPDATE Customers SET rating = 200;

МОДИФИЦИРОВАНИЕ ТОЛЬКО ОПРЕДЕЛЕННЫХ СТРОК

Конечно, вы не всегда захотите указывать все строки таблицы для изменения единственного значения, так что UPDATE, наподобие DELETE, может брать предикаты. Вот как например можно выполнить изменение одинаковое для всех заказчиков продавца Peel (имеющего snum=1001): UPDATE Customers SET rating = 200 WHERE snum = 1001;

КОМАНДА UPDATE ДЛЯ МНОГИХ СТОЛБЦОВ

Однако, вы не должны, ограничивать себя модифицированием единственного столбца с помощью команды UPDATE. Предложение SET может назначать любое число столбцов, отделяемых запятыми. Все указанные назначения могут быть сделаны для любой табличной строки, но только для одной в каждый момент времени. Предположим, что продавец Motika ушел на пенсию, и мы хотим переназначить его номер новому продавцу: UPDATE Salespeople SET sname = "Gibson",city = "Boston",comm = .10 WHERE snum = 1004; Эта команда передаст новому продавцу Gibson, всех текущих заказчиков быв- шего продавца Motika и порядки, в том виде в котором они были скомпонованы для Motika с помощью пол snum. Вы не можете, однако, модифицировать сразу много таблиц в одной команде, частично потому, что вы не можете использовать префиксы таблицы со столбцами измененными предложением SET. Другими словами, вы не можете сказать - "SET Salespeople.sname = Gibson" в команде UPDATE, вы можете сказать только так - "SET sname = Gibson".

ИСПОЛЬЗОВАНИЕ ВЫРАЖЕНИЙ ДЛЯ МОДИФИКАЦИИ

Вы можете использовать скалярные выражения в предложении SET команды UPDATE, однако, включив его в выражение пол которое будет изменено. В этом их отличие от предложения VALUES команды INSERT, в котором выражения не могут использоваться; это свойство скалярных выражений - весьма полезна особенность. Предположим, что вы решили удвоить комиссионные всем вашим продавцам. Вы можете использовать следующее выражение: UPDATE Salespeople SET comm = comm * 2; Всякий раз, когда вы ссылаетесь к указанному значению столбца в предложении SET, произведенное значение может получится из текущей строки, прежде в ней будут сделаны какие-то изменения с помощью команды UPDATE. Естественно, вы можете скомбинировать эти особенности, и сказать, - удвоить комиссию всем продавцам в Лондоне, таким предложением: UPDATE Salespeople SET comm = comm * 2 WHERE city = "London";

МОДИФИЦИРОВАНИЕ ПУСТЫХ(NULL) ЗНАЧЕНИЙ

Предложение SET - это не предикат. Он может вводить пустые NULL значения также как он вводил значения не используя какого-то специального синтаксиса (такого например как IS NULL). Так что, если вы хотите установить все оценки заказчиков в Лондоне в NULL, вы можете ввести следующее предложение: UPDATE customers SET rating = NULL WHERE city = "London"; что обнулит все оценки заказчиков в Лондоне.

РЕЗЮМЕ

Теперь вы овладели мастерством управления содержанием вашей базы данных с помощью трех простых команд: INSERT - используемой чтобы помещать строки в базу данных; DELETE - чтобы удалять их; REFERENCES - чтобы изменять значения в уже вставленных строках. Вы обучались использованию предиката с командами UPDATE и DELETE чтобы определить, на которую из строк будет воздействовать команда. Конечно, предикаты как таковые - не значимы для INSERT, потому что обсуждаемая строка не существует в таблице до окончания выполнения команды INSERT. Однако, вы можете использовать запросы с INSERT, чтобы сразу помещать все наборы строк в таблицу. Причем это, вы можете делать со столбцами в любом порядке. Вы узнали, что значения по умолчанию, могут помещаться в столбцы, если вы не устанавливаете это значение явно. Вы также видели использование стандартного значения по умолчанию, которым является NULL. Кроме того, вы поняли, что UPDATE может использовать выражение значения, тогда как INSERT не может. Следующая глава расширит ваше познания, показав вам, как использовать подзапросы с этими командами. Эти подзапросы напоминают те, с которыми вы уже знакомы, но имеются некоторые специальные выводы и ограничения, когда подзапросы используются в командах DML, что мы будем обсуждать в Главе 16 .

РАБОТА С SQL

1. Напишите команду которая бы поместила следующие значения, в их нижеуказанном порядке, в таблицу Продавцов: city - San Jose, name - Bianco, comm - NULL, cnum - 1100. 2. Напишите команду которая бы удалила все порядки заказчика Clemens из таблицы Порядков.

3. Напишите команду которая бы увеличила оценку всех заказчиков в Риме на 100.

4. Продавец Serres оставил компанию. Переназначьте его заказчиков продавцу Motika.

DELETE - это DM-операция удаления записей из таблицы. Критерий отбора записей для удаления определяется выражением WHERE . В случае, если критерий отбора не определён, выполняется удаление всех записей. Синтаксис:

DELETE FROM ;

Более быстро операцию удаление всех строк из таблицы можно в Transact-SQL также выполнить с помощью команды:

TRUNCATE TABLE

Transact-SQL (T-SQL) - процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft SQL Server и Sybase ASE.

Примеры работы оператора

Пример 1. Требуется удалить из таблицы Laptop все портативные компьютеры с размером экрана менее 15 дюймов.

DELETE FROM Laptop WHERE screen

Все блокноты можно удалить с помощью оператора:

DELETE FROM Laptop;

Transact-SQL расширяет синтаксис оператора DELETE, вводя дополнительное предложение FROM:

При помощи этого предложения можно выполнять соединения таблиц, что логически заменяет использование подзапросов в предложении WHERE для идентификации удаляемых строк. Рассмотрим пример:

Пример 2. Пусть требуется удалить те модели ноутбуков из таблицы Product, для которых нет соответствующих строк в таблице Notebook. Используя стандартный синтаксис, задача решается так:

DELETE FROM Notebook WHERE type = "nb" AND model NOT IN (SELECT model FROM NB);

Предикат type = "Nb" необходим здесь, чтобы не были удалены также модели принтеров, сканеров и персональных компьютеров.

Эту же задачу можно решить с помощью дополнительного предложения FROM следующим образом:

DELETE FROM Notebook FROM Product pr LEFT JOIN NB ON pr.model = NB.model WHERE type = "nb" AND NB.model IS NULL;

Здесь применяется внешнее соединение, в результате чего столбец NB.model для моделей ноутбуков, отсутствующих в таблице NB, будет содержать NULL-значение, что и используется для идентификации подлежащих удалению строк.