C, PHP, VB, .NET

Дневникът на Филип Петров


* Заявки Update

Публикувано на 30 март 2009 в раздел Бази от Данни.

Заявките от тип UPDATE се използват за обновяване на данни. Базовият синтаксис е:

UPDATE <име на таблица>
SET <правило за обновяване>
WHERE <условие>;

От примера с базата данни „banks“ можем да направим следните задачи:

1. Добавя по 2% лихва на всички акаунти от тип 1:

UPDATE accounts
SET amount = amount + amount*2/100
WHERE type = 1;

2. Дава по 20 лева бонус на клиентите с име ‘Ivan Ivanov’:

UPDATE accounts
SET amount = amount + 20
WHERE customer_id IN(
   SELECT id
   FROM customers
   WHERE name = 'Ivan Ivanov'
);

3. Дава по 10 лева бонус на всички клиенти, чийто мениджър на акаунт е ‘John Smith’:

UPDATE accounts
SET amount = amount + 10
WHERE customer_id IN(
   SELECT id
   FROM customers
   WHERE bank_mgr = (
      SELECT id
      FROM employees
      WHERE name = 'John Smith'
   )
);

4. Променя адреса на клона на банка Societe General в град Paris:

UPDATE branches
SET address = '17 cours Valmy'
WHERE name = 'Paris' AND bank_code = (
   SELECT code
   FROM banks
   WHERE name = 'Societe General'
);

5. Можем да обновяваме информация и от две таблици. Следната заявка ще даде два лева на клиент с id 2, като същевременно ще въведе и неговия адрес:

UPDATE customers JOIN accounts
   ON customers.id = accounts.customer_id
SET accounts.amount = accounts.amount + 2, address = 'Opalchenska 12'
WHERE customers.id = 2;

Ясно е, че при по-свободни таблици имаме и гъвкави възможности чрез използването на LEFT и RIGHT JOIN.

 



6 коментара


  1. RealIam каза:

    Според мен име грешка в заявка 1.
    По този начин не се добавя 2% лихва към акаунтите, а просто сумата в техните сметки става 2% от това, което са имали. За да добавим 2% би трябвало да изглежда така:

    UPDATE accounts
    SET amount=amount + amount*2/100
    WHERE type=1;

  2. Ясен каза:

    5. Можем да обновяваме информация и от две таблици. Следната заявка ще даде два лева на клиент с id 2, като същевременно ще въведе и неговия адрес:

    UPDATE customers JOIN accounts
    ON customers.id = accounts.id <–––-|
    SET accounts.amount = accounts.amount + 2, | address = ‘Opalchenska 12’ |
    WHERE customers.id = 2; |––––|
    |
    ON customers.id=accounts.customer_id, ina4e ne bi dobavilo +2 kum amount-a na klienta s id 2 ,a prosto na 4oveka zapisan pod id 2 v tablica accounts, koito moje da e nqkoi dr primerno,nali taka?!

  3. Ясен и RealIam – забележките ви са напълно уместни и сега ще поправя кода :)

  4. Ivo каза:

    Заявката от пример 2 (а също и тези от примери 3 и 5) дава 20 лева към всяка една от сметките на дадените клиенти – т.е. ако вместо Ivan Ivanov беше George Lucas, той щеше да вземе 60 лева, защото има 3 сметки. Как може да се направи така, че тези 20 лева да се дават само веднъж?

  5. В WHERE частта на заявката трябва да се каже точно на кое account.id да се дадат.

  6. Ivo каза:

    Питах, защото може да има няколко клиента с еднакво име, но явно тогава просто ще трябва да се изброяват id-тата на сметките. Няма по-„елегантен“ начин :D

Добави коментар

Адресът на електронната поща няма да се публикува


*