Правила вложенных запросов
На вложенный запрос распространяются следующие ограничения:
- Список выбора вложенного запроса, начинающийся с оператора сравнения, может включать только одно выражение или имя столбца (за исключением операторов и в инструкции или в списке соответственно).
- Если предложение внешнего запроса включает имя столбца, оно должно быть совместимо для соединения со столбцом в списке выбора вложенного запроса.
- Типы данных ntext, text и image не могут быть использованы в списке выбора вложенных запросов.
- Вложенные запросы, представленные оператором неизмененного сравнения (после которого нет ключевого слова или ), не могут включать предложения и .
- Ключевое слово не может быть использовано во вложенном запросе, включающем предложение GROUP BY.
- Предложения и не могут быть указаны.
- Предложение может быть указано только вместе с предложением .
- Представление, созданное с помощью вложенного запроса, не может быть обновлено.
- Список выбора вложенного запроса, начинающегося с предложения , по соглашению содержит звездочку (*) вместо отдельного имени столбца. Правила для вложенного запроса, начинающегося с предложения , являются такими же, как для стандартного списка выбора, поскольку вложенный запрос, начинающийся с предложения , проводит проверку на существование и возвращает TRUE или FALSE вместо данных.
Обновление только выбранных строк
Вместо того, чтобы обновить все записи, вы можете выборочно обновить определенные записи на основе условия WHERE.
В следующем примере будет обновлять таблицу сотрудников и назначить сотрудника, который имеют зарплату больше или равно 7000 для отдела маркетинга.
mysql> UPDATE worker SET dept='Marketing' WHERE salary >=7000; Query OK, 2 rows affected (0.01 sec) Rows matched: 2 Changed: 2 Warnings: 0
Были только две записи, которые соответствовали выше, таблица обновилась, как показано ниже.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | IT | 5000 | | 200 | Anton | IT | 5500 | | 300 | Maxim | Marketing | 7000 | | 400 | Dimon | Marketing | 9500 | | 500 | Anton | IT | 6000 | | 501 | Anna | IT | NULL | +-----+--------+------------+--------+
Мы обсуждали много различных практических условий WHERE в нашем учебнике MySQL по команде SELECT. Это очень полезно, чтобы понять, как использовать предложение WHERE эффективно во время UPDATE: 25 основных примеров в MySQL для команды SELECT.
Пример обновления таблицы данными из другой таблицы
Рассмотрим пример UPDATE, который показывает, как обновить таблицу данными из другой таблицы в MySQL.
MySQL
UPDATE customers
SET city = (SELECT city
FROM suppliers
WHERE suppliers.supplier_name = customers.customer_name)
WHERE customer_id > 5000;
1 |
UPDATEcustomers SETcity=(SELECTcity FROMsuppliers WHEREsuppliers.supplier_name=customers.customer_name) WHEREcustomer_id>5000; |
В этом примере UPDATE будет обновляться только таблица customers для всех записей, где customer_id больше 5000. Когда supplier_name из таблицы suppliers совпадает с именем customer_name из таблицы customers, city из таблицы suppliers будет скопирован в поле city таблицы customers.
Многократное обновление таблиц (с помощью Inner Join)
Можно также объединить две таблицы во время обновления. Можно также обновить значения из двух таблиц одновременно с помощью одного оператора обновления.
В этом примере мы будем использовать в таблице следующие преимущества наряду с нашей существующей таблицей сотрудников.
mysql> SELECT * from benefits; +------------+-------+ | dept | bonus | +------------+-------+ | Sales | 1000 | | IT | NULL | | Marketing | 800 | +------------+-------+
Следующее утверждение обновление будет увеличивать значение столбца заработной платы из таблицы сотрудников к значению, указанному в таблице льгот для соответствующего столбца DEPT.
Это означает, что мы должны объединить оба работника и таблицу преимущества во время обновления, как показано ниже. Используйте общее поле между этими двумя таблицами в предложении WHERE. В этом примере общее поле dept.
Кроме того, сразу после ключевого слова UPDATE укажите имя обоих таблиц, как показано ниже. После ключевого слова SET можно указать либо имя одного или нескольких столбцов, которые должны быть обновлены, либо из одной таблицы, или как в таблице.
mysql> UPDATE worker,benefits -> SET worker.salary=worker.salary+benefits.bonus -> WHERE worker.dept=benefits.dept and benefits.bonus is not null; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0
Обратите внимание, что в приведенном выше обновлении, мы используем внутреннее соединение. Ниже приведен вывод после того, как приведенное выше утверждение обновление было выполнено
Как вы видите ниже, зарплата работника получила увеличивается на основе значений из таблицы выгоды
Ниже приведен вывод после того, как приведенное выше утверждение обновление было выполнено. Как вы видите ниже, зарплата работника получила увеличивается на основе значений из таблицы выгоды.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | Sales | 7500 | | 200 | Anton | Sales | 7500 | | 300 | Maxim | IT | 6500 | | 400 | Dimon | IT | 5000 | | 500 | Anton | Marketing | 5800 | | 501 | Anna | Marketing | 5800 | +-----+--------+------------+--------+
Множественное обновление таблиц (с помощью Left Join)
Аналогично предыдущему примеру внутреннего соединения, мы можем также использовать левое соединение.
Когда мы используем внутреннее соединение, мы не указываем ключевое слово “inner join”, так как это по умолчанию при объединении нескольких таблиц.
Однако при использовании соединения слева мы должны явно указать “left join”, как показано ниже.
mysql> UPDATE worker LEFT JOIN benefits on worker.dept = benefits.dept -> SET worker.salary = worker.salary+500 -> WHERE benefits.bonus is null; Query OK, 2 rows affected (0.03 sec) Rows matched: 2 Changed: 2 Warnings: 0
Вот выход после вышеуказанного обновления.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | Sales | 7500 | | 200 | Anton | Sales | 7500 | | 300 | Maxim | IT | 7000 | | 400 | Dimon | IT | 5500 | | 500 | Anton | Marketing | 5800 | | 501 | Anna | Marketing | 5800 | +-----+--------+------------+--------+
Приоритет вставки INSERT LOW_PRIORITY / HIGH_PRIORITY
Установление приоритета нужно для решение проблем с конкурентными вставками. При вставках происходит блокировка строк и если 2 INSERT запроса требуют блокировки одних и тех же строк, для своего выполнения, то иногда может потребоваться повысить или понизить приоритет некоторых запросов, по отношению к другим. Это можно сделать указав приоритет LOW_PRIORITY или HIGH_PRIORITY
Наш запрос будет выглядеть так для LOW_PRIORITY:
INSERT LOW_PRIORITY INTO table1 (a, b, c) VALUES(1, 2, 3);
HIGH_PRIORITY:
INSERT HIGH_PRIORITY INTO table1 (a, b, c) VALUES(1, 2, 3);
Помогла ли Вам эта статья?
Да
Нет
Пример использования условия EXISTS
Вы также можете выполнять более сложные обновления в Oracle.
Вы можете обновлять записи в одной таблице на основе значений другой таблицы. Поскольку вы не можете перечислить более одной таблицы в операторе Oracle UPDATE, то вы можете использовать Oracle условие EXISTS.
Например:
Oracle PL/SQL
UPDATE suppliers
SET supplier_name = (SELECT customers.customer_name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.customer_name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id);
1 |
UPDATEsuppliers SETsupplier_name=(SELECTcustomers.customer_name FROMcustomers WHEREcustomers.customer_id=suppliers.supplier_id) WHEREEXISTS(SELECTcustomers.customer_name FROMcustomers WHEREcustomers.customer_id=suppliers.supplier_id); |
В этом Oracle примере UPDATE, всякий раз, когда supplier_id соответствует значение customer_id, то supplier_name будет перезаписано в customer_name из таблицы customers.
Использование ключевого слова DEFAULT в Update
Вместо того, чтобы указать статическое значение или выражение, вы также можете использовать ключевое слово “DEFAULT”, когда вы присваиваете значение столбца после SET.
Если вы посмотрите на вывод “DESC worker”, показанного ниже, вы увидите, что столбец с именем по умолчанию. Как вы видите там, зарплата имеет значение по умолчанию NULL. Отдел имеет значение по умолчанию продаж.
mysql> DESC worker; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | dept | varchar(10) | YES | | Sales | | | salary | int(10) | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+
Во-первых, давайте обновим столбец зарплаты по умолчанию, используя ключевое слово DEFAULT, как показано ниже.
mysql> UPDATE worker SET salary=DEFAULT; Query OK, 5 rows affected (0.03 sec) Rows matched: 6 Changed: 5 Warnings: 0
Затем обновите столбец отдела до значения по умолчанию, используя ключевое слово DEFAULT, как показано ниже.
mysql> UPDATE worker SET dept=DEFAULT; Query OK, 6 rows affected (0.00 sec) Rows matched: 6 Changed: 6 Warnings: 0
Как видно из следующих выходных данных, мы можем видеть, что ключевое слово DEFAULT взял соответствующие значения по умолчанию из определения таблицы сотрудников, и использовали их, чтобы обновить его. Колонка Департамент получил обновление до продаж и зарплата обновлена до NULL, как показано ниже.
mysql> SELECT * FROM worker; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Andrey | Sales | NULL | | 200 | Anton | Sales | NULL | | 300 | Maxim | Sales | NULL | | 400 | Dimon | Sales | NULL | | 500 | Anton | Sales | NULL | | 501 | Anna | Sales | NULL | +-----+--------+-------+--------+
Ограничение колличества записей при обновлении
Мы также можем использовать опцию LIMIT, чтобы ограничить количество записей, которые должны быть обновлены.
Даже если условие, где соответствует несколько записей, оператор обновления будет обновлять только 1-е X количество записей, указанных в значении LIMIT.
В следующем примере мы присваиваем зарплату всех записей до 6500, так как мы не имеем WHERE. Но, мы используем LIMIT 3. Это означает, что она будет обновлять зарплату только первым трем записям для условия согласования.
mysql> UPDATE worker SET salary=6500 LIMIT 3; Query OK, 3 rows affected (0.01 sec) Rows matched: 3 Changed: 3 Warnings: 0
Как видно из следующего выхода, только 1-е три записи обновляются предыдущей командой.
mysql> SELECT * FROM worker; +-----+--------+-----------+--------+ | id | name | dept | salary | +-----+--------+-----------+--------+ | 100 | Andrey | Sales | 6500 | | 200 | Anton | Sales | 6500 | | 300 | Maxim | Sales | 6500 | | 400 | Dimon | Marketing | 5000 | | 500 | Anton | Marketing | 5000 | | 501 | Anna | Marketing | 5000 | +-----+--------+-----------+--------+
Одна вещь, чтобы иметь в виду, что LIMIT 3 на самом деле не означает, что обновление будет продолжать идти, пока он не обновит 3 записей. Вместо этого оператор обновления прекратит выполнение, как только он обработал первые 3 строки, которые соответствовали условию выполнения, независимо от того, были ли действительно обновлены эти записи или нет.
Случай объединения или IF с Update
Вы также можете использовать условные обновления MySQL с помощью условных команд, как CASE, IF и т.д. Это полезно для упрощения обновления.
Вместо того чтобы использовать несколько обновлений, вы можете просто обойтись с помощью одной команды UPDATE, которая сочетает в себе все ваши операции.
Например, скажем, у нас есть следующие три оператора обновления, которые обновляют поле заработной платы на основе значения из поля отдела.
UPDATE worker SET salary = salary+1000 WHERE dept = 'Sales'; UPDATE worker SET salary = salary+500 WHERE dept = 'IT '; UPDATE worker SET salary = salary+800 WHERE dept = 'Marketing';
Вы можете объединить все перечисленные выше заявления трех UPDATE в одном заявлении UPDATE используя условие CASE, как показано ниже.
UPDATE worker SET salary = CASE dept WHEN 'Sales' THEN salary+1000 WHEN 'IT ' THEN salary+500 WHEN 'Marketing' THEN salary+500 ELSE salary END;
Так же, как CASE, вы можете также использовать IF условие для обновления значения столбца соответственно.
UPDATE таблица
Следующая инструкция SQL обновляет первого клиента (CustomerID = 1) с новым контактным лицом и новым городом.
Пример
UPDATE Customers
SET ContactName = ‘Alfred Schmidt’, City= ‘Frankfurt’
WHERE CustomerID = 1;
Выбор из таблицы «Customers» теперь будет выглядеть следующим образом:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Frankfurt | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Случай объединения или IF с Update
Вы также можете использовать условные обновления MySQL с помощью условных команд, как CASE, IF и т.д. Это полезно для упрощения обновления.
Вместо того чтобы использовать несколько обновлений, вы можете просто обойтись с помощью одной команды UPDATE, которая сочетает в себе все ваши операции.
Например, скажем, у нас есть следующие три оператора обновления, которые обновляют поле заработной платы на основе значения из поля отдела.
UPDATE worker SET salary = salary+1000 WHERE dept = 'Sales'; UPDATE worker SET salary = salary+500 WHERE dept = 'IT '; UPDATE worker SET salary = salary+800 WHERE dept = 'Marketing';
Вы можете объединить все перечисленные выше заявления трех UPDATE в одном заявлении UPDATE используя условие CASE, как показано ниже.
UPDATE worker SET salary = CASE dept WHEN 'Sales' THEN salary+1000 WHEN 'IT ' THEN salary+500 WHEN 'Marketing' THEN salary+500 ELSE salary END;
Так же, как CASE, вы можете также использовать IF условие для обновления значения столбца соответственно.
Пример — обновить несколько столбцов
Давайте рассмотрим пример UPDATE, который показывает, как обновить более одного столбца в таблице.Подсказка:. Когда вы обновляете несколько столбцов в выражении UPDATE, вам нужно разделить запятыми пары столбец / значение в предложении SET.
В этом примере UPDATE у нас есть таблица suppliers со следующими данными:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
200 | Lansing | Michigan | |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
Теперь давайте продемонстрируем, как использовать оператор UPDATE для обновления более одного значения столбца одновременно. Введите следующую команду UPDATE.
PgSQL
UPDATE suppliers
SET supplier_id = 150,
supplier_name = ‘Apple’,
city = ‘Cupertino’
state = ‘California’
WHERE supplier_name = ‘Google’;
1 |
UPDATEsuppliers SETsupplier_id=150, supplier_name=’Apple’, city=’Cupertino’ state=’California’ WHEREsupplier_name=’Google’; |
Будет обновлена 1 запись. Снова выберите данные из таблицы suppliers:
PgSQL
SELECT *
FROM suppliers;
1 |
SELECT* FROMsuppliers; |
Вот результаты, которые вы должны получить.
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
150 | Apple | Cupertino | California |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
В этом примере UPDATE будет обновлено значение supplier_id до 150, для supplier_name — ‘Apple’, для city — ‘Cupertino’, а для state — ‘California’, где supplier_name это «Google».
Использование механизма автоматического приращения при вставке данных
Механизм автоматического приращения предназначен для автоматического генерирования уникальных значений первичного
ключа в таблице. При его использовании не требуется проверять все значения первичного ключа, чтобы определить
максимальное значение. При создании новой записи можно указать в качестве значения первичного ключа
0 или NULL и в таблицу будет автоматически вставлено значение, увеличенное на единицу по сравнению с
максимальным значением.
В разных диалектах SQL синтаксис автоматического приращения различается. В MySQL используется
ключевое слово AUTO_INCREMENT. Таблица с использованием механизма AUTO_INCREMENT в MySQL создаётся так:
CREATE TABLE ADS (
Id INT(11) NOT NULL AUTO_INCREMENT,
Category varchar(25) DEFAULT ‘Some Category’,
Part varchar(25) DEFAULT ‘Some Part’,
Units INT(5) DEFAULT NULL,
Money INT(10) DEFAULT NULL,
PRIMARY KEY (Id)
)
В SQL Server используется ключевое слово IDENTITY (N, M), где N — начальное значение столца, M —
шаг приращения. Так, указав IDENTITY (1, 1) мы обеспечим начальное значение первичного ключа 1 и приращение
на 1 значения при каждой вставке новой строки:
CREATE TABLE ADS (
Id int IDENTITY(1, 1) PRIMARY KEY,
Category varchar(25) DEFAULT ‘Some Category’,
Part varchar(25) DEFAULT ‘Some Part’,
Units INT(5) DEFAULT NULL,
Money INT(10) DEFAULT NULL
)
Многократное обновление таблиц (с помощью Inner Join)
Можно также объединить две таблицы во время обновления. Можно также обновить значения из двух таблиц одновременно с помощью одного оператора обновления.
В этом примере мы будем использовать в таблице следующие преимущества наряду с нашей существующей таблицей сотрудников.
mysql> SELECT * from benefits; +------------+-------+ | dept | bonus | +------------+-------+ | Sales | 1000 | | IT | NULL | | Marketing | 800 | +------------+-------+
Следующее утверждение обновление будет увеличивать значение столбца заработной платы из таблицы сотрудников к значению, указанному в таблице льгот для соответствующего столбца DEPT.
Это означает, что мы должны объединить оба работника и таблицу преимущества во время обновления, как показано ниже. Используйте общее поле между этими двумя таблицами в предложении WHERE. В этом примере общее поле dept.
Кроме того, сразу после ключевого слова UPDATE укажите имя обоих таблиц, как показано ниже. После ключевого слова SET можно указать либо имя одного или нескольких столбцов, которые должны быть обновлены, либо из одной таблицы, или как в таблице.
mysql> UPDATE worker,benefits -> SET worker.salary=worker.salary+benefits.bonus -> WHERE worker.dept=benefits.dept and benefits.bonus is not null; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0
Обратите внимание, что в приведенном выше обновлении, мы используем внутреннее соединение. Ниже приведен вывод после того, как приведенное выше утверждение обновление было выполнено
Как вы видите ниже, зарплата работника получила увеличивается на основе значений из таблицы выгоды
Ниже приведен вывод после того, как приведенное выше утверждение обновление было выполнено. Как вы видите ниже, зарплата работника получила увеличивается на основе значений из таблицы выгоды.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | Sales | 7500 | | 200 | Anton | Sales | 7500 | | 300 | Maxim | IT | 6500 | | 400 | Dimon | IT | 5000 | | 500 | Anton | Marketing | 5800 | | 501 | Anna | Marketing | 5800 | +-----+--------+------------+--------+
Множественное обновление таблиц (с помощью Left Join)
Аналогично предыдущему примеру внутреннего соединения, мы можем также использовать левое соединение.
Когда мы используем внутреннее соединение, мы не указываем ключевое слово “inner join”, так как это по умолчанию при объединении нескольких таблиц.
Однако при использовании соединения слева мы должны явно указать “left join”, как показано ниже.
mysql> UPDATE worker LEFT JOIN benefits on worker.dept = benefits.dept -> SET worker.salary = worker.salary+500 -> WHERE benefits.bonus is null; Query OK, 2 rows affected (0.03 sec) Rows matched: 2 Changed: 2 Warnings: 0
Вот выход после вышеуказанного обновления.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | Sales | 7500 | | 200 | Anton | Sales | 7500 | | 300 | Maxim | IT | 7000 | | 400 | Dimon | IT | 5500 | | 500 | Anton | Marketing | 5800 | | 501 | Anna | Marketing | 5800 | +-----+--------+------------+--------+
Практическое упражнение № 2:
На основании таблицы suppliers и customers, заполненной следующими данными, обновите city в таблице suppliers значением поля city в таблице customers, когда supplier_name таблицы suppliers соответствует customer_name в таблице customers.
Oracle PL/SQL
CREATE TABLE suppliers
( supplier_id number(10) not null,
supplier_name varchar2(50) not null,
city varchar2(50),
CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)
);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5001, ‘Microsoft’, ‘New York’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5002, ‘IBM’, ‘Chicago’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5003, ‘Red Hat’, ‘Detroit’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5005, ‘NVIDIA’, ‘LA’);
CREATE TABLE customers
( customer_id number(10) not null,
customer_name varchar2(50) not null,
city varchar2(50),
CONSTRAINT customers_pk PRIMARY KEY (customer_id)
);
INSERT INTO customers (customer_id, customer_name, city)
VALUES (7001, ‘Microsoft’, ‘San Francisco’);
INSERT INTO customers (customer_id, customer_name, city)
VALUES (7002, ‘IBM’, ‘Toronto’);
INSERT INTO customers (customer_id, customer_name, city)
VALUES (7003, ‘Red Hat’, ‘Newark’);
1 |
CREATETABLEsuppliers supplier_namevarchar2(50)notnull, cityvarchar2(50), CONSTRAINTsuppliers_pkPRIMARYKEY(supplier_id) INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5001,’Microsoft’,’New York’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5002,’IBM’,’Chicago’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5003,’Red Hat’,’Detroit’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5005,’NVIDIA’,’LA’); CREATETABLEcustomers customer_namevarchar2(50)notnull, cityvarchar2(50), CONSTRAINTcustomers_pkPRIMARYKEY(customer_id) INSERTINTOcustomers(customer_id,customer_name,city) VALUES(7001,’Microsoft’,’San Francisco’); INSERTINTOcustomers(customer_id,customer_name,city) VALUES(7002,’IBM’,’Toronto’); INSERTINTOcustomers(customer_id,customer_name,city) VALUES(7003,’Red Hat’,’Newark’); |
Решение для практического упражнения № 2:
Следующий оператор UPDATE будет выполнять это обновление в Oracle.
Oracle PL/SQL
UPDATE suppliers
SET city = (SELECT customers.city
FROM customers
WHERE customers.customer_name = suppliers.supplier_name)
WHERE EXISTS (SELECT customers.city
FROM customers
WHERE customers.customer_name = suppliers.supplier_name);
1 |
UPDATEsuppliers SETcity=(SELECTcustomers.city FROMcustomers WHEREcustomers.customer_name=suppliers.supplier_name) WHEREEXISTS(SELECTcustomers.city FROMcustomers WHEREcustomers.customer_name=suppliers.supplier_name); |
Таблица suppliers будет выглядеть следующим образом:
SUPPLIER_ID | SUPPLIER_NAME | CITY |
---|---|---|
5001 | Microsoft | San Francisco |
5002 | IBM | Toronto |
5003 | Red Hat | Newark |
5004 | NVIDIA | LA |
Обновление значения столбца с выражением
При присвоении значения в столбце после SET, вы не всегда должны указывать статические значения. Вы также можете использовать выражения, как показано ниже.
Ниже приводится очень простое выражение, где оно увеличивает значение заработной платы на 500 для всех сотрудников отдела IT.
mysql> UPDATE worker SET salary=salary+500 WHERE dept='IT'; Query OK, 3 rows affected (0.01 sec) Rows matched: 4 Changed: 3 Warnings: 0
Были только 4 записи, которые соответствовали условию выше. Но только три записи были обновлены, как показано ниже, в качестве одного из записей сотрудников, который принадлежит к техническому отделу, имел нулевое значение в поле заработной платы. Таким образом, зарплата выше + 500 выражение по прежнему NULL, и не обновляется эта конкретную запись.
mysql> SELECT * FROM worker; +-----+--------+------------+--------+ | id | name | dept | salary | +-----+--------+------------+--------+ | 100 | Andrey | IT | 5500 | | 200 | Anton | IT | 6000 | | 300 | Maxim | Marketing | 7000 | | 400 | Dimon | Marketing | 9500 | | 500 | Anton | IT | 6500 | | 501 | Anna | IT | NULL | +-----+--------+------------+--------+
SQL Учебник
SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии
10 ответов
Лучший ответ
Это сообщение означает, что вы пытаетесь сравнить число и строку в предложении или . В вашем запросе единственное возможное место, где это могло произойти, — ; либо убедитесь, что у них есть похожие объявления, либо используйте явный для преобразования числа в строку.
Если выключить режим , ошибка должна превратиться в предупреждение.
173
Barmar
17 Апр 2013 в 20:16
Если у вас нет поля или данных с двойным значением, возможно, вам стоит попробовать отключить строгий режим sql.
Для этого вам нужно отредактировать файл « my.ini », расположенный в папке установки MySQL, найти строку «Установить строгий режим SQL» и изменить следующую строку:
К этому, удалив «STRICT_TRANS_TABLES»
После этого вам необходимо перезапустить службу MySQL , чтобы изменения вступили в силу.
Чтобы проверить изменение, откройте редактор и выполните это предложение sql:
Очень важно : будьте осторожны с форматом файла после сохранения. Сохраните его как «UTF8», а не как «TFT8 с спецификацией», потому что служба не будет перезапущена
Marc
25 Июн 2020 в 19:31
Если вы использовали ПРОВЕРИТЬ ОГРАНИЧЕНИЕ в таблице для длины строкового поля
Например: чтобы проверить длину имени пользователя> = 8
Использование:
Вместо того
Исправьте ограничение проверки, если какое-либо из них имеет неправильное сравнение типов данных
Varadhan Work
4 Фев 2020 в 08:05
Возникла эта проблема с ES6 и TypeORM при попытке передать , где была строкой чисел, разделенных запятыми. Когда я преобразовал в шаблонный литерал, проблема была решена.
mdawsondev
6 Сен 2019 в 15:27
В моем случае это была вставка представления (с высокой степенью вложенности, представления в представлении), вызывающая ошибку в mysql-5.6:
В итоге мы решили имитировать материализованное представление (которое на самом деле представляет собой таблицу) и периодически вставлять / обновлять его с помощью хранимых процедур.
Nae
4 Фев 2019 в 15:24
Когда я получил эту ошибку, я считаю, что это ошибка, однако вы должны иметь в виду, что если вы выполните отдельный запрос с оператором SELECT и тем же предложением WHERE, вы можете получить первичный идентификатор из этого SELECT: ) и вставьте их в неудавшийся запрос UPDATE с условиями -> «WHERE IN ([список разделенных запятыми первичных идентификаторов из оператора SELECT)», что позволяет устранить любые проблемы, вызванные исходным (неудачным ) предложение WHERE запроса.
Лично для меня, когда я использовал кавычки для значений в «WHERE ____ IN ()», затрагивались только 10 из 300 ожидаемых записей, что, на мой взгляд, кажется ошибкой.
1
Kylan Hurt
4 Апр 2016 в 16:42
Я видел пару случаев, когда возникает эта ошибка:
1. использование оператора не равно в предложении со списком нескольких значений
Такие как:
Это можно решить, используя
2. отсутствует оператор сравнения в функции :
Чтобы выбрать значение в , если оно существует, и в противном случае показать значение в … это вызывает ошибку; это можно решить, используя:
2
enharmonic
5 Ноя 2020 в 02:44
TL; DR
Это также может быть вызвано применением к строковым столбцам / литералам.
Полная версия
У меня такое же сообщение об ошибке для простого оператора , связанного с представлением:
Хотя все исходные и целевые столбцы были типа . После некоторой отладки я нашел основную причину; представление содержало этот фрагмент:
Который предположительно был результатом автоматического преобразования следующего фрагмента из Oracle:
( — это конкатенация строк в Oracle). Решение заключалось в использовании
Вместо.
4
Frank Schmitt
22 Янв 2018 в 14:11
Я столкнулся с той же проблемой. Попытка сравнить столбец varchar (100) с числовым 1. Приведена ошибка 1292. Исправлено добавлением одинарных кавычек вокруг 1 (‘1’).
Спасибо за объяснение выше
10
ForeverLearner
14 Янв 2015 в 09:48
Я исправил эту ошибку, поскольку в запросе была синтаксическая ошибка или некоторые нежелательные символы, но MySQL не смог ее отловить. Я использовал между несколькими полями во время обновления, например
Проблема в приведенном выше запросе может быть решена заменой запятой ()
26
Nae
6 Сен 2018 в 13:34
Практическое упражнение № 1:
На основании таблицы suppliers заполненной следующими данными, обновите city на ‘Denver’ для всех записей, чьё supplier_name является ‘INTEL’.
Oracle PL/SQL
CREATE TABLE suppliers
( supplier_id number(10) not null,
supplier_name varchar2(50) not null,
city varchar2(50),
CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)
);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5001, ‘Microsoft’, ‘Chicago’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5002, ‘INTEL’, ‘Chicago’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5003, ‘Red Hat’, ‘Detroit’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5004, ‘NVIDIA’, ‘New York’);
1 |
CREATETABLEsuppliers supplier_namevarchar2(50)notnull, cityvarchar2(50), CONSTRAINTsuppliers_pkPRIMARYKEY(supplier_id) INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5001,’Microsoft’,’Chicago’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5002,’INTEL’,’Chicago’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5003,’Red Hat’,’Detroit’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5004,’NVIDIA’,’New York’); |
Решение для практического упражнения № 1:
Следующий оператор UPDATE будет выполнять это обновление в Oracle.
Oracle PL/SQL
UPDATE suppliers
SET city = ‘Denver’
WHERE supplier_name = ‘INTEL’;
1 |
UPDATEsuppliers SETcity=’Denver’ WHEREsupplier_name=’INTEL’; |
Таблица suppliers будет выглядеть следующим образом:
SUPPLIER_ID | SUPPLIER_NAME | CITY |
---|---|---|
5001 | Microsoft | Chicago |
5002 | INTEL | Denver |
5003 | Red Hat | Detroit |
5004 | NVIDIA | New York |