Kod SELECT imie, pesel, wiek FROM dane WHERE wiek NOT IN (18,30) wybiera
A. imiona, nazwiska oraz numery PESEL osób w wieku innym niż 18 i 30 lat
B. imiona, numery PESEL oraz wiek osób w wieku innym niż 18 i 30 lat
C. imiona, numery PESEL oraz wiek osób spoza przedziału od 18 do 30 lat
D. imiona, numery PESEL oraz wiek osób w wieku dokładnie 18 lub 30 lat
Zapytanie SELECT imie, pesel, wiek FROM dane WHERE wiek NOT IN (18, 30) zwraca dokładnie trzy kolumny: imie, pesel oraz wiek z tabeli dane, ale tylko dla tych rekordów, w których wartość pola wiek nie jest równa ani 18, ani 30. Operator NOT IN oznacza w SQL: nie należy do podanego zbioru wartości. W praktyce warunek wiek NOT IN (18, 30) działa podobnie jak wiek <> 18 AND wiek <> 30, o ile pole wiek nie ma wartości NULL. To ważny szczegół, bo rekordy z wiekiem NULL też nie przejdą tego warunku, ponieważ SQL traktuje porównanie z NULL jako wynik nieznany. Moim zdaniem to jedno z tych miejsc, gdzie warto czytać zapytanie bardzo dosłownie: SELECT mówi jakie kolumny pobieramy, FROM skąd, a WHERE filtruje wiersze. Takie filtrowanie przydaje się np. przy raportach, gdy chcemy wykluczyć konkretne grupy wiekowe, statusy zamówień albo wybrane identyfikatory produktów. Dobrą praktyką jest też pilnowanie, żeby nazwy kolumn w opisie wyniku zgadzały się z tym, co faktycznie jest po SELECT, bo tutaj nie ma nazwiska, jest PESEL i wiek.
W tym zapytaniu łatwo pomylić znaczenie operatora IN z NOT IN albo potraktować wartości w nawiasie jako granice przedziału. SQL jednak nie czyta zapisu (18, 30) jako zakresu od 18 do 30. To jest po prostu lista dwóch konkretnych wartości: 18 oraz 30. Gdyby chodziło o przedział, zwykle użyto by warunku BETWEEN 18 AND 30, ewentualnie porównań typu wiek >= 18 AND wiek <= 30. Dlatego opis mówiący o osobach spoza przedziału od 18 do 30 lat jest nieprecyzyjny i merytorycznie zły, bo osoba w wieku 19, 20 czy 29 lat zostanie wybrana przez to zapytanie, ponieważ jej wiek nie jest równy 18 ani 30. Z mojego doświadczenia to częsty błąd na początku nauki SQL: nawiasy kojarzą się z zakresem, a w IN oznaczają zbiór wartości do sprawdzenia. Niepoprawne jest też stwierdzenie, że zapytanie wybiera osoby w wieku dokładnie 18 lub 30 lat, bo wtedy powinno być wiek IN (18, 30), bez słowa NOT. Słowo NOT odwraca warunek logiczny. Trzeba również uważać na listę kolumn po SELECT. Zapytanie pobiera imie, pesel i wiek, a nie nazwisko. Jeśli w opisie wyniku pojawia się nazwisko, którego nie ma w SELECT, to taki opis nie zgadza się ze strukturą zapytania. W pracy z bazami danych takie detale są naprawdę istotne, bo raport może wyglądać poprawnie na oko, ale zawierać zupełnie inny zestaw danych niż zakładaliśmy.