Заява про оновлення SQL - Приклади запитів для оновлення значень таблиці

SQL (вимовляється Seequel) розшифровується як мова структурованих запитів. Це сильно набрана статична (типи перевіряються до виконання) мова запитів, яка вперше з’явилася в 1974 році (woah, 46 років!), Але спочатку була випущена лише в 1986 році.  

Можливо, ви думаєте собі, що за таким «старим» інструментом стоять найкращі дні, але ви були б далеко не правильними. У 2019 році за допомогою опитування Scale Grid DeveloperWeek SQL використовували 60,5% респондентів, тоді як NoSQL використовували лише 39,5% респондентів.

Щоб бути зрозумілим, категорія SQL була розбита на кілька підкатегорій, що включали MySQL, PostgreSQL, SQL Server тощо, тоді як категорія NoSQL була розбита на підкатегорії, що містили MongoDB, Cassandra тощо.

Навіть у 2017 році, згідно з опитуванням розробника стека, другою за популярністю мовою був SQL (безпосередньо за JavaScript), 50% з 64 000 респондентів заявили, що вони все ще використовують SQL у певній формі.

Його популярність, принаймні частково, пов’язана з простотою мови, тим, що вона була побудована з урахуванням реляційних даних, і тому, що вона зарекомендувала себе як надійну для пошуку, об’єднання та фільтрації даних.

Достатньо сказати, що SQL не тільки живий і норовитий, але і процвітає серед сучасного співтовариства розробників.

А тепер подивимось чому!

Веселі частини

SQL Server - найкращий аромат SQL, який я використовую у своїй щоденній роботі, тому приклади нижче відповідають цим стандартам.  

Одне, що я багато в чому роблю - це оновлення декількох записів у таблиці. Тепер я міг робити це по одному запису, але SQL надає нам можливість оновлювати декілька (тисячі на тисячі, якщо потрібно) записів одночасно за допомогою UPDATEоператора.

Оператор UPDATEможе бути використаний для оновлення одного стовпця, більшого набору записів (за допомогою умов) та / або всієї таблиці в базі даних. Умовою (умовами) можуть бути логічні значення, перевірка рядків або математична послідовність, яка перетворюється на логічну (більшу, меншу, ніж тощо).

Хоча він може дещо відрізнятися від смаку до смаку, загальний синтаксис такий:

UPDATEtable-name

SETcolumn-name = value[, column-name=value]

[WHEREcondition]

Дужки ([]) вище позначають необов’язкові доповнення до запиту.  

*** Дуже важливо відзначити, що без WHEREумови ВСІ записи в таблиці будуть оновлені, як тільки ви виконаєте запит. ***

Приклади запитів

Як наш набір даних я буду використовувати цю таблицю з назвою Work_Tickets :

SalesOrderNumWorkTicketNumCustomer_CodeCustomer_ContactUnitCostВиставляється рахунокParentLineKeyКількість_замовленаКількість_Поставлено
000613560009311250[email protected]0,00помилковий07977712,00
000613570009321251[email protected]0,00помилковий085695196,50
000613580009331252[email protected]0,00помилковий08556917.50

Простий запит без умов

Ось дуже простий запит оновлення, який змінить усі UnitCostполя на число 131.6152:

UPDATE Work_Tickets

SET UnitCost = 131.6152

Зверніть увагу, що WHEREречення відсутнє , тому кожен рядок у таблиці буде оновлено, і наш набір даних тепер виглядатиме так:

SalesOrderNumWorkTicketNumCustomer_CodeCustomer_ContactUnitCostВиставляється рахунокParentLineKeyКількість_замовленаКількість_Поставлено
000613560009311250[email protected]131,6152помилковий07977712,00
000613570009321251[email protected]131,6152помилковий085695196,50
000613580009331252[email protected]131,6152помилковий08556917.50

Прості запити з умовою

Ось простий запит з одним твердженням умови:

UPDATE Work_Tickets

SET Billed = true

WHERE UnitCost 0.00

Цей запит оновить Billedполе, щоб воно було істинним у кожному рядку, який відповідає умові, що UnitCostне дорівнює 0. Після того, як ми виконаємо наш запит, набір даних буде виглядати так:

SalesOrderNumWorkTicketNumCustomer_CodeCustomer_ContactUnitCostВиставляється рахунокParentLineKeyКількість_замовленаКількість_Поставлено
000613560009311250[email protected]131,6152Правда07977712,00
000613570009321251[email protected]131,6152Правда085695196,50
000613580009331252[email protected]131,6152Правда08556917.50

