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.
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:
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'
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'
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'
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ą.
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')
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.
- Avoiding Issues: Monitoring Query Pushdowns in Databricks Federated Queries - October 27, 2024
- Microsoft Fabric: Using Workspace Identity for Authentication - September 25, 2024
- Executing SQL queries from Azure DevOps using Service Connection credentials - August 28, 2024
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?
@Piotr ja dla przykładu jeżeli jednocześnie używam AND i OR to zawsze stosuje nawias – dla pewności i wygody 🙂
Ja też zawsze używam nawiasów – przynajmniej jestem pewny na 100% co się dzieje 🙂
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
Musiałby Pan podać zapytanie jakie jest używane żebym mógł pomóc 🙂