W bazie danych sklepu istnieje tabela artykuly zawierająca pole o nazwie nowy. Aby pole to wypełnić wartościami TRUE dla każdego rekordu, należy zastosować kwerendę
A.
UPDATE nowy FROM artykuly VALUE TRUE;
B.
UPDATE artykuly SET nowy=TRUE;
C.
INSERT INTO nowy FROM artykuly SET TRUE;
D.
INSERT INTO artykuly VALUE nowy=TRUE;
Pytanie z egzaminu CKE, styczeń 2016 (arkusz E.14-X-16.01).
Ta kwerenda jest właściwa, bo używa instrukcji UPDATE, czyli polecenia SQL przeznaczonego do modyfikowania danych już istniejących w tabeli. Składnia UPDATE artykuly SET nowy=TRUE; oznacza: weź tabelę artykuly i ustaw w kolumnie nowy wartość TRUE. Ponieważ nie ma tutaj klauzuli WHERE, zmiana obejmie każdy rekord w tabeli. W tym zadaniu właśnie o to chodzi: pole nowy ma zostać wypełnione wartością logiczną TRUE dla wszystkich artykułów. Moim zdaniem to dobry przykład, bo pokazuje bardzo praktyczne użycie SQL-a w sklepie internetowym, np. gdy po imporcie towarów chcemy oznaczyć całą dostawę jako nowość. W standardowej praktyce przed takim zapytaniem warto jednak upewnić się, że naprawdę chcemy zmienić wszystkie wiersze, bo brak WHERE jest mocny i czasem niebezpieczny. W systemach produkcyjnych często wykonuje się najpierw SELECT, kopię zapasową albo transakcję, np. START TRANSACTION, potem UPDATE, a dopiero po sprawdzeniu COMMIT. Sama forma SET kolumna = wartość jest podstawową i poprawną konstrukcją dla aktualizacji pól w rekordach.
W tym pytaniu łatwo pomylić dwie zupełnie różne operacje SQL: aktualizowanie istniejących danych i wstawianie nowych rekordów. Jeżeli tabela artykuly już istnieje i ma kolumnę nowy, a naszym celem jest zmiana wartości tej kolumny w zapisanych wcześniej wierszach, potrzebna jest instrukcja UPDATE. Polecenie INSERT INTO służy do dodawania nowych rekordów do tabeli, a nie do masowego ustawiania wartości w istniejącej kolumnie. To jest częsty błąd początkujących: skoro chcemy gdzieś wpisać wartość TRUE, wydaje się, że trzeba użyć INSERT, ale w SQL oznacza to coś innego. Równie ważne jest rozróżnienie nazwy tabeli od nazwy kolumny. W tym zadaniu artykuly to tabela, a nowy to pole, więc nie aktualizuje się tabeli o nazwie nowy. Konstrukcje typu UPDATE nowy FROM artykuly VALUE TRUE mieszają elementy składni z różnych kontekstów i nie pasują do standardowej składni prostej aktualizacji. Słowo VALUE albo VALUES występuje typowo przy INSERT, gdzie podaje się wartości dla nowego wiersza, często wraz z listą kolumn. Z kolei SET należy do UPDATE i określa, która kolumna dostaje jaką wartość. Poprawny schemat myślenia jest taki: chcę zmienić dane, które już są w tabeli, więc wybieram UPDATE; wskazuję tabelę po UPDATE; po SET podaję kolumnę i nową wartość. Brak WHERE oznacza aktualizację wszystkich rekordów, co w tym konkretnym zadaniu jest celowe, ale w normalnej pracy trzeba z tym uważać, bo można sobie narobić bałaganu w bazie.