Data: 12.07.2021

MS SQL operatory – praktyczny przewodnik
Spis treści
Operatory to słowa kluczowe lub znaki, które są najczęściej używane w klauzuli WHERE. W artykule MS SQL operatory znajdziesz przykłady zastosowania operatorów w SQL Server.
Do czego służą operatory w MS SQL Server?
Operatory w bazach danych SQL Server służą m.in. do wykonywania działań arytmetycznych, porównywania danych oraz łączenia wielu kryteriów filtrowania w klauzuli WHERE.
Przykłady kodu przedstawione w artykule możesz uruchomić w bazie AdventureWorks2012.
Informacje, w jaki sposób zainstalować SQL Server i podłączyć bazę znajdziesz w naszym artykule MS SQL Server instalacja.
Rodzaje operatorów:
- operatory arytmetyczne
- operatory porównania
- operatory SQL
- operatory logiczne
MS SQL operatory arytmetyczne
Operatory arytmetyczne służą do wykonywania operacji arytmetycznych, takich jak dodawanie, odejmowanie, mnożenie i dzielenie.
Wszystkie standardowe operatory arytmetyczne mogą być używane w języku SQL. Ich argumentami mogą być liczby lub dane typów, które serwer bazodanowy może automatycznie konwertować na liczby.
Informacje na temat typów danych znajdziesz w artykule Typy danych w MS SQL Server.
Do operatorów arytmetycznych należą:
-
dodawanie (+)
SELECT OrderQty, OrderQty + 1 as DodawanieFROM Production.WorkOrder;Wartość w kolumnie Dodawanie zawiera OrderQty (liczba zamówień) powiększoną o 1.
-
odejmowanie (-)
SELECT OrderQty, OrderQty - 1 as OdejmowanieFROM Production.WorkOrder;Wartość w kolumnie Odejmowanie zawiera OrderQty (liczba zamówień) pomniejszoną o 1.
-
mnożenie (*)
SELECT OrderQty, OrderQty * 2.0 as MnożenieFROM Production.WorkOrder;Wartość w kolumnie Mnożenie zawiera OrderQty (liczba zamówień) przemnożoną przez 2.0.
-
dzielenie (/)
SELECT OrderQty, OrderQty / 2 as DzielenieFROM Production.WorkOrder;Wartość w kolumnie Dzielenie zawiera OrderQty (liczba zamówień) podzieloną przez 2.
W SQL Server, jeśli dzielisz liczbę całkowitą przez liczbę całkowitą, wynik również będzie liczbą całkowitą (część ułamkowa zostanie odcięta) np. 9/2 = 4 a nie 4.5. Aby uzyskać wynik zmiennoprzecinkowy, należy dzielić przez liczbę z kropką 9/2.0.
-
dzielenie modulo (%)
SELECT OrderQty, OrderQty % 2 as ResztaFROM Production.WorkOrder;Wartość w kolumnie Reszta zawiera resztę z dzielenia OrderQty (liczba zamówień) przez 2.
Poniżej zapytanie zawierające wszystkie powyższe operacje:
SELECT OrderQty, OrderQty + 1 as Dodawanie, OrderQty - 1 as Odejmowanie, OrderQty * 2.0 as Mnożenie, OrderQty / 2 as Dzielenie, OrderQty % 2 as ResztaFROM Production.WorkOrder;Wynik:
| OrderQty | Dodawanie | Odejmowanie | Mnożenie | Dzielenie | Modulo | |
|---|---|---|---|---|---|---|
| 1 | 8 | 9 | 7 | 16.0 | 4 | 0 |
| 2 | 15 | 16 | 14 | 30.0 | 7 | 1 |
| 3 | 9 | 10 | 8 | 18.0 | 4 | 1 |
| 4 | 16 | 17 | 15 | 32.0 | 8 | 0 |
| 5 | 14 | 15 | 13 | 28.0 | 7 | 0 |
| 6 | 16 | 17 | 15 | 32.0 | 8 | 0 |
Domyślna kolejność wykonywania operatorów:
-
mnożenie lub dzielenie
-
dodawanie lub odejmowanie
Działania wykonywane są od lewej do prawej. Domyślną kolejność wykonywania operacji możesz zmienić za pomocą nawiasów. Operacje umieszczone w nawiasie wykonywane są w pierwszej kolejności.
MS SQL operatory porównania
Operatory porównania w SQL Server umożliwiają porównanie lewej strony wyrażenia do prawej. Wynikiem porównania jest wartość logiczna PRAWDA lub FAŁSZ.
Uwaga! Sprawdź w bazie danych, której używasz, ustawienia trybu sortowania i sposób obsługi małych i dużych liter. Jeżeli w Twojej bazie wielkość liter ma znaczenie, ciągi znaków „Adam” i „ADAM” będą traktowane jako różne.
Do operatorów porównania należą:
-
równe (=) – zwraca prawdę, jeżeli porównywane wartości są takie same.
SELECT FirstName, LastNameFROM Person.PersonWHERE LastName = 'Adams';Z tabeli Person.Person wybrane zostaną tylko te rekordy, w przypadku których Nazwisko (LastName) jest równe „Adams”.
-
większe niż (>) – zwraca prawdę, jeżeli pierwsza wartość jest większa od drugiej
SELECT *FROM Production.ProductWHERE ListPrice > 0;Z tabeli Production.Product wybrane zostaną tylko te rekordy, w przypadku których Cena katalogowa (ListPrice) jest większa od zera.
-
mniejsze niż (<) – zwraca prawdę, jeżeli pierwsza wartość jest mniejsza od drugiej
SELECT *FROM Production.ProductWHERE ListPrice < 100;Z tabeli Production.Product wybrane zostaną tylko te rekordy, w przypadku których Cena katalogowa (ListPrice) jest mniejsza od stu.
-
większy lub równy (>=) – zwraca prawdę, jeżeli pierwsza wartość jest większa lub równa drugiej
SELECT *FROM Production.ProductWHERE ListPrice >= 100Z tabeli Production.Product wybrane zostaną tylko te rekordy, w przypadku których Cena katalogowa (ListPrice) jest większa lub równa sto.
-
mniejszy lub równy (<=) – zwraca prawdę, jeżeli pierwsza wartość jest mniejsza lub równa drugiej
SELECT *FROM Production.ProductWHERE ListPrice <= 100;Z tabeli Production.Product wybrane zostaną tylko te rekordy, w przypadku których Cena katalogowa (ListPrice) jest mniejsza lub równa sto.
-
różny (<>, !=) – zwraca prawdę, jeżeli porównywane wartości są różne.
SELECT *FROM Production.ProductWHERE ListPrice <> 0;SELECT *FROM Production.ProductWHERE ListPrice != 0;Z tabeli Production.Product wybrane zostaną tylko te rekordy, w przypadku których Cena katalogowa (ListPrice) jest różna od zera.
W wyrażeniach znajdujących się po dwóch stronach operatora porównania możemy użyć nazw kolumn. Wówczas będą porównywane ze sobą wartości z różnych pól tego samego wiersza.
SELECT BusinessEntityID, VacationHours, SickLeaveHoursFROM HumanResources.EmployeeWHERE VacationHours < SickLeaveHours;Z tabeli HumanResources.Employee wybrane zostaną tylko te rekordy, w przypadku których Liczba godzin urlopu (VacationHours) pracownika jest mniejsza niż liczba godzin zwolnienia lekarskiego (SickLeaveHours).
Operatory SQL (specjalne) w SQL Server
Oprócz standardowych operatorów porównania, w klauzuli WHERE możesz użyć operatorów specyficznych dla języka SQL.
Do specjalnych operatorów SQL należą:
-
IN– zwraca prawdę, jeśli argument znajdujący się z lewej strony operatora jest równy jednej z wartości wymienionych w nawiasie za operatorem.SELECT *FROM Person.PersonWHERE LastName IN ( 'Walters', 'Miller');Z tabeli Person.Person wybrane zostaną tylko te rekordy, w przypadku których Nazwisko (LastName) jest równe „Walters” lub „Miller”.
-
BETWEEN .. AND– zwraca prawdę, jeśli argument znajdujący się z lewej strony operatora ma wartość z przedziału podanego po prawej stronie operatora. Końce przedziału są włączone do zakresu.SELECT *FROM Production.ProductWHERE ListPrice BETWEEN 50 AND 200;Z tabeli Production.Product wybrane zostaną tylko te rekordy, w przypadku których Cena katalogowa (ListPrice) znajduje się w zakresie od 50 do 200. Kwoty 50 i 200 również będą zwrócone w wyniku zapytania.
-
LIKE– za jego pomocą możesz przeszukiwać dane tekstowe pod kątem ich zgodności z podanym wzorcem. Do tworzenia wzorca możesz użyć dwóch symboli o specjalnym znaczeniu:- symbol % (procent) – zastępuje dowolny ciąg znaków
- symbol _ (podkreślenie) — zastępuje jeden dowolny znak
SELECT *FROM Person.PersonWHERE LastName LIKE 'M%';Z tabeli Person.Person wybrane zostaną tylko te rekordy, w przypadku których Nazwisko (LastName) rozpoczyna się na literę „M”.
-
+ (plus)– operator ciągu znaków – umożliwia łączenie ciągów znakowychSELECT FirstName, LastName,FirstName + ' '+ LastName as ImieNazwiskoFROM Person.Person;Wynik:
FirstName LastName ImieNazwisko 1 Syed Abbas Syed Abbas 2 Catherine Abel Catherine Abel 3 Kim Abercrombie Kim Abercrombie W tabeli Person.Person połączone zostało imię (FirstName) i nazwisko (LastName). Pomiędzy imię i nazwisko wstawiona została spacja.
W SQL Server, jeśli którakolwiek z kolumn (FirstName lub LastName) zawiera wartość NULL, to wynik całego dodawania za pomocą operatora + również będzie NULL. Dlatego w nowszych wersjach SQL Server (od 2012) do łączenia tekstów zaleca się funkcję
CONCAT(), która traktuje NULL jak pusty ciąg znaków. -
IS NULL– zwraca prawdę, jeśli argument znajdujący się z jego lewej strony ma wartość specjalną NULL.SELECT *FROM Person.PersonWHERE MiddleName IS NULL;Z tabeli Person.Person wybrane zostaną tylko te rekordy, w przypadku których brakuje drugiego imienia (MiddleName).
MS SQL operatory logiczne
Umożliwiają one połączenie kilku prostych warunków logicznych w jeden złożony.
W serwerach bazodanowych występuje znacznik NULL, który reprezentuje brakujące dane i jest różny od zera oraz od pustego ciągu znaków. Do znacznika NULL można się odnosić jak do braku jakichkolwiek danych w polu.
Z powodu występowania znacznika NULL, w serwerach bazodanowych obowiązuje logika trójwartościowa a nie dwuwartościowa. Porównanie znacznika NULL z dowolną inną wartością daje w wyniku wartość nieznaną a nie PRAWDĘ lub FAŁSZ.
Poniżej matryca logiczna uwzględniająca logikę trójwartościową:
| p | q | p AND q | p OR q |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| True | Unknown | Unknown | True |
| False | True | False | True |
| False | False | False | False |
| False | Unknown | False | Unknown |
| Unknown | True | Unknown | True |
| Unknown | False | False | Unknown |
| Unknown | Unknown | Unknown | Unknown |
Do operatorów logicznych należą:
-
AND(logiczne I, koniunkcja) – jeżeli użyjesz operatora AND wszystkie warunki, które za jego pomocą łączysz, muszą być prawdziwe, aby całość wyrażenia była prawdziwa.SELECT *FROM Person.PersonWHERE FirstName = 'David' AND LastName = 'Bradley';Z tabeli Person.Person wybrane zostaną tylko te rekordy, w przypadku których Imię (FirstName) jest równe „David” i Nazwisko (LastName) jest równe „Bradley”.
-
OR(logiczne LUB, alternatywa) – jeżeli użyjesz operatora OR tylko jeden z warunków, które za jego pomocą łączysz, musi być prawdziwy, aby całość wyrażenia była prawdziwa.SELECT *FROM Person.PersonWHERE FirstName = 'David' OR LastName = 'Bradley';Z tabeli Person.Person wybrane zostaną tylko te rekordy, w przypadku których Imię (FirstName) jest równe „David” lub Nazwisko (LastName) jest równe „Bradley”.
-
NOT(negacja) – jest to operator jednoargumentowy. W klasycznej logice jego wynikiem jest zaprzeczenie (negacja) argumentu. W języku SQL może on zwrócić również wartość UNKNOWNSELECT *FROM Person.PersonWHERE LastName NOT IN ( 'Walters', 'Miller');Z tabeli Person.Person wybrane zostaną tylko te rekordy, w przypadku których Nazwisko (LastName) NIE jest równe „Walters” lub „Miller”.
Wszystkie operatory porównań możesz łączyć ze sobą za pomocą operatorów logicznych AND, OR.
W przypadku operatora AND cały warunek jest spełniony tylko wtedy, gdy wszystkie zawarte w nim warunki są prawdziwe.
SELECT EmailPromotion, PersonTypeFROM Person.PersonWHERE EmailPromotion IN (1,2) AND PersonType = 'SC'W przykładzie wybrane zostaną tylko te rekordy, w przypadku których wartość w kolumnie EmailPromotion to 1 lub 2 i wartość w kolumnie PersonType to „SC”.
W przypadku operatora OR warunek jest spełniony, jeśli chociaż jeden z warunków jest prawdziwy.
SELECT EmailPromotion, PersonTypeFROM Person.PersonWHERE EmailPromotion IN (1,2) OR PersonType = 'SC'W przykładzie wybrane zostaną te rekordy, w przypadku których wartość w kolumnie EmailPromotion to 1 lub 2 lub wartość w kolumnie PersonType to „SC”.
Łączenie operatorów AND i OR w zapytaniu SQL
Podczas tworzenia bardziej złożonych filtrów możemy używać operatorów AND oraz OR w jednym zapytaniu. W takim przypadku powinniśmy zwrócić uwagę na priorytet wykonywania operatorów.
Operator AND jest wykonywany przed OR. Oznacza to, że bez zastosowania nawiasów SQL najpierw połączy warunki logiczne za pomocą AND, a dopiero później uwzględni alternatywy określone przez OR.
W przykładzie poniżej wybrane zostaną produkty w kolorze czarnym i srebrnym o cenie większej niż 3000.
SELECT Name, ProductNumber, Color, ListPriceFROM Production.ProductWHERE (Color = 'Black' OR Color = 'Silver') AND ListPrice > 3000;W przykładzie poniżej wybrane zostaną produkty w kolorze czarnym niezależnie do ich ceny lub produkty w kolorze srebrnym o cenie większej niż 3000.
SELECT Name, ProductNumber, Color, ListPriceFROM Production.ProductWHERE Color = 'Black' OR Color = 'Silver' AND ListPrice > 3000;W języku MS SQL dostępne są również operatory związane z:
- łączeniem tabel –
SOME,ANY,ALL - grupowaniem danych –
CUBEiROLLUP,GROUPING SETS. Opis operatorów oraz informacje dotyczące grupowania znajdziesz w artykule MS SQL grupowanie. - podzapytaniami –
EXISTS,IN. Informacje na temat podzapytań znajdziesz w artykule MS SQL – podzapytania. - tworzeniem raportów –
PIVOTiUNPIVOT. Opis operatorów znajdziesz w artykule MS SQL – operatory niestandardowe PIVOT i UNPIVOT.
Jeśli chcesz poćwiczyć SQL w praktyce na dużej ilości zadań zajrzyj na nasze kursy SQL. Na każdy dzień szkolenia przygotowaliśmy ponad 50 ćwiczeń.
