Зміст
У цій статті ми розглянемо оператор SQL UPDATE
і покажемо, як його застосовувати. Також подивимося на деякі відмінності у синтаксисі цього оператора в різних версіях SQL різних систем керування реляційними базами даних (СКРБД).
Більше про роботу з SQL для аналітики даних можна дізнатися на курсі Junior Data Analyst від robot_dreams.
Оператор UPDATE
— один з основних операторів мови керування даними DMLSELECT
, DELETE
та INSERT
.
Оператор UPDATE
використовується для зміни рядків у таблиці бази даних. За допомогою цього оператора можна змінювати дані в одному або кількох стовпцях і обирати для цього:
Оператор може бути корисним для таких бізнес-завдань, як-от оновлення статусу замовлення, змінення етапу доставки чи адреси клієнта, збільшення заробітної плати працівника тощо.
Базовий синтаксис оператора UPDATE
з використанням оператора умови WHERE
такий:
UPDATE таблиця SET стовпець1 = значення1, стовпець2 = значення2, ... стовпецьN = значенняN [WHERE умова];
Щоб використовувати оператор UPDATE
, потрібно вказати для нього такі параметри:
таблиця
— ім’я таблиці, у якій потрібно змінити дані;стовпець1
… стовпецьN
— імена стовпців, у яких потрібно змінити значення;значення1
… значенняN
— значення, які слід вставити замість попередніх значень у вказані стовпці.Також після WHERE
можна записати умову для вибору рядків. Якщо WHERE
не використовувати, буде оновлено усі рядки таблиці.
Розробники СКБД створюють власні діалекти SQL, які розширюють стандартний SQL і дещо відрізняються як від нього, так й один від одного.
Наприклад, щоб обмежити кількість рядків, які потрібно змінити, певним числом або відсотком, в T-SQL у операторі UPDATE
використовується оператор TOP
, в MySQL — LIMIT
, в Oracle та PostgreSQL — FETCH
(див. Приклад 4 у кінці статті).
Відмінностей в діалектах SQL насправді набагато більше. Щоб вивчити їх досконало, приходьте на курс Junior Data Analyst від robot_dreams. Новий набір стартує вже 27 березня.
Розглянемо синтаксис UPDATE
детальніше в таких діалектах SQL:
Transact-SQL (T-SQL) є пропрієтарним
Нижче наведено синтаксис UPDATE
, який використовується в T-SQL:
-- Syntax for SQL Server and Azure SQL Database [ WITH <common_table_expression> [...n] ] UPDATE [ TOP ( expression ) [ PERCENT ] ] { { table_alias | <object> | rowset_function_limited [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] } | @table_variable } SET { column_name = { expression | DEFAULT | NULL } | { udt_column_name.{ { property_name = expression | field_name = expression } | method_name ( argument [ ,...n ] ) } } | column_name { .WRITE ( expression , @Offset , @Length ) } | @variable = expression | @variable = column = expression | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression } [ ,...n ] [ <OUTPUT Clause> ] [ FROM{ <table_source> } [ ,...n ] ] [ WHERE { <search_condition> | { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ] [ OPTION ( <query_hint> [ ,...n ] ) ] [ ; ] <object> ::= { [ server_name . database_name . schema_name . | database_name .[ schema_name ] . | schema_name . ] table_or_view_name}
UPDATE
, який використовується в MySQL. Синтаксис для однієї таблиці:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET assignment_list [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] value: {expr | DEFAULT} assignment: col_name = value assignment_list: assignment [, assignment]
Синтаксис для кількох таблиць:
UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition]
UPDATE
, який використовується в PostgreSQL:
[ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] SET { column_name = { expression | DEFAULT } | (column_name [, ...]) = [ROW] ({expression | DEFAULT} [, ...]) | ( column_name [, ...] ) = ( sub-SELECT ) } [, ...] [ FROM from_item [, ...] ] [ WHERE condition | WHERE CURRENT OF cursor_name] [RETURNING* | output_expression [ [ AS ] output_name ] [, ...] ]
UPDATE
(схему того, як працюють запити), який використовується в Oracle Database:
Візьмемо за приклад таблицю з рейтингом СКБД з оцінки PYPLdb_ranking
:
Rank | RDBMS | DBShare | Trend |
1 | Oracle | 26.79 | -3.7 |
2 | MySQL | 19.24 | 2.7 |
3 | SQL Server | 12.21 | -1.3 |
4 | PostgreSQL | 6.48 | 1.6 |
5 | Microsoft Access | 6.42 | -1.7 |
Для роботи з прикладами можна використовувати ресурс SQL Fiddle. На ньому представлено всі СКРБД, які зазначено вище. Обрати потрібну СКРБД можна в випадному списку праворуч від логотипу SQL Fiddle.
Для створення таблиці та наповнення її вихідними значеннями використовуємо такий код:
CREATE TABLE db_ranking ( Rank int, RDBMS varchar(255), DBShare float, Trend float ); INSERT INTO db_ranking VALUES (1, 'Oracle', 26.79, -3.7); INSERT INTO db_ranking VALUES (2, 'MySQL', 19.24, 2.7); INSERT INTO db_ranking VALUES (3, 'SQL Server', 12.21, -1.3); INSERT INTO db_ranking VALUES (4, 'PostgreSQL', 6.48, 1.6); INSERT INTO db_ranking VALUES (5, 'Microsoft Access', 6.42, -1.7);
Введіть цей запит у лівій панелі (Schema Panel) і натисніть кнопку Build Schema.
У правій панелі введіть наступний код для зміни запису та його подальшого перегляду:
UPDATE db_ranking SET DBShare = 30.49 WHERE RDBMS = 'Oracle'; SELECT * FROM db_ranking WHERE RDBMS = 'Oracle';
Результат виконання запиту:
Rank | RDBMS | DBShare | Trend |
1 | Oracle | 30.49 | -3.7 |
Це завдання можна виконати в два способи — (1) з використанням оператора AND
або (2) з використанням оператора OR
— залежно від того, як ми розуміємо умови і який результат хочемо отримати.
Щоб використовувати оператор AND
для цієї задачі, спочатку ми обнулимо значення Trend
для всіх рядків таблиці, де це значення менше за нуль, а значення DBShare
більше за 10. Потім переглянемо всі рядки таблиці.
Зверніть увагу: навіть якщо ви змінюєте запит у правій панелі SQL Fiddle, запит на створення таблиці буде виконано знову, тобто, дії буде виконано над вихідною таблицею.
UPDATE db_ranking SET DBShare = 30.49 WHERE RDBMS = 'Oracle'; SELECT * FROM db_ranking WHERE RDBMS = 'Oracle';
Результат:
Rank | RDBMS | DBShare | Trend |
1 | Oracle | 26.79 | 0 |
2 | MySQL | 19.24 | 2.7 |
3 | SQL Server | 12.21 | 0 |
4 | PostgreSQL | 6.48 | 1.6 |
5 | Microsoft Access | 6.42 | -1.7 |
Якщо ми хочемо використовувати замість AND
оператор OR
, нам потрібно відібрати для зміни ті рядки вихідної таблиці, в яких Trend
менше за нуль, або DBShare
більше за 10. Запит матиме такий вигляд:
UPDATE db_ranking SET Trend = 0 WHERE Trend < 0 AND DBShare > 10; SELECT * FROM db_ranking;
Результат:
Rank | RDBMS | DBShare | Trend |
1 | Oracle | 26.79 | 0 |
2 | MySQL | 19.24 | 0 |
3 | SQL Server | 12.21 | 0 |
4 | PostgreSQL | 6.48 | 1.6 |
5 | Microsoft Access | 6.42 | 0 |
Дізнайтеся, який оператор SQL підходить краще за все для виконання вашого таску — приходьте на курс з аналітики даних від robot_dreams.
Пишемо простий запит на змінення даних, але, щоб його було застосовано до всіх рядків таблиці, не використовуємо оператор WHERE
:
UPDATE db_ranking SET DBShare = 0; Trend = 0; SELECT * FROM db_ranking;
Результат:
Rank | RDBMS | DBShare | Trend |
1 | Oracle | 0 | 0 |
2 | MySQL | 0 | 0 |
3 | SQL Server | 0 | 0 |
4 | PostgreSQL | 0 | 0 |
5 | Microsoft Access | 0 | 0 |
Для роботи з T-SQL виберіть MS SQL Server у списку праворуч від логотипу.
Запит TOP(n)
оператора UPDATE
дозволяє вибрати з таблиці n
рядків у довільному порядку. Приклад:
UPDATE TOP(10) employees SET vacation_hours = vac ation_hours * 1.25;
Також можна відібрати певний відсоток рядків. Це робиться за допомогою аргументу PERCENT
:
UPDATE TOP(10) PERCENT employees SET vacation_hours = vacation_hours * 1.25;
До нашої таблиці можна надіслати, наприклад, такий запит на обнулення рейтингу у трьох рядках у довільному порядку:
UPDATE TOP(3) db_ranking SET Rank = 0;
Ось що можемо отримати в результаті запиту:
У MySQL для обмеження кількості рядків використовується оператор LIMIT
. Код для MySQL матиме такий вигляд (у SQL Fiddle його необхідно ввести в лівій панелі після операторів INSERT
):
UPDATE db_ranking SET Rank = 0LIMIT 3;
У PostgreSQL і Oracle Database використовується оператор FETCH
із запитом SELECT
:
UPDATE db_ranking SET Rank = 0 WHERE RDBMS IN (SELECT RDBMS FROM db_ranking FETCH FIRST 3 ROWS ONLY);
Ми розглянули базові приклади застосування оператора SQL UPDATE
.
Оператор UPDATE
дозволяє змінювати значення в комірках таблиці з зазначенням стовпців та рядків, у які буде внесено зміни. Базовий синтаксис цього оператора в різних діалектах SQL загалом схожий, але є й відмінності, характерні для окремих СКРБД.
Детальну інформацію про особливості використання оператора UPDATE
у розширеннях SQL, які згадано в цій статті, ви можете знайти в посібниках із Transact-SQL, MySQL, PostgreSQL та Oracle Database.
UPDATE
:
А якщо хочете вивчити SQL глибше і під наглядом досвідчених менторів, завітайте до robot_dreams. На їхньому курсі ви зможете опанувати професію Junior Data Analyst за 16 тижнів.
32-річний розробник безпеки інформаційних систем Агентства національної безпеки Джарех Себастьян Далке отримав 22 роки в'язниці…
Українська компанія Flytech представила розвідувальний безпілотний літальний апарат ARES. Основні його переваги — недорога ціна…
MC.today разом з Асоціацією IT Ukraine і сервісом моніторингу та аналітики згадок у ЗМІ та…
Україна не буде примусово повертати чоловіків призовного віку з-за кордону. Про це повідомила у Брюсселі…
В Збройних Силах України з'явився жіночий підрозділ з БПЛА. І вже проводиться конкурсний відбір до…
GitHub анонсував Copilot Workspace, середовище розробки з використанням «агентів на базі Copilot». За задумкою, вони…