Нижче наведено запит, де ми міняємо на ParentLineKeyрядок, 000134де SalesOrderNumі WorkTicketNumобидва відповідають заданим рядкам.

UPDATE Work_Tickets

SET ParentLineKey = 000134

WHERE SalesOrderNum = 00061358 and WorkTicketNumber = 000933

Отже, 085569 у ParentLineKeyполі буде замінено на, 000134і наш набір даних тепер виглядає так:

SalesOrderNumWorkTicketNumCustomer_CodeCustomer_ContactUnitCostВиставляється рахунокParentLineKeyКількість_замовленаКількість_Поставлено
000613560009311250[email protected]131,6152Правда07977712,00
000613570009321251[email protected]131,6152Правда085695196,50
000613580009331252[email protected]131,6152Правда00013417.50

Оновлення кількох полів

Скажімо, у вас є набагато більший набір даних, ніж той, який ми використовуємо зараз, і вам потрібно оновити кілька полів.  

Було б нудно і очманіло, оновлювати їх різними заявами про оновлення. На щастя для нас, можна також оновити кілька полів одночасно за допомогою оператора оновлення, якщо ми відокремлюємо імена стовпців комою:

UPDATE Work_Tickets

SET UnitCost = 129.8511, Qty_Ordered = 72, Qty_Shipped = 72

WHERE SalesOrderNum = 00061358

І ось результат із оновленими полями після запуску запиту:

SalesOrderNumWorkTicketNumCustomer_CodeCustomer_ContactUnitCostВиставляється рахунокParentLineKeyКількість_замовленаКількість_Поставлено
000613560009311250[email protected]131,6152Правда07977712,00
000613570009321251[email protected]131,6152Правда085695196,50
000613580009331252[email protected]129,8511Правда0001347272

Використання оновлення в підзапиті

The above examples are perfect if you are working with one data source. However, most of your data will not be stored in a single table. That's where using UPDATE with multiple data sources comes in handy.

The syntax for updating a column/table changes a little if we want to bring in data from another table:

UPDATEtable-name

SETcolumn-name = (SELECT column name(s)

FROM table2-name

WHERE condition(s))

[WHEREcondition]

And here are the two tables we'll be using for this query - the Work_Tickets table:

SalesOrderNumWorkTicketNumCustomer_CodeCustomer_ContactUnitCostBilledParentLineKeyQty_OrderedQty_Shipped
000613560009311250[email protected]131.6152True07977712.00
000613570009321251[email protected]131.6152True085695196.50
000613580009331252[email protected]129.8511True0001347272

and the Customer_Info table :

NameIndustryCodeAddressCityDiscountPhoneNumberEmail
Wayne EnterprisesDefense,weaponry,aerospace,enginerringNULL1631 Dark Knight WayGotham19.755556614000[email protected]
Stark IndustriesDefense,weaponry,protection12515641 Iron DrUndisclosed19.739993126156[email protected]
Acme CorpComedy,laughter,animation125224569 Smiling StToon Town17.533216549877[email protected]

The UPDATE statement with a subquery looks like this:

UPDATE Customer_Info

SET Code = (SELECT Customer_Code

FROM Work_Tickets

WHERE Work_Tickets.Customer_Contact = Customer_Info.Email)

FROM Work_Tickets

WHERE Code IS NULL

This example will update the Code field on the Customer_Info table where the email address match from both tables. And this is what our Customer_Info table looks like now:

NameIndustryCodeAddressCityDiscountPhoneNumberEmail
Wayne EnterprisesDefense,weaponry,aerospace,enginerring12501631 Dark Knight WayGotham19.755556614000[email protected]
Stark IndustriesDefense,weaponry,protection12515641 Iron DrUndisclosed19.739993126156[email protected]
Acme CorpComedy,laughter,animation125224569 Smiling StToon Town17.533216549877[email protected]

Wrapping up

I hope this article has been helpful to you in understanding how the UPDATE statement works in SQL.

You're now ready to write your own SQL UPDATE statements like a champ! After you do, I'd love for you to share them with me on social media!

Don't forget to check out my blog where I frequently post articles about web development.

While you're there why not sign up for my newsletter? You can do that at the top right of the main blog page. I like to send out interesting articles (mine and others), resources, and tools for  developers every now and then.

If you have questions about this article or just in general my DMs are open – come say hi on Twitter or any of my other social media accounts which you can find below the newsletter sign up on the main page of my blog or on my profile here at fCC :)

Have an awesome day and happy coding, friend!