środa, 28 września 2016

MySQL PART IV: zapytania INSERT INTO oraz UPDATE



Hejo,

Pora pochłonąć kolejną dawkę przydatnej wiedzy!

Wcześniej poznaliśmy klauzulę wybierz z bazy, czyli zapytania wyszukujące proste oraz złożone:

SELECT FROM

Dzisiaj popracujemy z nową klauzulą, a mianowicie

INSERT INTO

czyli wstaw do bazy.

Podmianka starej wartości na nową będzie zaś obrazowana klauzulą

UPDATE

Zapytania INSERT używamy np. podczas rejestracji nowych użytkowników forum internetowego, sklepu internetowego, konta bankowego etc.

UPDATE używamy np. podczas edycji profilu danego użytkownika w danym serwisie internetowym :) Do dzieła!

########################

Jak napisać zapytanie, które zaktualizuje nazwisko jednej z klientek księgarni internetowej?

UPDATE klienci (nazwa naszej tabeli) SET (z ang. ustaw, btw. wiecie, że słowo "set" posiada 430 znaczeń? Słowo "set" to najdłuższy wpis w słowniku, złożony z 60.000 słów i jest to oficjalny rekord księgi Guinnessa w ilości znaczeń pojedyńczego słowa w j. angielskim) nazwisko="Psikuta" (tak, zmieniamy właśnie na to nazwisko) WHERE idklienta=4

Gotowy kod będzie wyglądać w taki sposób (pozwoliłem sobie też zmienić imię, bo czemu nie? przy okazji widzicie, że aktualizować można więcej niż jedno pole w jednej linii kodu):




I teraz uwaga! Pamiętajmy o klauzuli WHERE! Jeśli nie wyszczególnimy rekordu, możemy utracić nazwiska wszystkie w kolumnie! Nieważne ile rekordów będzie w kolumnie (może być ich nawet milion - w moment wszystkie pójdą w cholerę, jeśli nie określimy dokładnie, co chcemy zmienić). Wyobraź sobie, że usuwasz teraz milion maili miliona użytkowników, przez które logują się oni do Twojej bazy.. Czaisz te straty? WNIOSEK? Z ZAPYTANIAMI UPDATE NALEŻY UWAŻAĆ! No i robić dumpa bazy przed każdą operacją aktualizacji ; )

Okay, pora na proste zadanka z aktualizowania.

Zmieniamy id klienta nr. 3 na wartość 1:

UPDATE klienci SET idklienta=1 WHERE idklienta=3 (????????)

Prawda, że proste? Niestety, MySQL nie przepuści tych danych ponieważ właśnie chcieliśmy namieszać w tabeli, która jest PRIMARY KEYEM, z auto inkrementacją oraz niepowtarzającymi się rekordami (duplikatami wartości pól). Tabela utraciłaby spójność, gdybyśmy mieli dwa klucze z nr. 1 i sam ten fakt jest nielogiczny: )

Właśnie zapoznaliśmy się z mechanizmem ochrony klucza podstawowego : ) To zapytanie zadziałałoby tylko wtedy, gdyby w bazie nie znajdował się żaden rekord o ID klienta równym 1 : ) Tylko i tylko wtedy :) 

Kolejne polecenie:

Zwiększ cenę wszystkich książek znajdujących się w bazie o 10% : ) 

Lecimy z zadankiem:

UPDATE ksiazki SET cena=cena+cena*0,1

lub

UPDATE ksiazki SET cena=cena*1,1 

Należy jednak zwrócić uwagę na to, że nowo powstałe ceny będą posiadać trzy miejsca po przecinku, a przecież grosz wyrażamy jako 1/100, prawda? Na szczęście w MySQL jest odpowiednia komenda o nazwie

ROUND()

Bardzo podobna występuję również w PHP : ) Zatem:

UPDATE ksiazki SET cena=ROUND(cena*1.1) 

Taki zapis zaokrągli nam domyślnie do liczby całkowitej, a my przy walucie chcemy przecież mieć dwa miejsca po przecinku :) Zatem dodajemy do kodu jeszcze coś.

Składnia:

ROUND(co_zaokrąglamy, do_ilu_miejsc)

zatem:

UPDATE ksiazki SET cena=ROUND(cena*1.1,2) 

TADAM!~!

Kolejne zapytanie brzmi już ciężej: Mamy zmniejszyć cenę najdroższej książki o 10 zł : )

Logicznie zaczynamy od:

UPDATE ksiazki SET cena=cena-10 

i teraz dodajemy znaną nam już komendę, która wyszuka nam interesującą nas książkę:

UPDATE ksiazki SET cena=cena-10 ORDER BY cena DESC LIMIT 1 

Weź pod uwagę, że ograniczyliśmy się tylko do jednego wyboru (LIMIT 1), gdybyśmy wpisali tam 3 to wszystkie 3 najwyższe ceny poszłyby w dół, każda o 10 zł. Jeśli powtórzylibyśmy to pytanie ponownie to logicznie rzecz biorąc zmieni się już ceną innej książki, która pewnie będzie teraz najwyższa. Magia.



