Za pomocą którego polecenia SQL można usunąć z tabeli artykuly wiersze zawierające słowo „sto” znajdujące się w dowolnym miejscu pola tresc?
A.
DELETE FROM artykuly WHERE tresc LIKE "%sto%";
B.
DELETE FROM artykuly WHERE tresc = "%sto%";
C.
DELETE * FROM artykuly WHERE tresc LIKE "%sto%";
D.
DELETE * FROM artykuly WHERE tresc = "%sto%";
Pytanie z egzaminu CKE, styczeń 2021 (arkusz EE.09-SG-21.01).
Polecenie DELETE FROM artykuly WHERE tresc LIKE '%sto%'; usuwa z tabeli artykuly tylko te rekordy, w których kolumna tresc zawiera fragment sto w dowolnym miejscu tekstu. Kluczowe są tu dwa elementy: instrukcja DELETE FROM oraz operator LIKE z symbolami wieloznacznymi %. Znak % oznacza dowolny ciąg znaków, także pusty, więc wzorzec '%sto%' pasuje np. do tekstów: 'historia', 'prosto', 'sto lat' albo 'na stole'. Moim zdaniem to jedna z tych konstrukcji SQL, które trzeba umieć praktycznie, bo bardzo często używa się jej przy czyszczeniu danych, moderacji treści albo usuwaniu nieaktualnych wpisów. W dobrej praktyce przed wykonaniem takiego DELETE warto najpierw uruchomić SELECT * FROM artykuly WHERE tresc LIKE '%sto%';, żeby zobaczyć, co dokładnie zostanie skasowane. Przy prawdziwej bazie dobrze też zrobić kopię zapasową albo użyć transakcji, bo DELETE bez ostrożności potrafi narobić sporo szkód. W standardowym SQL literały tekstowe zapisuje się zwykle w apostrofach, choć w niektórych środowiskach, np. w typowej konfiguracji MySQL, spotyka się też cudzysłowy.
W tym pytaniu łatwo pomylić kilka podobnych pojęć z SQL-a. Samo użycie operatora = nie wystarcza do wyszukiwania fragmentu tekstu. Operator równości sprawdza, czy cała wartość w kolumnie jest dokładnie taka sama jak podany tekst. Jeżeli więc zapiszesz warunek w stylu tresc = '%sto%', baza będzie szukała wartości dosłownie równej temu zapisowi, a nie tekstu zawierającego sto w środku. Znak % działa jako symbol wieloznaczny dopiero razem z operatorem LIKE, i to jest bardzo ważny szczegół. Bez LIKE procenty nie mają tego specjalnego znaczenia, tylko są zwykłymi znakami w napisie, zależnie od kontekstu i silnika bazy. Druga częsta pomyłka to dopisywanie gwiazdki przy DELETE. Gwiazdka kojarzy się z SELECT *, bo tam oznacza pobranie wszystkich kolumn. Instrukcja DELETE działa inaczej: ona usuwa całe wiersze, więc nie wskazuje się kolumn przez *. Poprawna składnia to DELETE FROM nazwa_tabeli WHERE warunek. Z mojego doświadczenia wynika, że ten błąd bierze się z mechanicznego przenoszenia składni z SELECT-a, a SQL niestety tak nie działa. W praktyce najbezpieczniej myśleć o DELETE jako o operacji na rekordach, nie na polach. Warunek WHERE decyduje, które rekordy znikną, a LIKE '%sto%' pozwala znaleźć podany fragment w dowolnym miejscu dłuższego tekstu.