* Заявки 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.
Според мен име грешка в заявка 1.
По този начин не се добавя 2% лихва към акаунтите, а просто сумата в техните сметки става 2% от това, което са имали. За да добавим 2% би трябвало да изглежда така:
UPDATE accounts
SET amount=amount + amount*2/100
WHERE type=1;
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?!
Ясен и RealIam - забележките ви са напълно уместни и сега ще поправя кода :)
Заявката от пример 2 (а също и тези от примери 3 и 5) дава 20 лева към всяка една от сметките на дадените клиенти - т.е. ако вместо Ivan Ivanov беше George Lucas, той щеше да вземе 60 лева, защото има 3 сметки. Как може да се направи така, че тези 20 лева да се дават само веднъж?
В WHERE частта на заявката трябва да се каже точно на кое account.id да се дадат.
Питах, защото може да има няколко клиента с еднакво име, но явно тогава просто ще трябва да се изброяват id-тата на сметките. Няма по-"елегантен" начин :D