A teraz zmieńmy imię i nazwisko klientki Anny Kareniny (idklienta=10) na wartość: Joanna Dostojewska. Jedziemy z kodem:

UPDATE klienci SET imie="Joanna", nazwisko="Dostojewska" WHERE idklienta=10


Zmień status zamówień nr 4 i 5 na status "wyslano". No to jedziemy z tym koksem:

UPDATE zamowienia SET status="wyslano" WHERE idzamowienia="4" OR idzamowienia="5"

lub

UPDATE zamowienia SET status="wyslano" WHERE idzamowienia BETWEEN 4 AND 5

####################

Pora na INSERT INTO : )

W naszym serwisie rejestruje się nowy użytkownik. Co się musi stać z kodem, żeby jego dane były zapisane na serwerze?

Dodajemy klienta: Franciszek Janowski z Chorzowa

Zaczynamy:

INSTERT INTO (włóż do) klienci VALUES (wartości) (NULL*, "Franciszek", "Janowski", "Chorzów") - w nawiasie znajdują się kolejne wartości, jakie wpisze MySQL na podstawie naszego kodu do tabeli klienci. Ważnym i niezbędnym jest, aby dane były wypisane w odpowiedniej kolejności od lewej do prawej.

* - NULL oznacza wartość pustą. W tym przypadku dajemy wartość pustą, ponieważ pierwsza z kolumn o nazwie idklienta jest auto inkrementowana. Oznacza to, że nie musimy i wręcz nie powinniśmy ustalać ręcznie, jaki numer id ma dostać nowy klient. Silnik MySQL przypisze tą wartość automatycznie.

A teraz dodajemy do bazy nowe zamówienie:

Artur Rutkowski kupił książkę o nazwie "HTML5. Tworzenie witryn"

W tabeli klienci Rutkowski ma idklienta=7, w tabeli książki książka o nazwie "HTML5. Tworzenie witryn" ma idksiazki=3 : )

Zróbmy to jednak na odwrót, po hipstersku, w tej kolejności:

idzamowienia, data, status, idklienta, idksiazki

Tak,tylko po to, żeby pokazać, że jeśli się nam chce to możemy ręcznie ustawić wartości tak, by wkładać je nie od lewej do prawej, tylko np. od tyłu :)

INSTERT INTO zamowienia (idzamowienia, data, status, idklienta, idksiazki) ( tutaj właśnie podajemy kolejność z jaką będziemy wstawiać dane, oczywiście nazwy te muszą pokrywać się z nazwami kolumn w bazie) VALUES (NULL, - bo silnik MySQL sam przydzieli tą wartość na zasadzie autoinkrementacji, ,"2016-01-01", "oczekiwanie", 7, - bo Rutkowski ma takie ID w bazie, 3, - bo ta konkretna książka ma taki nr id w bazie)

Zapytanie bez mojego tłumaczenia wygląda tak:

INSERT INTO zamowienia (idzamowienia, data, status, idklienta, idksiazki) VALUES (NULL, "2016-01-01", "oczekiwanie", 7, 3)

Kolejne zapytanie to: Wstaw do bazy książkę o tytule: "Symfonia C++" autora o nazwisku "Grębosz" ale nie wstawiaj jeszcze imienia autora oraz ceny książki.

INSERT INTO ksiazki (idksiazki, nazwiskoautora, tytul) VALUES (NULL, "Grębosz", "Symfonia C++")




Jak widać język SQL jest elastyczny - możesz uzupełniać bazę o niepełne rekordy, możesz również zmieniać kolejność wstawianych danych.

Kolejne polecenie: Dodaj dwóch nowych klientów za pomocą JEDNEGO zapytania (zachowaj oryginalną kolejność kolumn oraz wstaw kompletny rekord):

INSERT INTO klienci VALUES (NULL, "Merlin", "Monroe", "Los Angeles"), (NULL, "John", "Wayne", "Los Angeles")

Tak, to wygląda tak prosto.. Używamy przecinka jako sygnalizującego maszynie o końcu wartości, bo przed klauzulą WHERE używamy przecinków, a tutaj na dobrą sprawę w ogóle jej nie ma : )

Ostatnie dzisiejsze zapytanie:

Wstaw nową osobę do bazy używając alternatywnego zapisu z klauzulą SET:

INSERT INTO klienci (początek bez zmian) SET idklienta=NULL, imie="Steve", nazwisko="McQueen", miejscowosc="Los Angeles" 

TADAM : ) Składnia równie skuteczna ale nieco mniej ładniejsza, niźli z klauzulą VALUES :) No i wolałbym kojarzyć SET tylko z klauzulą UPDATE'u. Co kto lubi : )

Dzięki! Jak zawsze polecam serdecznie lekcję Mirosława Zelenta:



F.

PS. Pod spodem zamieszczam jeszcze raz podsumowanie tego, co pisałem powyżej, wzięte bezpośrednio z lekcji Mirosława Zelenta :)



















1 komentarz:

  1. Wszystko zostało wyjaśnione w filmie na YT Mirosława Zelenta, nie widzę sensu opisywania tego ponownie w poście.

    OdpowiedzUsuń