Skip to content

SQL BASICS – cz. 1

Spis treści poniższego wpisu:

  1. Podstawy instrukcji SELECT
    1. Wyrażenia
    2. Konkatenacja
    3. Funkcje arytmetyczne
    4. Funkcje znakowe
    5. Funkcje daty i czasu
    6. Konwersja typów
    7. Instrukcja CASE (odpowiednik IF … THEN … ELSE)
  2. Sortowanie wyników
  3. Operatory logiczne
    1. NOT
    2. AND
    3. OR

Podstawy instrukcji SELECT

Z zapytaniami w języku SQL jednoznacznie powinna nam kojarzyć się instrukcja SELECT. Jest to jego najczęściej używany, a jednocześnie najbardziej rozbudowany element. Nazywa się ją zapytaniem, właśnie ze względu na fakt, iż wysyła zapytania do serwera bazodanowego o dane, które są na nim przechowywane. W większości przypadków składnię instrukcji SELECT można uprościć do następującego schematu:

SELECT nazwy_kolumn FROM tabela_źródłowa;

Oczywiście pozwala ona na znacznie więcej niż tylko podawanie nazw kolumn oraz tabel, z których chcemy pobrać dane. Przykłady takie zostaną częściowo omówione w dalszej części wpisu. Przykładowo pobierzemy ID klienta, jego imię, nazwisko, a także nadamy nowe nazwy każdej z kolumn:

SELECT CustomerID AS ID, FirstName AS Imię, LastName AS Nazwisko FROM #TMP_CUST_TABLE;

Rezultat będzie następujący:

1	Orlando	Gee
2	Keith	Harris
3	Donna	Carreras
4	Janet	Gates
5	Lucy	Harrington

Gdybyśmy chcieli odczytać dane zapisane we wszystkich kolumnach bez zmieniania ich kolejności, można w klauzuli SELECT wykorzystać * (gwiazdkę):

SELECT * FROM #TMP_CUST_TABLE;

Mimo wszystko nie polecam stosowania tej techniki z powodu wydłużenia czasu wykonania operacji, a także prawdopodobieństwa otrzymania danych w innej postaci niż się spodziewamy (np. ktoś mógł wprowadzić nieoczekiwane zmiany w bazie). Gdybyśmy chcieli jednak wyeliminować np. powtórzenia imion i otrzymać ich listę, moglibyśmy postąpić następująco:

SELECT DISTINCT FirstName FROM #TMP_CUST_TABLE;

Jak możemy więc wywnioskować z powyższego przykładu, słowo kluczowe DISTINCT eliminuje powtórzenia w wybranych kolumnach.

Wyrażenia

W języku SQL możemy korzystać ze wszystkich standardowych operatorów arytmetycznych: +, -, *, / oraz %. Mogą one być wykonywane bezpośrednio na kolumnach. Przykładowo gdybyśmy posiadali kolumnę Age w naszej tabeli, moglibyśmy wykonać następującą operację:

SELECT FirstName, Age * 2 FROM #TMP_CUST_TABLE;

Wynikiem byłyby wszystkie imiona oraz podwojony wiek. Reszta przypadków działa analogicznie. Oba wyrażenia mogą oczywiście być nazwami kolumn, a więc przykładowo moglibyśmy wykonać następującą operację:

SELECT ProductName, Price * Tax FROM Products;

Ewentualną kolejność działań ustawiamy poprzez nawiasy.

Konkatenacja

Możemy jej dokonać na dwa sposoby. Jeden typowy – z wykorzystaniem operatora dodawania. Drugi, nieco lepszy, to użycie specjalnej funkcji serwera do tego przeznaczonej (pod warunkiem, że Wasz serwer takową posiada):

SELECT FirstName + ' ' + LastName AS 'Full name' FROM #TMP_CUST_TABLE;
SELECT CONCAT(FirstName, ' ',LastName) AS 'Full name' FROM #TMP_CUST_TABLE;

Warto wiedzieć, że funkcja CONCAT w przypadku gdy jeden z argumentów jest NULL-em zwróci wartość drugiego elementu!

Funkcje arytmetyczne

Spis najczęściej używanych funkcji arytmetycznych można przedstawić następująco:

  • ABS(number) – wartość bezwzględna liczby
  • CEILING(number) – górne przybliżenie
  • FLOOR(number) – dolne przybliżenie
  • POWER(number, pow) – potęguje podaną liczbę (pierwszy argument) do podanego wykładnika (drugi argument)
  • RAND() – pseudolosowa wartość z zakresu 0-1
  • ROUND(number, precision) – zaokrągla liczbę do podanej liczby miejsc po przecinku
  • SQRT(number) – pierwiastkuje podaną liczbę

Funkcje znakowe

Spis najczęściej używanych funkcji znakowych można przedstawić następująco:

  • LEN(string) – zwraca długość podanego stringa
  • LOWER(string) – konwertuje string na małe litery
  • UPPER(string) – konwertuje string na duże litery
  • LTRIM(string) – usuwa spacje z początku stringa (inaczej wiodące)
  • RTRIM(string) – usuwa spacje z końca stringa (inaczej wolne)
  • REPLACE(string, arg1, arg2) – zamienia w podanym stringu (string), frazę podaną jako drugi argument (arg1) na podaną jako trzeci (arg2)
  • REPLICATE(string, number) – powtarza podany string określoną liczbę razy
  • SUBSTRING(string, offset, length) – wycina fragment podanego stringa o określonej długości (length), zaczynając od wskazanej pozycji (offset)

