Bazy Danych
Europejska Wyższa Szkoła Informatyczno-
Ekonomiczna
Mgr inż. Piotr Greniewski
Wykład 5: Podstawy SQL – część 2
Copyright by Piotr Greniewski
2
Spis treści
Bazy danych wstęp
Geneza relacyjnych baz danych
Podstawy relacyjnych baz danych
Podstawy-SQL-1
Podstawy-SQL-2
Podstawy-SQL-3
Operacje na danych
Transakcje i blokady
Normalizacja
Copyright by Piotr Greniewski
3
Funkcje skalarne i arytmetyczne
-
Podsumowanie
Funkcje arytmetyczne mogą być używane w
klauzuli SELECT oraz WHERE.
Kolumny wyliczone mogą być nazwane przez
zastosowanie klauzuli AS.
Funkcje skalarne mogą być używane do
zmiany reprezentacji danych.
Funkcje skalarne mogą być używane do
wydobycia lat, miesięcy oraz dni z różnych
formatów daty.
Wyrażenie CASE pozwala na wybór wartości
dla kolumny w zależności od zdefiniowanego
warunku.
Copyright by Piotr Greniewski
4
Funkcje kolumnowe i grupujące
-
Funkcje kolumnowe
Istnieją następujące funkcje kolumnowe, które
mogą być używane w klauzulach SELECT i
HAVING:
SUM – funkcja oblicza sumę wartości w określonych
kolumnach;
AVG – oblicza średnią wartość w kolumnie;
MIN- znajduje minimalną wartość w kolumnie;
MAX – znajduje maksymalną wartość w kolumnie;
COUNT – służy do zliczania wystąpień pewnej
wartości w wierszach.
Copyright by Piotr Greniewski
5
Funkcje kolumnowe i grupujące
-
Funkcje kolumnowe
Zapytanie wyświetlające całkowitą sumę
pensji wszystkich pracowników, średnią
pensję, minimalną i maksymalną pensję oraz
ilość pracowników.
SELECT SUM (p.pensja) AS Pensja,
AVG (p.pensja) AS Srednia,
MIN (p.pensja) AS Pensja_min,
MAX (p.pensja) AS Pensja_max
COUNT (*) AS Ilosc
FROM pracownicy p;
6.1
Copyright by Piotr Greniewski
6
Funkcje kolumnowe i grupujące
-
Funkcje kolumnowe
Funkcja COUNT może być używana do zliczania
wierszy zawierających powtarzającą się wartość.
Zapytanie zlicza liczbę działów i stanowisk w firmie.
SELECT COUNT ( DISTINC p.dzial ) AS ilosc_dzialow,
COUNT ( DISTINC p.stanowisko) AS
ilosc_stanowisk
FROM pracownicy p;
6.2
Copyright by Piotr Greniewski
7
Funkcje kolumnowe i grupujące
-
Funkcje kolumnowe
Stosowanie funkcji kolumnowych można przeprowadzić
również na pewnym podzbiorze wierszy, stosując
klauzulę WHERE
.
SELECT SUM (p.pensja) AS pensja,
AVG (p.pensja) AS srednia,
MIN (p.pensja) AS pensja_min,
MAX (p.pensja) AS pensja_max
COUNT (*) AS ilosc
FROM pracownicy p
WHERE p.dzial = ‘obsluga klienta’;
6.3
Copyright by Piotr Greniewski
8
Funkcje kolumnowe i grupujące
-
Klauzula GROUP BY
Klauzula GROUP BY grupuje wiersze o tej
samej wartości wyszczególnionych kolumn.
Funkcje agregujące w klauzuli SELECT operują
na każdej grupie osobno.
SELECT p.stanowisko, SUM (p.pensja) AS pensja,
AVG (p.pensja) AS srednia,
MIN (p.pensja) AS pensja_min,
MAX (p.pensja) AS pensja_max
COUNT (*) AS ilosc
FROM
pracownicy p
GROUP BY p.stanowisko
ORDER BY p.stanowisko;
6.5
Copyright by Piotr Greniewski
9
Funkcje kolumnowe i grupujące
-
Klauzula HAVING
Klauzulę HAVING używamy razem z klauzulą GROUP BY
w celu ograniczenia wyświetlanych grup. Warunek
szukania musi zawierać funkcję agregującą. Po
zgrupowaniu wierszy przez klauzulę GROUP BY, klauzula
HAVING wyświetla tylko te wiersze spośród
zgrupowanych, które spełniają warunki wyszczególnione
w klauzuli HAVING.
SELECT p.nazwisko, SUM (w.cena)
FROM
pracownicy p, wypozyczenia w
WHERE p.nr_p = w.prac_wyd
GROUP BY p.nazwisko
HAVING SUM (w.cena) > 400
ORDER BY p.nazwisko;
6.7
Copyright by Piotr Greniewski
10
Funkcje kolumnowe i grupujące
-
Podsumowanie
Funkcje kolumnowe mogą być użyte tylko w
klauzulach SELECT i HAVING.
Klauzula SELECT może zawierać tylko funkcje
kolumnowe oraz kolumny wskazywane w
klauzuli ORDER BY.
Klauzula HAVING może zawierać dowolne
funkcje kolumnowe operujące na dowolnych
kolumnach tabeli. Te kolumny nie muszą być
wyspecyfikowane w klauzuli SELECT.
Copyright by Piotr Greniewski
11
Klauzula UNION
-
Łączenie wielu wyników zapytania
Klauzula UNION łączy dwa lub więcej polecenia
SELECT w jedną tabelę wynikową.
Klauzule SELECT muszą zwracać tę samą liczbę
kolumn.
Kolumny pokrywające muszą mieć tę samą szerokość i
typ danych.
Nazwy kolumn mogą być różne.
Klauzula UNION łączy dwa ( lub więcej) zestawy
wyników w jeden i jednocześnie usuwa duplikaty.
Copyright by Piotr Greniewski
12
Klauzula UNION
-
Łączenie wielu wyników zapytania
Zapytanie zwraca dane o imieniu i nazwisku
wszystkich klientów i pracowników, których
nazwiska kończą się na „ski”. Ponieważ duplikaty
są usuwane tylko jedna osoba o nazwisku Jan
Kowalski będzie na liście.
SELECT imie, nazwisko
FROM
klienci
WHERE nazwisko LIKE ‘%ski’
UNION
SELECT imie, nazwisko
FROM
pracownicy
WHERE nazwisko LIKE ‘%ski’;
7.2
Copyright by Piotr Greniewski
13
Klauzula UNION
-
Łączenie wielu wyników zapytania
Klauzula UNION wyświetla wyniki uporządkowane
rosnąco. Jeśli chcemy zmienić porządek sortowania
musimy klauzulę ORDER BY umieścić na końcu.
SELECT imie, nazwisko
FROM
klienci
WHERE nazwisko LIKE ‘%SKI’
UNION
SELECT imie, nazwisko
FROM
pracownicy
WHERE nazwisko LIKE ‘%SKI’
ORDER BY nazwisko DESC;
7.3
Copyright by Piotr Greniewski
14
Klauzula UNION
-
Klauzula UNION ALL
Różnica pomiędzy klauzulą UNION a UNION ALL
polega na tym, że wynik łączenia zapytań klauzulą
UNION ALL zawiera powtarzające się wiersze.
Klauzula UNION ALL działa szybciej niż UNION.
SELECT imie, nazwisko
FROM
klienci
WHERE nazwisko LIKE ‘%ski’
UNION ALL
SELECT imie, nazwisko
FROM
pracownicy
WHERE nazwisko LIKE ‘%ski’
ORDER BY nazwisko DESC;
7.3
Copyright by Piotr Greniewski
15
Klauzula UNION
-
Podsumowanie
Wyniki zapytania SELECT z tą samą liczbą kolumn,
będących tego samego typu danych, mogą być łączone
przy pomocy klauzuli UNION.
Klauzula UNION sortuje dane wynikowe i usuwa
duplikaty.
Klauzula UNION ALL działa szybciej niż UNION.
Użyj klauzuli UNION ALL gdy jesteś pewien, że łączone
wyniki nie zawierają duplikatów
Copyright by Piotr Greniewski
16
Pod-zapytania
-
Używanie pod-zapytań
Chcemy wyszukać pracowników, którzy otrzymują
wynagrodzenie w kwocie wyższej niż średnia. Sprawdzamy
najpierw jaka jest średnia pensja w naszym przedsiębiorstwie.
SELECT AVG (p.pensja)
FROM
pracownicy p;
-----------------------------------------
Wynik wynosi 1530;
8.1
Teraz szukamy pracowników zarabiających powyżej
średniej.
SELECT p.imie, p.nazwisko, p.dzial, p.stanowisko
FROM
pracownicy p;
WHERE p.pensja > 1530;
8.1
Copyright by Piotr Greniewski
17
Pod-zapytania
-
Używanie pod-zapytań
Można to zrobić przy użyciu jednego pod-zapytania
SELECT p.imie, p.nazwisko, p.dzial, p.stanowisko
FROM
pracownicy p
WHERE p.pensja > (SELECT AVG (p.pensja)
FROM
pracownicy p);
8.1
Copyright by Piotr Greniewski
18
Pod-zapytania
-
Używanie słowa kluczowego NOT IN
Słowo kluczowe NOT IN pozwala na zidentyfikowanie wszystkich
elementów w zbiorze A, które nie występują w zbiorze B.
Tomasz Adamczak
Warszawa
Paweł
Fiodorowicz Warszawa
Anna
Kowalska
Wrocław
Piotr
Malczyk
Warszawa
Tomasz
Adamczak
Warszawa
Aniela
Dalgiewicz
Wrocław
Krzyszto
f
Dobrowols
ki
Wrocław
Anna
Kowalska
Wrocław
NOT
IN
ZBIÓR A
ZBIÓR B
Paweł
Fiodorowic
z
Warszawa
Piotr
Malczyk
Warszawa
A NOT IN
B
Copyright by Piotr Greniewski
19
Pod-zapytania
-
Używanie słowa kluczowego NOT IN
Poniższe zapytanie wyświetla listę samochodów, których do tej
pory nie wypożyczył żaden klient. Zapytanie wybiera te
samochody, które nie znajdują się w tabeli wypożyczenia.
SELECT s.nr_samochodu, s.marka, s.typ
FROM
samochody s
WHERE s.nr_samochodu
NOT IN
( SELECT w.nr_samochodu
FROM wypozyczenia w);
8.3
Copyright by Piotr Greniewski
20
Pod-zapytania
-
Używanie słowa kluczowego ALL
Zapytanie będzie wykonywane w dwóch krokach. Najpierw wykonywane
jest pod-zapytanie, które znajduje średnią pensję w każdym dziale.
Następnie każda pensja pracownika, porównywana jest z listą średnich
pensji. Wyświetleni zostaną pracownicy, których pensja jest wyższa od
wszystkich średnich pensji obliczonych w pod-zapytaniu.
SELECT p.imie, p.nazwisko, p.dzial, p.stanowisko,
p.pensja
FROM
pracownicy p
WHERE
p.pensja > ALL ( SELECT AVG (p.pensja)
FROM pracownicy p
GROUP BY p.dzial);
8.3