Update sql примеры. SQL. Синтаксис команды UPDATE. Общее решение с динамическим SQL
Оператор UPDATE изменяет имеющиеся данные в таблице. Команда имеет следующий синтаксис:
UPDATE SET { = { | NULL | DEFAULT},...} [ {WHERE }];
С помощью одного оператора могут быть заданы значения для любого количества столбцов. Однако в одном и том же операторе UPDATE можно вносить изменения в каждый столбец указанной таблицы только один раз. При отсутствии предложения WHERE будут обновлены все строки таблицы.
Если столбец допускает NULL-значение, то его можно указать в явном виде. Кроме того, можно заменить имеющееся значение на значение по умолчанию (DEFAULT) для данного столбца.
Примеры оператора SQL UPDATE
Имеется следующая таблица Planets:
Пример 1. С помощью оператора SQL UPDATE изменим название планеты Neptune на Pluton :
UPDATE Planets SET PlanetName = "Pluton" WHERE ID = 3;
В этом примере условие оператора SQL WHERE является обязательным, так как без него все поля столбца PlanetName во всей таблице изменились бы на Pluton. В данном случае, нам приходит на помощь столбец ID, т.к. он является Первичным ключом, позволяющим однозначно идентифицировать запись.
Пример 2. Увеличим зарплату всех учителей в 2 раза, а премию - в 10 раз.
Последнее обновление: 13.07.2017
Для изменения уже имеющихся строк в таблице применяется команда UPDATE . Она имеет следующий формальный синтаксис:
UPDATE имя_таблицы SET столбец1 = значение1, столбец2 = значение2, ... столбецN = значениеN
Например, увеличим у всех товаров цену на 5000:
UPDATE Products SET Price = Price + 5000
Используем критерий, и изменим название производителя с "Samsung" на "Samsung Inc.":
UPDATE Products SET Manufacturer = "Samsung Inc." WHERE Manufacturer = "Samsung"
Более сложный запрос - заменим у поля Manufacturer значение "Apple" на "Apple Inc." в первых 2 строках:
UPDATE Products SET Manufacturer = "Apple Inc." FROM (SELECT TOP 2 FROM Products WHERE Manufacturer="Apple") AS Selected WHERE Products.Id = Selected.Id
С помощью подзапроса после ключевого слова FROM производится выборка первых двух строк, в которых Manufacturer="Apple". Для этой выборки будет определен псевдоним Selected. Псевдоним указывается после оператора AS .
Далее идет условие обновления Products.Id = Selected.Id . То есть фактически мы имеем дело с двумя таблицами - Products и Selected (которая является производной от Products). В Selected находится две первых строки, в которых Manufacturer="Apple". В Products - вообще все строки. И обновление производится только для тех строк, которые есть в выборке Selected. То есть если в таблице Products десятки товаров с производителем Apple, то обновление коснется только двух первых из них.
Платформа SQL Server поддерживает большинство основных компонентов инструкции UPDATE стандарта ANSI, но не поддерживаются ключевые слова ONLY и ARRAY и не поддерживается возможность обновления массивов. В SQL Server функциональность инструкции UPDATE была расширена путем добавления подсказок по таблице при помощи предложения WITH, добавления подсказок по запросу при помощи предложения OPTION, а также введена более надежная обработка переменных. Синтаксис следующий.
UPDATE {имя_таблицы | имя_представления | набор-строк} )] SET {имя_столбца={DEFAULT | NULL | скалярное_выражение} |
имя стременной=скалярное_выражение| имя_переменной=имя_столбца=скалярное_выражение} [, …] ]
WHERE {условия | CURRENT OF имя_курсора) )]
Синтаксические элементы инструкции UPDATE в SQL Server следующие.
WITH подсказка
Позволяет использовать подсказки по таблицам, заменяя заданное по умолчанию поведение оптимизатора запросов. Поскольку оптимизатор запросов очень хорошо выбирает планы обработки, используйте подсказки только в том случае, если вы очень хорошо понимаете таблицы, индексы и данные, затрагиваемые операцией. Если такого понимания нет, использование подсказок может привести не к увеличению, а к уменьшению производительности.
имя_переменной
Переменные SQL Server должны быть объявлены до использования инструкции UPDATE, в форме DECLARE @переменная. Конструкция SET @переменная=столбец!=выражение! устанавливает для переменной значение, равное окончательному значению обновленного столбца, а конструкция SET @переменная -столбец!, столбец!=выражение устанавливает для переменной значение, равное значению в столбце до выполнения инструкции UPDATE.
Предоставляет возможность создать для указания обновляемых строк высокоизбирательный критерий на основе соединения. Предложение FROM не нужно, если при указании строк используется только одна таблица - целевая. Функции для работы с наборами строк (rowset functions) в SQL Server описываются в разделе «Инструкция SELECT».
AS псевдоним
Позволяет присвоить легкий в использовании псевдоним таблице, представлению, вложенному табличному подзапросу или функции для работы с наборами строк.
Предоставляется возможность использовать стандартный синтаксис ANSI для соединений таблиц совместно с предложением FROM.
Небольшая вариация предложения WHERE CURRENT OF стандарта ANSI. Предложение WHERE CURRENT OF имя курсора, используемое в комбинации с курсором, заставляет платформу SQL Server обновить только одну запись, на которой в данный момент расположен курсор. Предполагается, что курсор является локальным, но можно указать и глобальный курсор, используя ключевое слово GLOBAL.
OPTION подсказка
Позволяет использовать подсказки по запросам, изменяя заданное по умолчанию поведение оптимизатора запросов. Как и в случае с предложением WITH, используйте подсказки только в том случае, если вы очень хорошо понимаете таблицы, индексы и данные, затрагиваемые операцией. Если такого понимания нет, использование подсказок может привести не к увеличению, а к уменьшению производительности.
Главное расширение, которое вводит Microsoft SQL Server в инструкцию UPDATE стандарта ANSI, - это предложение FROM. Предложение FROM позволяет использовать предложение JOIN, что значительно упрощает обновление строк целевой таблицы путем связывания строк, указанных в предложении FROM, со строками, обновляемыми компонентом UPDATE имя_таблицы. В следующем примере показано обновление результата соединения таблиц с использованием стиля ANSI и довольно громоздкого подзапроса, а потом - обновление с использованием предложения FROM SQL Server. Оба запроса выполняют одно и то же действие, но совершенно по-разному.
Выполнение такого обновления при использовании стиля Transact-SQL сводится к соединению двух таблиц - authors и titleauthor - с таблицей titles. Для выполнения той же самой операции с использованием кода ANSI нужно сначала найти значение au_id в таблице authors и передать его в таблицу titleauthor, а затем нужно найти значение title_id и передать его в основную инструкцию UPDATE.
В следующем примере обновляется столбец state для первых десяти записей таблицы authors.
UPDATE authors SET state="ZZ" FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1 WHERE authors.au_id=t1.au_.id
В этом примере важно обратить внимание на то, что, как правило, довольно сложно обновить первые п записей при помощи инструкции UPDATE, если нет какой-нибудь явной последовательности строк, которую можно определить при помощи предложения WHERE. Однако вложенный табличный подзапрос в предложении FROM, использующий ключевое слово ТОР для получения первых 10 записей, помогает не тратить силы на дополнительное программирование, которое иначе было бы необходимо.
Команда UPDATE — производит изменения в уже существующей записи или во множестве записей в таблице SQL . Изменяет существующие значения в таблице или в основной таблице представления.
Команда UPDATE Синтаксис команды
Синтаксис команды UPDATE
Команда UPDATE. Основные ключевые слова и параметры команды UPDATE
- schema - идентификатор полномочий, обычно совпадающий с именем некоторого пользователя
- table view - имя таблицы SQL , в которой изменяются данные; если определяется представление, данные изменяются в основной таблице SQL представления
- subquery_1 - подзапрос , который сервер обрабатывает тем же самым способом как представление
- с olumn - столбец таблицы SQL или представления SQL , значение которого изменяется; если столбец таблицы из предложения SET опускается, значение столбца остается неизменяемым
- expr - ; это выражение может содержать главные переменные и необязательные индикаторные переменные
- subquery _2 - новое значение, назначаемое соответствующему столбцу
- subquery _3 - новое значение, назначаемое соответствующему столбцу
WHERE
- определяет диапазон изменяемых строк теми, для которых определенное условие является TRUE
; если опускается эта фраза, модифицируются все строки в таблице или представлении.
При выдаче утверждения включается любой UPDATE-триггер
, определенный на таблице.
Подзапросы
. Если предложение SET
содержит подзапрос
, он возвращает точно одну строку для каждой модифицируемой строки. Каждое значение в результате подзапроса назначается соответствующим столбцам списка в круглых скобках. Если подзапрос не возвращает никакие строки, столбцу назначается NULL
. Подзапросы
могут выбирать данные из модифицируемой таблицы. Предложение SET
может совмещать выражения и подзапросы
.
Команда UPDATE Пример 1
Изменение для всех покупателей рейтинга на значение, равное 200:
Customers SET rating = 200;
Команда UPDATE Пример 2
Замена значения столбца во всех строках таблицы, как правило, используется редко. Поэтому в команде , как и в команде DELETE
, можно использовать предикат. Для выполнения указанной замены значений столбца rating, для всех покупателей, которые обслуживаются продавцом Giovanni (snum = 1003), следует ввести:
Customers SET rating = 200 WHERE snum = 1001;
Команда SQL UPDATE Пример 3
В предложении SET
можно указать любое количество значений для столбцов, разделенных запятыми:
Emp SET job = ‘MANAGER’, sal = sal + 1000, deptno = 20 WHERE ename = ‘JONES’;
Команда UPDATE Пример 4
В предложении SET
можно указать значение NULL без использования какого-либо специального синтаксиса (например, такого как IS NULL). Таким образом, если нужно установить все рейтинги покупателей из Лондона (city = ‘London’) равными NULL-значению, необходимо ввести:
Customers SET rating = NULL WHERE city = ‘London’;
Команда UPDATE Пример 5
Поясняет использование следующих синтаксических конструкций команды :
- Обе формы предложения SET вместе в одном утверждении.
- Подзапрос.
- Предложение WHERE, ограничивающее диапазон модифицируемых строк.
Emp a SET deptno =
(SELECT deptno FROM dept WHERE loc = ‘BOSTON’), (sal, comm) = (SELECT 1.1*AVG(sal), 1.5*AVG(comm) FROM emp b WHERE a.deptno = b.deptno) WHERE deptno IN (SELECT deptno FROM dept WHERE loc = ‘DALLAS’ OR loc = ‘DETROIT’);
Вышеупомянутое утверждение выполняет следующие операции:
- Модифицирует только тех служащих, кто работают в Dallas или Detroit
- Устанавливает значение колонки deptno для служащих из Бостона
- Устанавливает жалованье каждого служащего в 1.1 раз больше среднего жалованья всего отдела
- Устанавливает комиссионные каждого служащего в 1.5 раза больше средних комиссионных всего отдела
Что если я спрошу: "Все ли обновления установлены на ваш SQL Server?"
Как ответить на такой вопрос? Заглянуть в центр обновления Windows? Это вряд ли поможет. Скорее всего вы увидите там вот такую картину:
Но, как ни странно, это вовсе не означает, что на SQL Server установлены самые свежие обновления!
Для отслеживания обновлений именно для SQL-сервера Микрософт создал специальную страничку — . Положите её себе в закладки:
Но прежде чем идти туда, необходимо выяснить, какая версия установлена у нас прямо сейчас. Нам нужен точный номер, включающий в себя номер построения (build number). Получить его можно посмотрев на системную переменную @@Version :
Запомните эти цифры — только по ним мы сможем определить какие обновления у нас уже установлены, а какие — нет. SQL-сервер, в отличие от операционной системы сам не сообщает нам о каждом установленном обновлении. Поэтому придётся работать с номером @@Version .
Теперь заходим в центр обновления SQL-сервера и видим там удобную табличку:
Здесь нам понадобятся три вещи:
- Во-первых, запомним номер построения, соответствующий этому обновлению. По окончании процедуры обновления @@Version нашего SQL-сервера должна выдавать именно такой номер.
- Во-вторых, обязательно следует посмотреть историю номеров построений, соответствующих обновлениям с последнего сервисного пакета. Это важно, потому что накопительное обновление установится только на предшествующий ему сервисный пакет.
- И в-третьих, полезно посмотреть список исправлений, содержащихся в накопительном пакете. Администратор должен быть в курсе изменений, вносимых этим пакетом.
Посмотрев номера построений предшествующих обновлений, мы увидим, что разрыв в номерах по сравнению с нашей текущей версией подозрительно большой:
Это из-за того, что у нас не установлен сервисный пакет SP1. Придётся сначала поставить его.
И вот теперь у нас есть план действий:
- Устанавливаем сервисный пакет SP1.
- Устанавливаем накопительный пакет обновлений CU4.
Действуем! После установки SP1 проверяем номер @@Version . С исходного 2100.60 он увеличился до 3000.0.