Funkcje daty i czasu

  • DATEADD(unit, number, date) – powiększa podaną datę (date) o określoną (number) liczbę jednostek (unit)
  • DATEDIFF(unit, date1, date2) – zwraca liczbę jednostek (unit) dzielących dwie wskazane daty (date1 oraz date3)
  • DAY(date) – zwraca numer dnia przekazanej daty (date)
  • MONTH(date) – zwraca numer miesiąca przekazanej daty (date)
  • YEAR(date) – zwraca rok przekazanej daty (date)
  • GETDATE() – zwraca aktualną datę i czas

Konwersja typów

Dla konwersji niejawnej:

SELECT '2' + 2 +  + '2', '2' + '2' + 2;

Pierwszy przypadek zwróci wartość 6, a drugi 12. Dzieje się tak, ponieważ operatory liczbowe mają wyższy priorytet od znakowych, a operacje wykonywane są od lewej do prawej. Gdybyśmy chcieli jednak przeprowadzić jawną konwersję, moglibyśmy zastosować następującą funkcję:

SELECT FirstName + ' ' + LastName + ' ' + CAST(PESEL AS VARCHAR(13)) AS 'FullName & PESEL' FROM #TMP_CUST_TABLE;

SQL-owy IF … THEN … ELSE – czyli instrukcja CASE

Sądzę, że sensu tej kluczowej instrukcji warunkowej nie trzeba nikomu przedstawiać. Jej przykładowe zastosowanie w języku SQL może wyglądać następująco:

SELECT FirstName, LastName, Age, 
    CASE 
        WHEN Age < 16 THEN 'Kid'
        WHEN Age < 18 THEN 'Youth'
        WHEN Age < 65 THEN 'Adult'
        ELSE 'Pensioner'
    END
FROM Inhabitants;

Jak widać zastosowanie jest bardzo proste. Dla podanego przykładu, w zależności od wartości pola Age zostanie wyświetlony stosowny napis.

Sortowanie wyników

Domyślna kolejność elementów zwróconych jako wynik zapytania, jej zależna od sposobu w jaki sposób bazodanowy je wykona. Do sortowania według naszych upodobać używamy klauzuli ORDER BY. Przykładowo:

SELECT CustomerID, FirstName, LastName FROM #TMP_CUST_TABLE ORDER BY CustomerID DESC;

Jak widać sortujemy wyniki zapytania po kolumnie FirstName w kolejności malejącej (domyślna jest rosnąca). Operacja działa oczywiście analogicznie dla typów liczbowych i dat Możemy też sortować po wielu kolumnach:

SELECT Title, FirstName, LastName FROM #TMP_CUST_TABLE ORDER BY FirstName DESC, Title;

Dla takiego przypadku zostanie wykonane najpierw sortowanie malejące po pierwszym imieniu, a potem w ramach powstałych grup po tytule (Mr. lub Ms.). Nie musimy korzystać z kolumn, które jawnie pobieramy. Powtórzenia możemy oczywiście usunąć za pomocą słowa DISTINCT, aczkolwiek wtedy wszystkie kolumny wymienione w klauzuli ORDER BY, muszą się również znajdować w klauzuli SELECT!

Sortowanie danych tekstowych ma większe możliwości, niż przedstawiono w powyższych przykładach. Występują tam m.in. strony kodowe, które wprowadzają pewnie zmiany w sposobie sortowania. Zachęcam do samodzielnego sprawdzenia dokumentacji.

 Operatory logiczne

Operatory logiczne działają dokładnie tak samo jak niektóre podstawowe operacje klasycznego rachunku zdań – alternatywa, koniunkcja, negacja. W matematyce zdanie może przyjąć dwie wartości – prawdę lub fałsz. W języku SQL jest jeszcze trzecia możliwa opcja – UNKOWN.

Negacja – operator NOT

Jest on operatorem jednoargumentowym. Działa dokładnie tak samo jak znana nam negacja (przy negowaniu wartości NULL otrzymamy UNKOWN):

SELECT ProductKey, CustomerKey, OrderDateKey, ShipDateKey  
FROM FactInternetSales  
WHERE SalesOrderNumber LIKE 'SO6%' AND NOT ProductKey < 400;

Dla powyższego przykładu zostaną zwrócone rekordy, w których kolumna SalesOrderHeader zaczyna się od frazy S06 i jednocześnie wartość kolumny ProductKey nie jest mniejsza od 400.

Koniunkcja – operator AND

Jest operatorem dwuargumentowym. Po dokładną lekturę działania dla poszczególnych przypadków zapraszam do dokumentacji: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/and-transact-sql

SELECT  BusinessEntityID, LoginID, JobTitle, VacationHours   
FROM HumanResources.Employee  
WHERE JobTitle = 'Marketing Assistant'  
AND VacationHours > 41 ;

Dla powyższego przykładu dostaniemy listę rekordów, w których JobTitle będzie miało wartość Marketing Assistant i jednocześnie VacationsHours będzie większe od 41.

Alternatywa – operator OR

Jest operatorem dwuargumentowym. Po dokładną lekturę działania dla poszczególnych przypadków zapraszam do dokumentacji: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/or-transact-sql

SELECT FirstName, LastName, Shift   
FROM HumanResources.vEmployeeDepartmentHistory  
WHERE Department = 'Quality Assurance'  
   AND (Shift = 'Evening' OR Shift = 'Night');

Dla powyższego przykładu zostaną zwrócone rekordy, w który Department ma wartość Quality Assurance, a Shift wartość Evening lub Night.


Wpis ten jest pierwszą częścią większego cyklu. Jego kontynuacja ma miejsca w kolejnych częściach, w których zostaną omówione pozostałe podstawowe elementy języka SQL.

Facebooktwitterredditlinkedinmail
Published inProgramowanie