Data: 12.07.2021

Operatory w MS SQL Server

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 Dodawanie
    FROM Production.WorkOrder;

    Wartość w kolumnie Dodawanie zawiera OrderQty (liczba zamówień) powiększoną o 1.

  • odejmowanie (-)

    SELECT OrderQty, OrderQty - 1 as Odejmowanie
    FROM Production.WorkOrder;

    Wartość w kolumnie Odejmowanie zawiera OrderQty (liczba zamówień) pomniejszoną o 1.

  • mnożenie (*)

    SELECT OrderQty, OrderQty * 2.0 as Mnożenie
    FROM Production.WorkOrder;

    Wartość w kolumnie Mnożenie zawiera OrderQty (liczba zamówień) przemnożoną przez 2.0.

  • dzielenie (/)

    SELECT OrderQty, OrderQty / 2 as Dzielenie
    FROM 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 Reszta
    FROM 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 Reszta
FROM Production.WorkOrder;

Wynik:

OrderQtyDodawanieOdejmowanieMnożenieDzielenieModulo
189716.040
215161430.071
3910818.041
416171532.080
514151328.070
616171532.080

Domyślna kolejność wykonywania operatorów:

  1. mnożenie lub dzielenie

  2. 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, LastName
    FROM Person.Person
    WHERE 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.Product
    WHERE 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.Product
    WHERE 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.Product
    WHERE ListPrice >= 100

    Z 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.Product
    WHERE 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.Product
    WHERE ListPrice <> 0;
    SELECT *
    FROM Production.Product
    WHERE 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,
SickLeaveHours
FROM HumanResources.Employee
WHERE 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.Person
    WHERE 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.Product
    WHERE 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.Person
    WHERE 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 znakowych

    SELECT FirstName, LastName,
    FirstName + ' '+ LastName as ImieNazwisko
    FROM Person.Person;

    Wynik:

    FirstNameLastNameImieNazwisko
    1SyedAbbasSyed Abbas
    2CatherineAbelCatherine Abel
    3KimAbercrombieKim 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.Person
    WHERE 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ą:

pqp AND qp OR q
TrueTrueTrueTrue
TrueFalseFalseTrue
TrueUnknownUnknownTrue
FalseTrueFalseTrue
FalseFalseFalseFalse
FalseUnknownFalseUnknown
UnknownTrueUnknownTrue
UnknownFalseFalseUnknown
UnknownUnknownUnknownUnknown

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.Person
    WHERE 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.Person
    WHERE 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ść UNKNOWN

    SELECT *
    FROM Person.Person
    WHERE 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, PersonType
FROM Person.Person
WHERE 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, PersonType
FROM Person.Person
WHERE 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 ANDOR 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, ListPrice
FROM Production.Product
WHERE (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, ListPrice
FROM Production.Product
WHERE Color = 'Black' OR Color = 'Silver'
AND ListPrice > 3000;

W języku MS SQL dostępne są również operatory związane z:

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ń.

Ewa Barbara Lelusz
Ewa Barbara Lelusz
Analityk biznesowy
Udostępnij wpis:udostępnij Facebookudostępnij Linkedinudostępnij e-mail

Polecane