Streszczenie
Artykuł ten chciałbym poświęcić klauzuli WHERE.
Ponieważ do tej pory traktowaliśmy ją bardzo ogólnikowo, myślę, że przyszedł
czas na dokładne przeanalizowanie możliwości, których może nam dostarczyć
skuteczne jej wykorzystanie.
Treść
Klauzula WHERE
służy do ograniczenia zbioru danych, na których przeprowadzana będzie operacja.
Dotyczy to zarówno operacji SELECT, jak i UPDATE i
DELETE.
W warunkach wyszukiwania można uwzględnić szereg operatorów porównania,
dopasowywania łańcuchów znaków i wartości niezdefiniowanej NULL.
Sama składnia ograniczająca warunki wyszukiwania jest dość prosta:
| WHERE |
warunki_wyszukiwania |
Podstawowy sposób filtracji danych polega na pobieraniu
wartości większy, mniejszy lub równy i porównaniu z pewną wartością, którą podajemy.
Przykładem może być wybranie kontaktu z osobami o imieniu Marcin lub ludzi
urodzonych po roku 1980. Wszystkie te operacje można bez problemu wykonać za
pomocą operatorów porównania. Poniższa tabela przedstawia operatory porównania
dostępne w standardzie Transact-SQL.
|
= |
Równy |
|
> |
Większy |
|
< |
Mniejszy |
|
>= |
Większy, równy |
|
<= |
Mniejszy, równy |
|
<> |
Różny |
Przejdźmy teraz do przeanalizowania prostego zapytania,
które już wielokrotnie przetoczyło się przez ten kurs. Wygenerujmy sobie w
Query
Designer skrypt wylistowujący kontakty do osób mających nazwisko Diaz.
Poprawnie wygenerowane zapytanie powinno wyglądać w następująco:
SELECT Person.Contact.*
FROM Person.Contact
WHERE (LastName =
N'Diaz')
Skupmy się jednak na klauzuli WHERE. Kolumna LastName
jest typu znakowego, z tego względu tekst wpisany do designera jest standardowo
konwertowany do łańcuch znakowy. W tym celu SQL Server zastosował
funkcję konwersji:
N' wartość_do_konwersji ’
Sprawdźmy, co się stanie, jeśli
kolumna, po której będziemy wyszukiwać, będzie miała wartość integer
(całkowitoliczbową).
SELECT Person.Contact.*
FROM Person.Contact
WHERE (ContactID = 257)
Ponieważ kolumna ContactID
jest typu całkowitego designer nie musi, a nawet nie może konwertować wartości.
Próba wpisania w kolumnie Filter wyrażenia innego niż cyfra
zakończy się niepowodzeniem i wypisaniem komunikatu o błędzie.
Wiemy już jak wybierać informacje o pojedynczym wierszu. Teraz przejdźmy do
wybrania wszystkich rekordów z bazy, gdzie data modyfikacji wiersza jest
większa niż 2004-07-26. W tym celu przy kolumnie związanej z nakładaniem
warunków wpisujemy datę 2004-07-26.
SELECT Person.Contact.*
FROM Person.Contact
WHERE
(ModifiedDate > CONVERT(DATETIME, '2004-07-26 00:00:00', 102))