Data: 8.07.2021

MS SQL odczytywanie danych i podstawy języka SQL
Spis treści
- MS SQL odczytywanie danych i podstawy języka SQL
Artykuł MS SQL odczytywanie danych to przewodnik, który umożliwi Ci samodzielne poznanie podstawowej składni języka T-SQL.
Jeśli chcesz na początek przeczytać, w jaki sposób zorganizować naukę zajrzyj do artykułu Jak zacząć naukę SQL i baz danych od podstaw?.
MS SQL odczytywanie danych
W artykule skupiamy się na nauce odczytywania danych z wykorzystaniem języka SQL w środowisku Microsoft SQL Server. Zapytania SQL prezentujemy na podstawie baz AdventureWorks i Northwind.
Przed rozpoczęciem pracy z zapytaniami warto upewnić się, że masz poprawnie przygotowane środowisko: zainstalowany silnik bazy danych oraz narzędzie do pracy z zapytaniami.
Instrukcję instalacji serwera i przykładowych baz danych znajdziesz w artykule SQL Server – instalacja, natomiast sposób pracy z edytorem zapytań i uruchamiania kodu SQL omawiamy w materiale Jak zacząć pracę z SQL Server Management Studio?.
Instrukcja SELECT
Instrukcja SELECT w SQL Server służy do odczytania danych z bazy danych
Poniżej zapytanie SQL, za pomocą którego możesz:
- odczytać z bazy dane z dwóch tabel
- ograniczyć liczbę wybieranych rekordów
- pogrupować wybrane rekordy
- ograniczyć liczbę grup
- posortować wybrane grupy
SELECT LastName, COUNT(*)FROM [Person].[EmailAddress] a JOIN Person.Person b ON a.BusinessEntityID = b.BusinessEntityIDWHERE a.BusinessEntityID < 100GROUP BY LastNameHAVING COUNT(*) > 2ORDER BY LastName;Zastosowanie poszczególnych klauzul:
- SELECT – wskazujemy kolumny, które chcemy otrzymać w wyniku
- FROM – wskazujemy tabelę, z której chcemy odczytać dane
- JOIN – wskazujemy nazwę tabeli, którą chcemy dołączyć
- ON – wskazujemy kolumny, według których będziemy dokonywać złączenia
- WHERE – filtr dla wybieranych wierszy
- GROUP BY – wskazujemy kolumny, według których ma się odbywać grupowanie
- HAVING – filtr dla wybieranych grup
- ORDER BY – wskazujemy kolumny, według których ma się odbywać sortowanie
Kolejność klauzul w każdym zapytaniu musi być dokładnie taka, jak w powyższym przykładzie.
Nie każde zapytanie wymaga użycia wszystkich klauzul. Niektóre z nich możesz pomijać np. jeśli nie łączysz tabel, nie potrzebujesz klauzuli JOIN … ON. Jeśli nie grupujesz danych, nie będzie Ci potrzebna klauzula GROUP BY itd.
Odczytywanie danych z tabeli
Poniżej znajdziesz przykłady, które możesz wykorzystać do rozpoczęcia samodzielnego pisania prostych zapytań i odczytywania danych z bazy.
Odczytanie wszystkich kolumn i wierszy z jednej tabeli
Dane odczytujemy z tabeli Person.Person. Aby odczytać (wyświetlić) wszystkie kolumny wstawiamy symbol gwiazdki (*).
SELECT *FROM Person.Person;Odczytanie wybranych kolumn i wszystkich wierszy z jednej tabeli
Aby odczytać wybrane kolumny, wypisujemy ich nazwy. Z tabeli Person.Person odczytujemy imię (FirstName) i nazwisko (LastName) oraz wszystkie rekordy.
SELECT FirstName, LastNameFROM Person.Person;Zmiana nazwy kolumny – aliasy kolumn
Alias kolumny umożliwia chwilową zmianę nazwy kolumny w ramach danego zapytania. Słowo kluczowe AS jest opcjonalne.
SELECT SalesYTD AS wynikiFROM Sales.SalesTerritory;W przykładzie z tabeli Sales.SalesTerritory odczytujemy kolumnę SalesYTD i zmieniamy jej nazwę na „wyniki”. Nazwa kolumny zmieniona zostaje tylko w wyświetlanym wyniku zapytania. Nie jest zmieniona w bazie danych.
Ograniczenie liczby zwracanych wierszy – słowo kluczoweTOP
Ograniczenie liczby wierszy zwróconych w zapytaniu umożliwia słowo kluczoweg TOP. Ilość wierszy, którą chcemy otrzymać w wyniku, możemy podać procentowo np. 10 PERCENT lub bezwzględnie za pomocą liczby np. 10.
Poniższe zapytanie zwróci 3 wiersze
SELECT TOP 3 *FROM Person.Person;Poniższe zapytanie zwróci 3% wierszy
SELECT TOP 3 PERCENT *FROM Person.Person;Wyeliminowanie z wyniku zapytania duplikatów – słowo kluczowe DISTNICT
Powtarzające się dane (duplikaty) możemy wyeliminować z wyniku zapytania za pomocą słowa kluczowego DISTINCT.
W przykładzie poniżej rekord zawierający „Kim Abercrombie” jest wyświetlony trzy razy, gdyż trzy razy występuje w tabeli.
Wynik zapytania:
SELECT FirstName, LastNameFROM Person.Person;| FirstName | LastName | |
|---|---|---|
| 1 | Syed | Abbas |
| 2 | Catherine | Abel |
| 3 | Kim | Abercrombie |
| 4 | Kim | Abercrombie |
| 5 | Kim | Abercrombie |
| 6 | Hazem | Abolrous |
| 7 | Sam | Abolrous |
| 8 | Humberto | Acevedo |
| 9 | Gustavo | Achong |
W przykładzie poniżej używamy słowa kluczowego DISTINCT, które powoduje, że zwracane są tylko unikalne wartości. W wyniku otrzymujemy tylko niepowtarzalne kombinacje imion i nazwisk.
SELECT DISTINCT FirstName, LastNameFROM Person.Person;| FirstName | LastName | |
|---|---|---|
| 1 | Syed | Abbas |
| 2 | Catherine | Abel |
| 3 | Kim | Abercrombie |
| 4 | Hazem | Abolrous |
| 5 | Sam | Abolrous |
| 6 | Humberto | Acevedo |
| 7 | Gustavo | Achong |
Sortowanie wyników zapytań – klauzula ORDER BY
Wyniki zapytań możemy sortować według jednej kolumny lub według wielu kolumn. Kolejność, w jakiej kolumny są wymienione w klauzuli ORDER BY wyznacza kolejność sortowania.
SELECT FirstName, LastNameFROM Person.PersonORDER BY FirstName;SELECT FirstName, LastNameFROM Person.PersonORDER BY FirstName, LastName;Domyślnie dane sortowane są rosnąco. Aby zmienić porządek sortowania możemy użyć modyfikatora DESC.
SELECT FirstName, LastNameFROM Person.PersonORDER BY FirstName DESC;Operatory języku MS SQL
Operatory w SQL Server służą do wykonywania porównań, obliczeń oraz łączenia warunków w zapytaniach. Dzięki nim możemy filtrować dane, sprawdzać zależności między wartościami i budować logiczne kryteria w klauzulach takich jak WHERE, JOIN czy HAVING.
Najczęściej używane operatory:
- arytmetyczne do obliczeń np. dodawanie (+), odejmowanie (-)
- porównania do porównywania wartości np. równy (=), różny (<>)
- specjalne (operatory SQL) np. IN, BETWEEN, LIKE, IS NULL do zaawansowanego filtrowania danych
- logiczne – AND, OR, NOT
Filtrowanie rekordów – klauzula WHERE
Aby odczytać tylko niektóre wiersze używamy klauzuli WHERE.
Klauzula WHERE umożliwia filtrowanie zwracanych przez zapytanie wierszy. Umieszczone w niej warunki logiczne są sprawdzane dla każdego wiersza tabeli. Jeśli wynikiem testu logicznego jest PRAWDA, wiersz trafia do wyniku zapytania. Jeżeli wynikiem jest FAŁSZ lub WARTOŚĆ NIEZNANA, wiersz nie jest uwzględniony w wyniku.
W przykładzie z tabeli Person.Person wybrany zostanie tylko ten wiersz, dla którego w kolumnie BusinessEntityID jest wartość równa 1702.
SELECT *FROM Person.PersonWHERE BusinessEntityID = 1702;Złożone warunki logiczne
Wszystkie operatory porównania możemy łączyć ze sobą za pomocą operatorów logicznych AND, OR. Dzięki temu możemy tworzyć rozbudowane zapytania.
SELECT *FROM Person.PersonWHERE (LastName LIKE 'B%' OR LastName LIKE 'C%') AND PersonType = 'EM' AND EmailPromotion = 1;W przykładzie wyszukujemy z tabeli Person.Person tylko te rekordy, w których:
- Nazwisko (LastName) zaczyna się na literę B lub na literę C
- Dane w kolumnie Typ klienta (PersonType) to „EM”
- Dane w kolumnie Promocja e-mailowa (EmailPromotion) to 1
Więcej informacji na temat operatorów i filtrowania znajdziesz w artykule MS SQL – operatory
Typy danych w SQL Server
Dane mogą reprezentować m.in. takie elementy jak imiona, nazwiska, opisy, liczby, obrazy, dokumenty.
Typy danych:
- mogą obejmować dane tekstowe (ciągi znaków), liczby, daty i godziny, obrazy (*.jpg) i inne dane binarne (*.zip)
- określają sposób przechowywania danych – decydują, czy w danej kolumnie mogą być zapisywane dane alfanumeryczne, numeryczne, daty i czasu.
Każda implementacja SQL może mieć swoje własne, niestandardowe typy danych oraz własne nazwy dla standardowych typów danych.
Ciągi znaków (teksty) i daty muszą być ujęte w znaki apostrofu. Wartości numeryczne (liczby) nie powinny być wpisywane w apostrofach.
SELECT *FROM Person.PersonPhone WHERE PhoneNumberTypeID = 1 AND PhoneNumber = '612-555-0100' AND ModifiedDate = '20071128';Datę należy podawać w formacie „yyyyMMdd” np. „20071128”. Format ten jest właściwie interpretowany przez SQL Server niezależnie od ustawień regionalnych komputera.
Podstawowe typy danych liczbowych:
INTEGER(INT)– reprezentuje liczby całkowiteNUMERIC(DECIMAL)– reprezentuje liczby o określonej skali i precyzjiREAL– reprezentuje liczby o zmiennej precyzjiFLOAT– reprezentuje liczby zmiennoprzecinkowe
Podstawowe typy daty i czasu:
DATETIME– reprezentuje datę i czasDATE– reprezentuje datęTIME– reprezentuje czas
Podstawowe typy znakowe:
CHAR– reprezentuje ciągi znaków o stałej długości, uzupełniając krótsze wartości spacjamiVARCHAR– reprezentuje ciąg znaków o zmiennej długościNCHAR,NVARCHAR– reprezentuje ciąg znaków o stałej lub zmiennej długości zakodowanych w UNICODE (obsługa polskich znaków)
Więcej informacji na temat typów danych znajdziesz w artykule Typy danych w MS SQL Server
Funkcje wbudowane
Funkcje w MS SQL Server to wbudowane elementy języka SQL, które służą do przetwarzania danych bezpośrednio w zapytaniach. Dzięki nim możemy wykonywać obliczenia, pracować na datach i tekstach oraz budować logikę warunkową.
Funkcja przyjmuje dane wejściowe (argumenty), wykonuje na nich określoną operację i zwracaja wynik.
Większość funkcji w MS SQL jest wywoływana według schematu:
NAZWA_FUNKCJI(argument1, argument2, ...)
Argumentem funkcji może być:
- wartość stała np. liczba, data lub tekst
- nazwa kolumny z tabeli w bazie
- wyrażenie np. wynik innej funkcji
W przykładzie poniżej w klauzuli SELECT:
- wyświetlamy kolumny OrderDate (data zamówienia) i ShippedDate (data wysyłki) z tabeli Orders
- wyliczamy różnicę między dwiema datami za pomocą funkcji
DATEDIFF:- w pierwszym argumencie funkcji podajemy
YEAR, co pozwala na wyliczenie różnicy w latach - w drugim argumencie podajemy datę, która pochodzi z bazy danych z kolumny OrderDate
- w trzecim argumencie podajemy datę jako wartość stałą tj. 20250101
- w pierwszym argumencie funkcji podajemy
SELECT OrderDate, ShippedDate, DATEDIFF(YEAR,OrderDate,'20250101') as liczba_latFROM Orders;Wynik:
| OrderDate | ShippedDate | liczba_lat |
|---|---|---|
| 1996-07-04 00:00:00.000 | 1996-07-16 00:00:00.000 | 29 |
| 1996-07-05 00:00:00.000 | 1996-07-10 00:00:00.000 | 29 |
| 1996-07-08 00:00:00.000 | 1996-07-12 00:00:00.000 | 29 |
| 1996-07-08 00:00:00.000 | 1996-07-15 00:00:00.000 | 29 |
W przykładzie poniżej w klauzuli SELECT:
- wyświetlamy kolumny OrderDate (data zamówienia) i ShippedDate (data wysyłki) z tabeli Orders
- wyliczamy różnicę między dwiema datami za pomocą funkcji
DATEDIFF:- w pierwszym argumencie funkcji podajemy
YEAR, co pozwala na wyliczenie różnicy w latach - w drugim argumencie podajemy datę, która pochodzi z bazy danych z kolumny OrderDate
- w trzecim argumencie wyliczamy datę za pomocą funkcji
GETDATE()
- w pierwszym argumencie funkcji podajemy
SELECT OrderDate, ShippedDate, DATEDIFF(YEAR,OrderDate,GETDATE()) as liczba_latFROM Orders;Rodzaje funkcji w SQL Server:
- funkcje matematyczne
- funkcje daty i czasu
- funkcje tekstowe
- funkcje konwersji
Funkcje matematyczne
Funkcje matematyczne w SQL Server służą do wykonywania obliczeń numerycznych bezpośrednio na danych przechowywanych w bazie. Umożliwiają m.in. zaokrąglanie wartości, obliczanie reszt z dzielenia, potęg, pierwiastków czy wartości bezwzględnych.
Szczegółowe omówienie najważniejszych funkcji matematycznych znajdziesz w artykule funkcje matematyczne w SQL Server
Funkcje daty i czasu
Funkcje daty i czasu w SQL Server służą do przetwarzania, analizowania oraz porównywania wartości typu data i czas.
Umożliwiają m.in. obliczanie różnic pomiędzy datami, dodawanie lub odejmowanie jednostek czasu, wyodrębnianie poszczególnych elementów daty (rok, miesiąc, dzień, godzina) oraz operowanie na bieżącej dacie i czasie systemowym.
Szczegółowe informacje na temat funkcji daty i czasu znajdziesz w artykule funkcje daty i czasu w SQL Server
Funkcje tekstowe
Funkcje tekstowe w SQL Server służą do przetwarzania danych typu znakowego. Umożliwiają m.in. łączenie tekstów, wycinanie fragmentów ciągów znaków, zmianę wielkości liter, wyszukiwanie określonych sekwencji znaków oraz obliczanie długości tekstu.
Informacje na temat funkcji tekstowych znajdziesz w artykule funkcje tekstowe w SQL Server
Konwersja typów danych
Za pomocą funkcji konwersji możemy określić jawną konwersję danych.
Informacje na temat funkcji konwersji znajdziesz w artykule SQL Server funkcje CAST, CONVERT, FORMAT
Instrukcja CASE
Instrukcja CASE ocenia listę warunków i zwraca jedno z możliwych wyrażeń wynikowych:
- jeśli określony w klauzuli WHEN warunek jest prawdziwy, wykonywany jest blok instrukcji THEN, w przeciwnym razie wykonywane są instrukcje z bloku ELSE.
- kolejne warunki logiczne (klauzule WHEN) są sprawdzane w kolejności, w jakiej zostały zapisane. Po znalezieniu pierwszego prawdziwego warunku, funkcja CASE zwraca odpowiadającą mu wartość i nie sprawdza dla tego wiersza kolejnych warunków.
SELECT [TerritoryID], SalesYTD, CASE WHEN SalesYTD < 5000000 THEN 'słabo' WHEN SalesYTD <= 6000000 THEN 'ok' ELSE 'kosmiczna sprzedaż' ENDFROM Sales.SalesTerritoryorder by SalesYTD;W przykładzie:
- w pierwszym warunku sprawdzamy, czy wartość w kolumnie SalesYTD jest mniejsza niż 5 mln. Jeśli jest mniejsza, wstawiamy opis „słabo”
- w drugim warunku sprawdzamy, czy wartość w kolumnie SalesYTD jest mniejsza równa 6 mln. Jeśli warunek jest spełniony wstawiamy opis „ok”
- w przypadku wierszy, które nie spełnią ani pierwszego, ani drugiego warunku wstawiamy opis „kosmiczna sprzedaż”
Więcej informacji na temat instrukcji CASE znajdziesz w artykule instrukcja CASE w SQL Server.
Grupowanie
Grupowanie danych polega na łączeniu wielu wierszy w jeden. Najprostszym przypadkiem grupowania jest połączenie wszystkich wierszy tabeli w jedną grupę i np. ich policzenie.
SELECT COUNT(*)FROM Person.Person;Można też podzielić wiersze na grupy. Podstawą zakwalifikowania wiersza do danej grupy jest wartość jednej z kolumn lub wynik użytego do grupowania wyrażenia.
SELECT PersonType, COUNT(*)FROM Person.PersonGROUP BY PersonType;W przykładzie dzielimy wiersze na grupy według danych znajdujących się w kolumnie PersonType i zliczamy ile jest rekordów w każdej z grup.
Funkcje agregujące
Funkcje agregujące (grupujące) operują na zbiorach a nie na pojedynczych wartościach. Pozwalają one podsumowywać wyniki działania innych poleceń SQL, zliczać liczbę wystąpień, sumować, obliczać wartości średnie.
Zliczenie wierszy lub wartości w kolumnach – funkcja COUNT()
Funkcja COUNT() wywołana ze znakiem gwiazdki zlicza wszystkie rekordy przechowywane w tabeli włącznie z duplikatami i rekordami zawierającymi wartość specjalną NULL.
Zliczamy wszystkie rekordy
SELECT COUNT (*)FROM Person.Person;Zliczamy wszystkie rekordy z wyjątkiem tych, które zawierają wartość specjalną NULL.
SELECT COUNT (LastName)FROM Person.Person;Zliczamy unikalne rekordy – tylko te, które mają unikalne nazwiska (dane w kolumnie LastName).
SELECT COUNT (DISTINCT LastName)FROM Person.Person;funkcja SUM() – zwrócenie sumy wartości w grupie
Argumentami funkcji SUM() mogą być tylko wartości numeryczne.
SELECT SUM(StandardCost)FROM Product;funkcja AVG() – zwrócenie średniej wartości w grupie
Argumentami funkcji AVG() mogą być tylko wartości numeryczne.
SELECT AVG(StandardCost)FROM Product;funkcja MIN() – zwrócenie najmniejszej wartości w grupie
Argumentami funkcji MIN() mogą być dane typu liczbowego, daty i czasu oraz tekstowe.
SELECT MIN(StandardCost)FROM Product;funkcja MAX() – zwrócenie największej wartości w grupie
Argumentami funkcji MAX() mogą być dane typu liczbowego, daty i czasu oraz tekstowe.
SELECT MAX(StandardCost)FROM Product;Klauzula GROUP BY
Klauzula GROUP BY umożliwia połączenie identycznych danych w grupy. Najczęściej wiersz jest klasyfikowany do danej grupy na podstawie wartości kolumny innej niż ta, dla której wywołana jest funkcja grupująca.
W poniższym zapytaniu funkcja grupująca wywołana jest dla kolumny Quantity natomiast wiersz jest klasyfikowany do grupy według kolumny ProductID.
SELECT ProductID, SUM(Quantity)FROM [Order Details]GROUP BY ProductID;W klauzuli SELECT nie możemy umieszczać kolumn, które nie są wymienione w klauzuli GROUP BY.
SELECT ProductID, OrderID, SUM(Quantity)FROM [Order Details]GROUP BY ProductID, OrderID;Filtrowanie grup – klauzula HAVING
Za pomocą klauzuli HAVING możesz ograniczyć liczbę wyświetlanych grup. Możesz umieścić w niej dowolną funkcję grupującą lub nazwy kolumn użytych do grupowania.
Umieszczony w klauzuli HAVING warunek logiczny jest sprawdzany dla każdej grupy i tylko te dane, dla których będzie on prawdziwy zostaną wybrane do wyniku zapytania.
SELECT ProductID, SUM(Quantity)FROM [Order Details]GROUP BY ProductIDHAVING SUM(Quantity) > 1000;W przykładzie wybieramy tylko te grupy, w których suma wyliczona dla grupy z danych w kolumnie Quantity wynosi więcej niż 1 tys.
Uwaga! Klauzula WHERE nakłada warunki na pojedyncze rekordy. Klauzula HAVING nakłada warunki na grupy rekordów tworzone przez klauzulę GROUP BY.
Więcej informacji na temat grupowania znajdziesz w artykule MS SQL grupowanie.
Złączenia tabel
Tabele możemy łączyć za pomocą operatora JOIN … ON.
W ramach operatora:
- wymieniamy nazwy wszystkich odczytywanych tabel
- określamy warunki ich łączenia
Informacje temat łączenia tabel znajdziesz w artykule Złączenia tabel
Łączenie wyników zapytań
Oprócz łączenia tabel, język SQL pozwala także łączyć wyniki zapytań. Łączenie wyników zapytań to dodawanie lub usuwanie wierszy zwróconych przez złączone zapytania.
Łączone wyniki zapytań muszą składać się z tej samej liczby kolumn. Dane w odpowiadających sobie kolumnach muszą być tego samego typu albo umożliwiać niejawną konwersję typów.
Operator UNION
Za jego pomocą możemy dodać do siebie wyniki zapytań. Operator UNION powoduje usunięcie z wyniku powtórzonych wierszy.
SELECT *FROM CustomersUNIONSELECT *FROM EmployeesOperator UNION ALL
Za jego pomocą możemy złączyć ze sobą wyniki zapytań bez eliminowania duplikatów.
SELECT *FROM CustomersUNIONSELECT *FROM EmployeesOperator INTERSECT
Zwraca część wspólną wyników dwóch zapytań, a więc tylko te wiersze, które zostały zwrócone przez obydwa zapytania.
SELECT *FROM CustomersINTERSECTSELECT *FROM EmployeesOperator EXCEPT
Zwraca te wiersze, które znalazły się wyłączenie w wyniku pierwszego zapytania i nie było ich w wyniku drugiego zapytania.
SELECT *FROM CustomersEXCEPTSELECT *FROM EmployeesWięcej informacji na temat łączenia wyników zapytań znajdziesz w artykule Łączenie wyników zapytań.
Wszystkie klauzule opisane w artykule przećwiczysz na naszym kursie SQL poziom podstawowy. Przygotowaliśmy ponad 100 ćwiczeń. Zapraszamy.
