Praktyczne wprowadzenie do języka SQL
3.2. Język Manipulacji Danymi
3.2.1. Układanie zapytań
Wybór określonych kolumn z tabeli (projekcja)
Przykładowo – użytkownik potrzebuje listę alfabetyczną pracowników w układzie: nazwisko, imię, data urodzenia. Listę można utworzyć, uruchamiając wykonanie zda-nia SQL:
SELECT Nazwisko, Imie, Data_ur FROM Pracownicy
ORDER BY Nazwisko
W wyniku wykonania takiego polecenia utworzona zostanie lista wszystkich pra-cowników w kolejności nazwisk od A do Z. Zastosowanie klauzuli ORDER BY po-woduje sortowanie danych wynikowych w kierunku rosnącym (opcja ASC –
ascen-ding), jeżeli wymagany jest kierunek malejący, należy po nazwie kolumny, według
której odbywa się sortowanie, wpisać DESC (descending – malejąco). Wynik działania polecenia SQL:
Nazwisko Imię Data_ur
Adamska Ewa 1963-10-27 Bielska Janina 1958-07-15 Bielski Leszek 1955-12-04 Burski Adam 1975-04-10 Frankowski Jerzy 1973-10-23 Gawron Anna 1976-03-03 Kowalski Piotr 1973-11-06 Mirski Tadeusz 1975-08-12 Nawrot Kamila 1950-02-07 Nowak Jan 1965-12-23 Pakulski Damian 1974-06-14 Porada Maria 1971-05-09 Wirski Jakub 1969-05-13 Wyzga Anatol 1959-11-09
Działanie klauzuli DISTINCT
Zastosowanie klauzuli DISTINCT w zdaniu SQL powoduje eliminowanie wartości powtarzających się. Działanie tej klauzuli zilustrowano w tabeli PRODUKTY, w której przechowywane są dane dotyczące asortymentu produktów oferowanych przez hurtow-nię „Fitness”. Polecenie wybierające całą zawartość tabeli PRODUKTY:
SELECT * FROM PRODUKTY
ID_P Nazwa Opis Rozmiar Kolor Ilość Cena_jedn
10 t-shirt damski M czarny 200 10.00
11 t-shirt damski L czerwony 200 10.00
12 t-shirt męski XL czarny 150 15.00
13 bluza polar Bez wym szary 250 20.00
14 bluza bawełna Bez wym szary 250 20.00
15 dres damski S granatowy 80 45.00
16 dres męski L czarny 50 50.00
17 szorty damskie S Czarny 120 12.50
Lista nazw produktów utworzona poprzez zastosowanie zdania SELECT bez klau-zuli DISTINCT i z klauzulą DISTINCT:
SELECT Nazwa SELECT DISTINCT Nazwa
Wynik działania zdania SELECT Wynik działania zdania SELECT bez klauzuli DISTINCT: z klauzulą DISTINCT:
Nazwa Nazwa t-shirt t-shirt t-shirt bluza t-shirt dres bluza szorty bluza dres dres szorty
Zapytania z zastosowaniem wyliczeń
W treści zapytania do bazy danych mogą być umieszczane obliczenia, na przykład, jeżeli w tabeli PRACOWNICY w jednej z kolumn przechowywane są dane dotyczące uposażenia miesięcznego każdego z pracowników, a potrzebna jest wielkość rocznych dochodów pracowników, to można zastosować konstrukcję:
SELECT Id_Pracownika, Nazwisko, Imię, Uposażenie*12 FROM PRACOWNICY
Wynik działania takiego zdania SQL (ostatnia kolumna, której nazwa tworzona jest przez system poprzez nazwę własną oraz wykonane wyliczenie, zawiera wartości wyliczone; należy pamiętać, że rzeczywista zawartość kolumny Uposażenie nie zmie-nia się, dalej zapisane są w niej zarobki miesięczne):
Id_pracownika Nazwisko Imię Uposażenie*12
100 Bielski Leszek 36000.00 120 Wyzga Anatol 33600.00 101 Adamska Ewa 30000.00 112 Bielska Janina 30000.00 103 Kowalski Piotr 21600.00 122 Burski Adam 24000.00 126 Frankowski Jerzy 24000.00 125 Gawron Anna 18000.00 106 Mirski Tadeusz 24000.00 104 Wirski Jakub 25200.00 117 Nawrot Kamila 27600.00 115 Porada Maria 24000.00 116 Nowak Jan 30000.00 109 Pakulski Damian 20400.00
W zdaniach SQL można umieszczać wyliczenia polegające na dodawaniu, odej-mowaniu, mnożeniu i dzieleniu – oczywiście w odniesieniu do kolumn, które zawiera-ją wartości liczbowe. W wyliczeniach może wystąpić więcej niż jedna kolumna; przy-kładowo, w tabeli PRODUKTY pamiętane są w kolumnie Cena_jedn ceny jednostkowe poszczególnych pozycji oraz w kolumnie Ilość – ilość produktu na sta-nie. Po pomnożeniu obu kolumn przez siebie otrzymamy wartość całkowitą całego zapasu każdego z produktów:
SELECT Id_P, nazwa, ilosc*cena_jedn FROM PRODUKTY
ID_P Nazwa Ilość * Cena_jedn
10 t-shirt 2000.00 11 t-shirt 2000.00 12 t-shirt 2250.00 13 bluza 5000.00 14 bluza 5000.00 15 dres 3600.00 16 dres 2500.00 17 szorty 1500.00
W przypadkach układania zapytań z wyliczeniami często wykorzystuje się możli-wość stosowania tzw. nazw zastępczych (aliasów) dla kolumn zawierających wyniki wyliczeń. Możliwość nadania nazwy aliasowej zapewnia klauzula AS:
SELECT Id_P, nazwa, ilosc*cena_jedn AS Wartość_towaru FROM PRODUKTY
ID_P Nazwa Wartość_towaru
10 t-shirt 2000.00 11 t-shirt 2000.00 12 t-shirt 2250.00 13 bluza 5000.00 14 bluza 5000.00 15 dres 3600.00 16 dres 2500.00 17 szorty 1500.00
Podane przykłady konstrukcji zdań SQL dotyczyły sytuacji, gdy z tabel wybierane były wszystkie wiersze. Nie zawsze jednak zachodzi taka potrzeba. Klauzula WHERE umożliwia wyszukiwanie wierszy, które spełniają określone kryteria. Do konstruowa-nia kryteriów wyszukiwakonstruowa-nia używa się:
• Operatorów porównania
= równy, > większy,
< > nie równy, <= mniejszy równy, < mniejszy, >= większy równy. • Operatorów logicznych
AND, OR, NOT, w odniesieniu do których obowiązują następujące reguły: – wyrażenia w kryterium wyboru są przeliczane od strony lewej do prawej, – jeżeli w kryterium wyboru znajdują się podwyrażenia w nawiasach, są one
wyliczane pierwsze,
– warunki z operatorami NOT są wyliczane przed warunkami z operatorami AND i OR,
– warunki z operatorami AND są wyliczane przed OR. • Operatorów SQL
BETWEEN AND, IN/NOT IN, LIKE/NOT LIKE, IS NULL/IS NOT NULL.
Zapytania z zastosowaniem operatorów porównania
Generowanie listy pracowników, których uposażenie miesięczne jest mniejsze niż 2000,00 zł.
SELECT Id_pracownika, Nazwisko, Imię, Uposażenie FROM PRACOWNICY
WHERE Uposażenie < 2000
Id_pracownika Nazwisko Imię Uposażenie
103 Kowalski Piotr 1800.00
125 Gawron Anna 1500.00
109 Pakulski Damian 1700.00
Zapytania z zastosowaniem operatorów logicznych
Za pomocą operatorów logicznych konstruowane są złożone kryteria wyszukiwa-nia. Przykładowo, lista produktów w rozmiarze „s” lub „xl”:
SELECT *
FROM PRODUKTY
WHERE Rozmiar = ‘s’ OR Rozmiar = ‘xl’
ID_P Nazwa Opis Rozmiar Kolor Ilość Cena_jedn
12 t-shirt męski XL czarny 150 15.00
15 dres damski S granatowy 80 45.00
Zapytania z zastosowaniem operatorów SQL
• Zastosowanie operatora BETWEEN/NOT BETWEEN
Lista produktów, których cena zawarta jest między 10 zł a 15 zł SELECT Id_p, Nazwa, Opis, Ilość, Cena_jedn
FROM PRODUKTY
WHERE Cena_jedn BETWEEN 10 AND 15
ID_P Nazwa Opis Ilość Cena_jedn
10 t-shirt damski 200 10.00
11 t-shirt damski 200 10.00
12 t-shirt męski 150 15.00
17 szorty damskie 120 12.50
Użycie operatora SQL BETWEEN AND jest równoważne z zastosowaniem dwóch operatorów porównania:
SELECT Id_p, Nazwa, Opis, Ilość, Cena_jedn FROM PRODUKTY
WHERE Cena_jedn >=10 AND Cena_jedn <= 15
W podanym przykładzie warto zwrócić uwagę na przewagę stosowania operato-rów SQL nad operatorami matematycznymi – składnia zdania SELECT jest zdecydo-wanie prostsza w pierwszym przypadku.
• Zastosowanie operatora IN/NOT IN
Lista pracowników pracujących na stanowiskach kierowniczych lub samodzielnych SELECT Nazwisko, Imię, Stanowisko
FROM PRACOWNICY
WHERE Stanowisko IN (‘kierownik’, ‘specjalista’, ‘menedżer’)
Nazwisko Imię Stanowisko
Bielski Leszek kierownik Wyzga Anatol menedżer
Adamska Ewa specjalista
Bielska Janina specjalista
Nowak Jan menedżer
Podobnie w tym przypadku konstrukcja z operatorem IN może być zastąpiona przez:
SELECT Nazwisko, Imię, Stanowisko FROM PRACOWNICY
WHERE Stanowisko = ‘kierownik’ OR Stanowisko = ‘menedżer’ OR Stanowisko = ‘specjalista’
• Kryterium wyboru z zastosowaniem wzorca wyszukiwania – operator LIKE/NOT LIKE
Znakiem używanym do tworzenia wzorca wyszukiwania jest „%”, znak ten repre-zentuje dowolną sekwencję znaków w łańcuchu, natomiast podkreślenie, czyli „_” oznacza dowolny pojedynczy znak w łańcuchu. Przykłady wzorców:
‘B%’ – oznacza, że szukany jest łańcuch znaków rozpoczynający się na literę B, ‘B___’ – oznacza, że szukany jest łańcuch o długości 4 znaków, rozpoczynający się na literę B,
‘%B’ – oznacza, że szukany jest łańcuch znaków o długości przynajmniej = 1, z literą B na końcu,
‘%B% – oznacza, że szukany jest łańcuch znaków zawierający na dowolnej pozy-cji literę B.
Lista nazwisk, imion i dat urodzenia pracowników, których nazwiska zaczynają się na literę B:
SELECT Nazwisko, Imię, Data_ur FROM PRACOWNICY
WHERE Nazwisko LIKE ‘B%’
Nazwisko Imię Data_ur
Bielska Janina 1958-07-15 Bielski Leszek 1955-12-04 Burski Adam 1975-04-10
Wszystkie wymienione operatory SQL (BETWEEN, IN, LIKE) mogą być użyte w składni zdania z zaprzeczeniem NOT; gdyby w poleceniu prezentowanym powyżej użyte zostało zaprzeczenie NOT, oznaczałoby to wybór pracowników, których nazwi-ska nie zaczynają się na literę B:
SELECT Nazwisko, Imię, Data_ur WHERE Nazwisko
FROM PRACOWNICY NOT LIKE ‘B%’