TSQLWhere_00

Klauzula WHERE i operatory OR i AND

 

Artykuł ten jest częścią serii Od 0 do TSQL którą znajdziesz tutaj.

Dziś w ramach kursu Od 0 do TSQL zajmiemy się operatorami porównania oraz klauzulą filtrującą WHERE. W poprzedniej części nauczyliśmy się wyświetlać określone dane z pojedynczej tabeli, jednak w większości przypadków pobranie wszystkich wpisów tabeli nie jest dla nas wygodne ze względu m.in na ilość wierszy. Z pomocą przychodzi nam tutaj słowo kluczowe WHERE pozwalające pobrać dane z tabeli na podstawie warunków, które jawnie wskażemy. Do przedstawienia możliwości tej klauzuli wykorzystamy znaną z poprzedniego artykułu tabelę Employees, podstawowa składnia SQL z wykorzystaniem WHERE została przedstawiona poniżej.

SELECT
      fields
FROM 
      table_name    
WHERE
      expressions

gdzie w miejscu expressions podajemy warunki filtracji. Np. Jeżeli chcemy wyświetlić Dane pracowników o nazwisku Fuller powinniśmy użyć następującego zapytania.

SELECT
       [FirstName]
	  ,[LastName]
	  ,[Address]
	  ,[PostalCode]
	  ,[City]
	  ,[HomePhone]
FROM 
	   [Employees]
WHERE
	   [LastName]='Fuller'

W rezultacie otrzymamy pożądany wynik.

Result

Oczywiście do dyspozycji mamy całą gamę operatorów porównania tj.:

  • =  równy
  • <> nierówny
  • !=  nierówny
  • > większy niż
  • < mniejszy niż
  • >= większy równy
  • <= mniejszy równy

Podążając tym tokiem myślenia napiszmy zapytanie wyświetlające wszystkich pracowników, którzy nie mają na nazwisko Fuller:

SELECT
       [FirstName]
	  ,[LastName]
	  ,[Address]
	  ,[PostalCode]
	  ,[City]
	  ,[HomePhone]
FROM 
	   [Employees]
WHERE
	   [LastName]<>'Fuller'

i rezultat:

Result

Warty odnotowania jest fakt, iż pole którego używamy do filtracji (umieszczamy w klauzuli WHERE) nie musi być wyświetlane w sekcji SELECT – tak więc poniższe zapytanie jest jak najbardziej poprawne i zwróci prawidłowy wynik.

SELECT
           [FirstName]
	  ,[Address]
	  ,[PostalCode]
	  ,[City]
	  ,[HomePhone]
FROM 
	   [Employees]
WHERE
	   [LastName]='Fuller'

Result

Oczywiście możemy łączyć warunki w klauzuli WHERE. Możemy to zrobić przy pomocy operatorów logicznych. Podstawowe operatory logiczne to:

  • AND
  • OR

Przykładowo jeżeli chcemy wyświetlić tych pracowników, którzy mieszkają w Londynie i zajmują stanowisko Sales Representative napiszemy poniższe zapytanie. Kluczowy w powyższym zdaniu jest spójnik “i” ponieważ wyświetlone zostaną tylko te rekordy tabeli, które spełniają oba warunki.

SELECT
           [FirstName]
	  ,[LastName]
	  ,[Title]
	  ,[City]

FROM 
	   [Employees]
WHERE
	   [Title]='Sales Representative' AND
	   [City]='London'

Result

Jeżeli w powyższym zapytaniu zamienimy operator AND na OR wynik będzie odmienny.

SELECT
           [FirstName]
	  ,[LastName]
	  ,[Title]
	  ,[City]

FROM 
	   [Employees]
WHERE
	   [Title]='Sales Representative' OR
	   [City]='London'

Result

W wyniku tego zapytania otrzymaliśmy wszystkich pracowników, którzy zajmują stanowisko ‘Sales Representative’ lub mieszkają w Londynie. Dzięki tym bardzo prostym operatorom możemy tworzyć nawet bardzo złożone warunki. Przy jednoczesnym wykorzystaniu obu operatorów warto pamiętać, że AND ma większy priorytet niż OR – najlepiej ten fakt będzie zobrazować na przykładzie poniższego zapytania.

SELECT
       [FirstName]
	  ,[LastName]
	  ,[Title]
	  ,[City]

FROM 
	   [Employees]
WHERE
	   [Title]='Sales Representative' AND
	   [City]='London' OR
	   [LastName]='Callahan'

Zapytanie to zwróci tych którzy pracują na stanowisku Sales Representative i mieszkają w Londynie oraz tych, którzy mają na nazwisko Callahan niezależnie od tego gdzie mieszkają i jakie stanowisko zajmują.

Result

Może to być troszeczkę mylące i niektórzy z Was mogli spodziewać się w rezultacie pracowników którzy zajmują stanowisko Sales Representative i mieszkają w Londynie lub mają na nazwisko Callahan. Oczywiście za pomocą powyższego zapytania rezultat ten nie jest możliwy do osiągnięcia ze względu na wyższy priorytet operatora AND nad operatorem OR. Możemy jednak tę logikę zmienić wprowadzając nawiasy okrągłe, które w języku TSQL pełnią taką samą rolę jak w matematyce – zmieniają kolejność wykonywania działań. Tak więc poniższe zapytanie ma zmieniony porządek wykonywania i zwróci opisywany przypadek.

SELECT
       [FirstName]
	  ,[LastName]
	  ,[Title]
	  ,[City]

FROM 
	   [Employees]
WHERE
	   [Title]='Sales Representative' AND
	   ([City]='London' OR
	   [LastName]='Callahan')

Result

Tak więc polecam stosować nawiasy zamiast polegać na priorytecie AND i OR aby uniknąć błędów, które w rozbudowanym zapytaniu mogą być trudne do wykrycia.

Dzisiejszy artykuł wprowadził nas w tematykę filtrowania rezultatów TSQL, którą będziemy kontynuować w następnym epizodzie – ZAPRASZAM.

Spis dostępnych artykułów w ramach serii znajdziesz tutaj.

5 Comments

  1. Dzięki za artykuł, jak widać diabeł tkwi w szczegółach (priorytetowanie operatorów).
    Czy można zatem przyjąć, że cały fragment warunku AND dla lepszego zrozumienia zawsze można otaczać nawiasami i tak patrzeć na zestaw warunków?

  2. @Piotr ja dla przykładu jeżeli jednocześnie używam AND i OR to zawsze stosuje nawias – dla pewności i wygody 🙂

  3. U mnie niestety już wiem, że jest coś nie tak, ale nie mogę znaleźć rozwiązania. Pojawiają się błędy undefined, dzieje się tak, gdy użyję dla klauzuli WHERE funkcji dla przykładu $id

Leave a Reply