Które dane zostaną wybrane w wyniku działania kwerendy na przedstawionych rekordach?
SELECT id FROM samochody WHERE rocznik LIKE "2%4";
| id | marka | model | rocznik |
|---|---|---|---|
| 1 | Fiat | Punto | 2016 |
| 2 | Fiat | Punto | 2002 |
| 3 | Fiat | Punto | 2007 |
| 4 | Opel | Corsa | 2016 |
| 5 | Opel | Astra | 2003 |
| 6 | Toyota | Corolla | 2016 |
| 7 | Toyota | Corolla | 2014 |
| 8 | Toyota | Yaris | 2004 |
A. Wszystkie identyfikatory.
B. Tylko identyfikator równy 8.
C. Identyfikatory równe 7 oraz 8.
D. Brak danych.
Wynikiem kwerendy będą identyfikatory 7 oraz 8, ponieważ warunek rocznik LIKE '2%4' wyszukuje wartości, które zaczynają się od cyfry 2 i kończą się cyfrą 4. Znak % w SQL oznacza dowolny ciąg znaków: może to być jeden znak, kilka znaków, a nawet pusty ciąg. Dlatego do wzorca pasuje rocznik 2014, bo zaczyna się od 2 i kończy na 4, oraz 2004 z tego samego powodu. Pozostałe roczniki, na przykład 2016, 2002, 2007 i 2003, nie spełniają warunku, bo nie kończą się cyfrą 4. Kwerenda wybiera tylko kolumnę id, więc nie zobaczymy marki ani modelu, tylko same identyfikatory pasujących rekordów. Moim zdaniem to dobre pytanie, bo pokazuje praktyczne użycie operatora LIKE, który bardzo często stosuje się przy filtrowaniu tekstów, kodów produktów, numerów katalogowych albo dat zapisanych jako tekst. Warto jednak pamiętać o dobrej praktyce: w standardowym SQL literały tekstowe zapisuje się w apostrofach, czyli '2%4', a cudzysłowy bywają używane do nazw kolumn lub tabel. Dodatkowo, jeżeli rocznik jest przechowywany jako liczba, to w prawdziwej bazie często lepiej użyć warunków liczbowych, bo jest to czytelniejsze i zwykle bardziej wydajne.
W tym zadaniu łatwo pomylić znaczenie operatora LIKE, szczególnie gdy patrzy się na rocznik jak na zwykłą liczbę. Warunek rocznik LIKE '2%4' nie oznacza dokładnego porównania do wartości 2%4 ani nie oznacza, że baza ma zwrócić wszystko, co zaczyna się od 2. Wzorzec jest bardziej precyzyjny: wartość musi zaczynać się znakiem 2 i jednocześnie kończyć się znakiem 4. Znak % działa jak wieloznacznik, czyli zastępuje dowolny fragment tekstu znajdujący się pomiędzy początkiem a końcem wzorca. Dlatego nie można uznać, że nie będzie żadnych danych. W tabeli są przecież roczniki 2014 i 2004, które idealnie pasują do schematu. Niepoprawne jest też założenie, że zostaną wybrane wszystkie identyfikatory, bo roczniki 2016, 2002, 2007 i 2003 nie kończą się cyfrą 4, więc odpadają z wyniku. Typowy błąd polega tu na zauważeniu tylko początku wzorca, czyli cyfry 2, i zignorowaniu końcówki 4. Z kolei wskazanie tylko identyfikatora 8 wynika zwykle z myślenia, że wzorzec pasuje wyłącznie do 2004, bo wygląda najbardziej podobnie do zapisu '2%4'. To też nie jest poprawne, ponieważ % może zastąpić także ciąg '01', więc 2014 również spełnia warunek. Z mojego doświadczenia najlepiej czytać takie warunki bardzo dosłownie: zaczyna się od tego, potem cokolwiek, kończy się na tamtym. Wtedy wynik wychodzi bez zgadywania i bez kombinowania.