Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałMałgorzata Andrejczuk Został zmieniony 11 lat temu
1
POWTÓRZENIE definicja danych; opcje definicji kolumn;
deklaracje dodatkowe do definicji tabeli; modyfikacja struktury tabel; usuwanie tabel; wprowadzanie danych; usuwanie wierszy; modyfikowanie danych; wprowadzanie poleceń z pliku; wprowadzanie danych z pliku.
2
Kontrola integralności danych:
Rozważmy teraz elementy standardu SQL, które zostały wprowadzone w celu kontroli integralności danych. Polega ona na przestrzeganiu więzów, które nakładamy na dane, aby uniknąć niespójnego stanu bazy danych. Mamy do dyspozycji pięć rodzajów więzów integralności: dane wymagane; więzy dziedzinowe; integralność encji; integralność referencyjna (związków); więzy ogólne. Wszystkie one mogą być zdefiniowane w poleceniach CREATE i ALTER TABLE.
3
1. Dane wymagane: W standardzie ISO (również w MySQL) możemy zdefiniować więzy danych wymaganych poprzez umieszczenie w poleceniach CREATE i ALTER TABLE przy kolumnie klauzuli NOT NULL. Klauzulą domyślną w standardzie ISO jest dopuszczanie wartości pustych.
4
CHECK (warunek_selekcji)
2. Więzy dziedzinowe: Z każdą kolumną związana jest dziedzina, czyli zbiór dopuszczalnych wartości. Na przykład, pleć pracownika może być zapisana jako 'M' lub 'K', czyli dziedziną kolumny płeć w tabeli jest łańcuch znaków długości jeden równy 'M' lub 'K'. Standard ISO opisuje dwa mechanizmy określania dziedziny w poleceniach CREATE i ALTER TABLE. Pierwszy z nich to klauzula CHECK, która pozwala ograniczyć dopuszczalne wartości dla konkretnej kolumny lub dla całej tabeli, zapisujemy ją następująco: CHECK (warunek_selekcji)
5
W więzach kolumnowych w klauzuli CHECK można odwoływać się jedynie do kolumny, dla której jest zdefiniowana klauzula. Tak więc, by zagwarantować, że w kolumnie płeć będzie mogła występować tylko wartość 'M' lub 'K', możemy zdefiniować tę kolumnę następująco: plec CHAR NOT NULL CHECK (plec IN ('M','K'))
6
Standard ISO zezwala również na niezależne od tabel definiowanie dziedzin za pomocą polecenia CREATE DOMAIN: CREATE DOMAIN NazwaDziedziny [AS] typ_danych [DEFAULT wartość__domyślna] [CHECK (warunek_selekcji)] W ten sposób dziedzinie przypisuje się nazwę NazwaDziedziny, typ danych i, opcjonalnie, wartość domyślną. Również opcjonalnie można zdefiniować regułę poprawności dla dziedziny za pomocą klauzuli CHECK.
7
Np. możemy zdefiniować dziedzinę dla atrybutu płeć następująco:
CREATE DOMAIN RodzajPlci AS CHAR DEFAULT 'M' CHECK (VALUE IN ('M','K')); Polecenie to tworzy dziedzinę RodzajPlci, która składa się z pojedynczych znaków o wartości 'M' lub 'K'. Teraz, definiując kolumnę płeć, możemy zastosować nazwę dziedziny RodzajPłci zamiast typu danych CHAR: plec RodzajPlci NOT NULL
8
Oba polecenia nie funkcjonują jednak w MySQL.
Parametr warunek_selekcji może wymagać odwołania się do innej tabeli. Na przykład, możemy stworzyć dziedzinę NumerBiura, by upewnić się, że wprowadzane wartości odpowiadają numerom biur występującym w tabeli Biuro: CREATE DOMAIN NumerBiura AS CHAR(4) CHECK (VALUE IN (SELECT biuroNr FROM Biuro)); Zazwyczaj lepiej jest definiować więzy dziedzinowe za pomocą polecenia CREATE DOMAIN niż tylko CHECK. Oba polecenia nie funkcjonują jednak w MySQL.
9
Dziedzinę można usunąć z bazy danych poleceniem DROP DOMAIN:
DROP DOMAIN NazwaDziedziny [RESTRICTI CASCADE] Zasięg usunięcia, RESTRICT lub CASCADE, określa tryb postępowania w przypadku, gdy usuwamy używaną aktualnie dziedzinę. RESTRICT - i dziedzina jest wykorzystywana w istniejącej tabeli, perspektywie lub asercji, to usunięcie nie zostanie wykonane. CASCADE - to w każdej kolumnie tabeli, dla której jako typ danych określono usuwaną dziedzinę, typ ten zostanie zamieniony na typ, w oparciu, o który jest zdefiniowana usuwana dziedzina. Także wartość domyślna i więzy kolumny zostaną zastąpione wartością domyślną i więzami usuwanej dziedziny, o ile występowały w definicji dziedziny.
10
3. Integralność encji: Klucz główny tabeli musi zawierać unikalną, niepustą wartość w każdym wierszu. Na przykład, każdy wiersz tabeli Nieruchomość ma unikalny numer nieruchomości nieruchomośćNr, który jednoznacznie określa nieruchomość zapisaną w tym wierszu. Standard ISO pozwala kontrolować integralność encji za pomocą klauzuli PRIMARY KEY w poleceniach CREATE i ALTER TABLE. Na przykład, aby zdefiniować klucz główny tabeli Nieruchomość dodajemy klauzule: PRIMARY KEY(nieruchomośćNr)
11
Aby zdefiniować złożony klucz główny, przy klauzuli PRIMARY KEY podajemy nazwy kilku kolumn oddzielone przecinkami. Na przykład, aby zdefiniować klucz główny tabeli Wizyta, składający się z kolumn klientNr i nieruchomośćNr, dodajemy klauzulę: PRIMARY KEY(klientNr, nieruchomośćNr) Klauzula PRIMARY KEY może wystąpić tylko raz w definicji tabeli.
12
Mimo to istnieje możliwość zapewnienia unikalności wartości kluczy alternatywnych. Służy do tego słowo kluczowe UNIQUE. Każda kolumna, która wystąpi w klauzuli UNIQUE, musi być także określona jako NOT NULL. W tabeli może wystąpić tyle klauzul UNIQUE, ile jest potrzebnych. SQL odrzuci każdą operację INSERT i UPDATE, która będzie powodowała utworzenie duplikatu wartości dowolnego klucza kandydującego (głównego lub alternatywnego). Na przykład, dla tabeli Wizyta moglibyśmy w definicji napisać: klientNr VARCHAR{5) NOT NULL, nieruchomośćNr VARCHAR(5) NOT NULL, UNIQUE (klientNr, nieruchomośćNr)
13
4. Integralność referencyjna:
Klucz obcy to kolumna lub zbiór kolumn, łączących każdy wiersz tabeli podrzędnej, w której występują, z wierszem tabeli nadrzędnej zawierającym wartość klucza kandydującego równą ich wartości. Integralność referencyjna oznacza, że jeśli w polach klucza obcego występują pewne wartości, to muszą odnosić się one do istniejącego, poprawnego wiersza w tabeli nadrzędnej. Standard ISO pozwala definiować klucze obce za pomocą klauzuli FOREIGN KEY w poleceniach CREATE i ALTER TABLE.
14
Na przykład, aby zdefiniować klucz obcy biuroNr w tabeli Nieruchomość, dodajemy klauzulę:
FOREIGN KEY(biuroNr) REFERENCES Biuro W podklauzuli PREFERENCES podaje się nazwę tabeli nadrzędnej oraz listę kolumn klucza kandydującego (w przypadku braku listy przyjmuje się, że tym kluczem jest klucz główny tabeli nadrzędnej). SQL odrzuci każdą operacje INSERT lub UPDATE, jeżeli w jej następstwie powstałaby wartość klucza obcego, do której nie pasuje żadna wartość klucza kandydującego w tabeli nadrzędnej.
15
Przebieg operacji DELETE lub UPDATE, powodującej zmianę lub usunięcie takiej wartości klucza kandydującego, której odpowiadają pewne wiersze w tabeli podrzędnej, zależy od akcji referencyjnej zdefiniowanej za pomocą podklauzuli ON UPDATE lub ON DELETE w klauzuli FOREIGN KEY. W SQL są określone cztery tryby postępowania w przypadku, gdy użytkownik próbuje usunąć wiersz z tabeli nadrzędnej, a w tabeli podrzędnej istnieją związane z nim wiersze: CASCADE – usunięcie wiersza z tabeli nadrzędnej automatycznie powoduje usunięcie związanych z nim wierszy z tabeli podrzędnej. SET NULL – usunięcie wiersza z tabeli nadrzędnej i zastąpienie wartości klucza obcego w jego wierszach podrzędnych wartością pustą.
16
SET DEFAULT – usuniecie wiersza z tabeli nadrzędnej i zastąpienie wartości klucza obcego w jego wierszach podrzędnych wartością domyślną. NO ACTION - zaniechanie operacji usunięcia z tabeli nadrzędnej. Jest to domyślny tryb postępowania, przyjmowany, gdy w definicji nie występuje reguła ON DELETE. SQL umożliwia takie same operacje w przypadku, gdy klucz kandydujący w tabeli nadrzędnej zostanie zmodyfikowany.
17
Powiązania kluczy obcych:
18
Próba wykonania polecenia z nieistniejącą wartością w tabeli nadrzędnej:
mysql> INSERT INTO personel VALUES ('SL33', 'Paweł', 'Biały','asystent','M',' ',1100,'B008'); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`biuro`.`personel`, CONSTRAINT `biuroNr` FOREIGN KEY (`biuroNr`) REFERENCES `biuro` (`biuroNr`) ON DELETE CASCADE ON UPDATE CASCADE) mysql>
19
Aktualizacja obiektów w tabeli nadrzędnej:
mysql> UPDATE biuro SET biuroNr='B008' WHERE miasto='Augustów' and ulica='Akacjowa 16'; Query OK, 1 rows affected (0.03 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql> SELECT * FROM biuro; | biuroNr | ulica | miasto | kod | | B | Piękna | Białystok | | | B | Cicha | Łomża | | | B | Mała | Białystok | | | B | Miodowa 32 | Grajewo | | | B | Dobra | Łomża | | | B | Słoneczna 55 | Białystok | | | B | Akacjowa 16 | Augustów | | 7 rows in set (0.02 sec)
20
mysql> SELECT * FROM personel;
21
Usuwanie obiektów z tabeli nadrzędnej:
mysql> DELETE FROM biuro WHERE ulica='Akacjowa 16'; Query OK, 1 row affected (0.05 sec) mysql> SELECT * FROM biuro; | biuroNr | ulica | miasto | kod | | B | Piękna | Białystok | | | B | Cicha | Łomża | | | B | Mała | Białystok | | | B | Miodowa 32 | Grajewo | | | B | Dobra | Łomża | | | B | Słoneczna 55 | Białystok | | 6 rows in set (0.00 sec)
22
Kolejność usuwania tabel powiązanych: DROP TABLE personel, biuro;
mysql> SELECT * FROM personel; Kolejność usuwania tabel powiązanych: DROP TABLE personel, biuro;
23
5. Więzy ogólne: Możliwości zmian w tabelach mogą być ograniczone więzami ogólnymi (nazywanymi w SQL asercjami) rządzącymi przebiegiem rzeczywistych transakcji, z których takie zmiany wynikają. Standard ISO pozwala specyfikować więzy ogólne za pomocą klauzul CHECK i UNIQUE w poleceniach CREATE i ALTER TABLE oraz za pomocą polecenia CREATE ASSERTION: CREATE ASSERTION nazwa_asercji CHECK (warunek_selekcji)
24
Np. aby zdefiniować warunek zapobiegający jednoczesnemu nadzorowaniu przez pracownika więcej niż stu nieruchomości, możemy napisać: CREATE ASSERTION PracownikNadzorującyNieZaDużo CHECK (NO EXISTS (SELECT pracownikNr FROM Nieruchomość GROUP BY pracownikNr HAVING COUNT(*)>100));
25
Przykład: Utwórz tabelę Nieruchomość.
CREATE DOMAIN NumeryWłaścieli AS VARCHAR(5) CHECK (VALUE IN (SELECT właścicielNr FROM WłaścicielPrywatny)); CREATE DOMAIN Numery Pracowników AS VARCHAR(5) CHECK (VALUE IN (SELECT pracownikNr FROM Personel)); CREATE DOMAIN NumeryBiur AS CHAR(4) CHECK (VALUE IN (SELECT biuroNr FROM Biuro)); CREATE DOMAIN NumeryNieruchomoŚci AS VARCHAR(5);
26
CREATE DOMAIN Ulice AS VARCHAR(25);
CREATE DOMAIN Miasta AS VARCHAR(15): CREATE DOMAIN KodyPocztowe AS VARCHAR(8); CREATE DOMAIN TypyNieruchomości AS CHAR(l) CHECK(VALUE IN ('B','C','D','E','F','M','S')); CREATE DOMAIN PokojeWNieruchomoś AS SMALLINT CHECK(VALUE BETWEEN 1 AND 15); CREATE DOMAIN OpłatyZaWynajęcie AS DECIMAL(6,2) CHECK(VALUE BETWEEN 0 AND );
27
CREATE TABLE Nieruchomość (
nieruchomośćNr NumeryNieruchomości NOT NULL, ulica Ulice NOT NULL, miasto Miasta NOT NULL, kod Pocztowy Kody Pocztowe, typ TypyNieruchomości NOT NULL DEFAULT 'M', pokoje PokojeWNieruchomoś NOT NULL DEFAULT 4, czynsz OpłatyZaWynajęcie NOT NULL DEFAULT 600, właścicielNr NumeryWłaścicieli NOT NULL,
28
pracownikNr NumeryPracowników
CONSTRAINT PracownikNadzorującyNieZaDużo CHECK (NOT EXISTS (SELECT pracownikNr FROM Nieruchomość GROUP BY pracownikNr HAYING COUNT{*) > 100)), BiuroNr NumeryBiur NOT NULL, PRIMARY KEY (nieruchomośćNr), FOREIGN KEY (pracownikNr) REFERENCES Personel ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (właścicielNr) REFERENCES Właściciel Prywatny ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY (biuroNr) REFERENCES Biuro ON DELETE NO ACTION ON UPDATE CASCADE);
29
Kolumnie typ, która wskazuje rodzaj nieruchomości przypisano wartość domyślną 'M' czyli mieszkanie.
Dla kolumny zawierającej numer pracownika zdefiniowano klauzule CONSTRAINT gwarantującą, że dany pracownik nie nadzoruje zbyt wielu nieruchomości, czyli ich liczba nie przekracza 100.
30
Instrukcja SELECT: Instrukcja SELECT jest podstawową instrukcją języka SQL, służącą głównie (choć nie tylko) do pobierania danych z tabeli lub tabel na podstawie zadanych warunków. Wynikiem jej wywołania (o ile nie wystąpi błąd) jest zawsze pewna tabela. Składnia tej instrukcji jest dość złożona; należy przy tym pamiętać, że kolejność klauzul (tj. odpowiednich słów kluczowych) jest istotna. SELECT wyrażenie W tej postaci instrukcja SELECT zwróci po prostu wartość podanego wyrażenia (zbudowanego z wykorzystaniem stałych i funkcji). Dokładniej mówiąc, zwróci ona tabelę składającą się z jednego wiersza i jednej kolumny, zawierającą wartość tego wyrażenia.
31
SELECT wyrażenie1, wyrażenie2, ...
Tym razem wynikiem będzie tabela o jednym wierszu i o kolumnach zawierających kolejno wartości podanych wyrażeń. SELECT wyrażenie1, wyrażenie2, ... FROM tabela W takiej postaci instrukcji SELECT sygnalizujemy, że dane chcemy pobierać z tabeli wymienionej po słowie kluczowym FROM. Możemy teraz, budując wyrażenia, używać nazw kolumn z tej tabeli. Kolejność kolumn w tabeli wynikowej będzie taka, jak kolejność podanych wyrażeń. W szczególności, wyrażenia mogą być po prostu nazwami interesujących nas kolumn.
32
Szczególny przypadek to
SELECT * FROM tabela: co spowoduje wypisanie całej tabeli. Inna postać z warunkiem: SELECT wyrażenie1, wyrażenie2, ... FROM tabela WHERE warunek Warunek podany po słowie kluczowym WHERE ogranicza działanie instrukcji SELECT do wierszy spełniających ten warunek. Powinien on być wyrażeniem logicznym, zbudowanym z wykorzystaniem nazw kolumn tabeli.
33
Proste przykłady: mysql> SELECT 2+2; +-----+ | 2+2 | | 4 |
| 4 | mysql> SELECT SQRT(16); | SQRT(16) | | | mysql> SELECT IF(5>6,1,2); | IF(5>6,1,2) | | |
34
Komentarze w liniach komend:
mysql> SELECT 1+1; # Komentarz do końca linii mysql> SELECT 1+1; -- Komentarz do końca linii mysql> SELECT 1 /* komentarz w linii */ + 1; mysql> SELECT 1+ /* komentarz składający się z wielu linii */ 1;
35
Składnia: jest najczęściej używaną instrukcją SQL i ma następującą postać ogólną: SELECT [ALLDISTINCT] {*[wyrażenie_kolumnowe [AS nowa_nazwa]],[...]} FROM NazwaTabeli [alias],[...] [WHERE warunek_selekcji_wierszy] [GROUP BY lista_kolumn] [HAVING warunek_selekcji_grup] [ORDER BY lista_kolumn];
36
SELECT – wskazuje, które kolumny powinny pojawić się w wyniku;
DISTINCT – eliminuje powtórzenia po wykonaniu rzutowania na wybrane kolumny; FROM – określa tabelę (lub tabele), z których będziemy korzystać; WHERE – pozwala wybrać wiersze spełniające zadany warunek selekcji wierszy; GROUP BY – tworzy grupy wierszy o tej samej wartości wskazanej kolumny; HAVING – pozwala wybrać grupy ze względu na podany warunek selekcji grup; ORDER BY – określa uporządkowanie wyniku.
37
Wyszukiwanie wszystkich wierszy:
1. Wszystkie kolumny i wszystkie wiersze: SELECT * FROM personel; mysql> SELECT * FROM personel; | personelNr | imie | nazwisko | stanowisko | plec | dataUr | pensja | biuroNr | | SA | Katarzyna | Morawska | kierownik | K | | | B | | SA | Maria | Hojna | asystent | K | | | B | | SB | Sabina | Bober | dyrektor | K | | | B | | SB | Daniel | Frankowski | kierownik | M | | | B | | SB | Małgorzata | Kowalska | asystent | K | | | B | | SB | Anna | Biały | asystent | K | | | B | | SB | Katarzyna | Michalska | dyrektor | K | | | B | | SB | Dawid | Piotrowski | asystent | M | | | B | | SB | Małgorzata | Plichta | asystent | K | | | B | | SG | Karolina | Mucha | dyrektor | K | | | B | | SG | Piotr | Cybulski | asystent | M | | | B | | SL | Paweł | Nowak | kierownik | M | | | B | | SL | Paweł | Kowalski | asystent | M | | | B | | SL | Monika | Munk | asystent | K | | | B | | SL | Jan | Wiśniewski | dyrektor | M | | | B | | SL | Julia | Lisicka | asystent | K | | | B | | SL | Michał | Brzęczyk | asystent | M | | | B | 17 rows in set (0.00 sec)
38
2. Wybrane kolumny i wszystkie wiersze:
SELECT personelNr, imie, nazwisko, pensja FROM personel; mysql> SELECT personelNr, imie, nazwisko, pensja -> FROM personel; | personelNr | imie | nazwisko | pensja | | SA | Katarzyna | Morawska | | | SA | Maria | Hojna | | | SB | Sabina | Bober | | | SB | Daniel | Frankowski | | | SB | Małgorzata | Kowalska | | | SB | Anna | Biały | | | SB | Katarzyna | Michalska | | | SB | Dawid | Piotrowski | | | SB | Małgorzata | Plichta | | | SG | Karolina | Mucha | | | SG | Piotr | Cybulski | | | SL | Paweł | Nowak | | | SL | Paweł | Kowalski | | | SL | Monika | Munk | | | SL | Jan | Wiśniewski | | | SL | Julia | Lisicka | | | SL | Michał | Brzęczyk | | 17 rows in set (0.00 sec)
39
SELECT personelNr, imie, nazwisko, pensja FROM personel
3. Sortowanie wyników - wybrane kolumny i wszystkie wiersze uporządkowane malejąco: SELECT personelNr, imie, nazwisko, pensja FROM personel ORDER BY pensja DESC; mysql> SELECT personelNr, imie, nazwisko, pensja -> FROM personel -> ORDER BY pensja DESC; | personelNr | imie | nazwisko | pensja | | SL | Jan | Wiśniewski | | | SB | Katarzyna | Michalska | | | SB | Sabina | Bober | | | SG | Karolina | Mucha | | | SB | Daniel | Frankowski | | | SA | Katarzyna | Morawska | | | SL | Paweł | Nowak | | | SG | Piotr | Cybulski | | | SB | Małgorzata | Plichta | | | SB | Anna | Biały | | | SB | Dawid | Piotrowski | | | SL | Monika | Munk | | | SB | Małgorzata | Kowalska | | | SL | Paweł | Kowalski | | | SL | Michał | Brzęczyk | | | SA | Maria | Hojna | | | SL | Julia | Lisicka | | 17 rows in set (0.00 sec)
40
4. Porządkowanie według wielu kolumn:
SELECT nieruchomoscNr, typ, pokoje, czynsz FROM nieruchomosc ORDER BY typ, czynsz DESC; mysql> SELECT nieruchomoscNr, typ, pokoje, czynsz -> FROM nieruchomosc -> ORDER BY typ, czynsz DESC; | nieruchomoscNr | typ | pokoje | czynsz | | G | dom | | | | A | dom | | | | B | dom | | | | B | mieszkanie | | | | L | mieszkanie | | | | B | mieszkanie | | | | B | mieszkanie | | | 7 rows in set (0.01 sec)
41
SELECT DISTINCT nieruchomoscNr FROM wizyta;
5. Eliminacja powtórzeń DISTINCT – podaj numery nieruchomości odwiedzone przez klientów: SELECT DISTINCT nieruchomoscNr FROM wizyta; mysql> SELECT DISTINCT nieruchomoscNr -> FROM wizyta; | nieruchomoscNr | | A | | B | | B | 3 rows in set (0.00 sec)
42
SELECT nieruchomoscNr FROM wizyta;
5. z powtórzeniami: SELECT nieruchomoscNr FROM wizyta; mysql> SELECT nieruchomoscNr FROM wizyta; | nieruchomoscNr | | A | | B | | B | 5 rows in set (0.01 sec)
43
6a. Wyliczanie pensji rocznej:
SELECT personelNr, imie, nazwisko, pensja*12 AS pensja_Roczna FROM personel; mysql> SELECT personelNr, imie, nazwisko, pensja*12 AS pensjaRoczna FROM personel; | personelNr | imie | nazwisko | pensja_Roczna | | SA | Katarzyna | Morawska | | | SA | Maria | Hojna | | | SB | Sabina | Bober | | | SB | Daniel | Frankowski | | | SB | Małgorzata | Kowalska | | | SB | Anna | Biały | | | SB | Katarzyna | Michalska | | | SB | Dawid | Piotrowski | | | SB | Małgorzata | Plichta | | | SG | Karolina | Mucha | | | SG | Piotr | Cybulski | | | SL | Paweł | Nowak | | | SL | Paweł | Kowalski | | | SL | Monika | Munk | | | SL | Jan | Wiśniewski | | | SL | Julia | Lisicka | | | SL | Michał | Brzęczyk | | 17 rows in set (0.00 sec)
44
Aliasy nazw kolumn i wyrażeń:
Jako argumenty klauzul ORDER BY i GROUP BY nie mogą być użyte wyrażenia złożone. Można tu użyć jedynie nazw kolumn, lub - jeżeli chcemy grupować lub sortować według wartości wyrażeń złożonych - aliasy tych wyrażeń. Do stworzenia aliasu dla wyrażenia podanego w instrukcji SELECT stosuje się słowo kluczowe AS, w sposób następujący: SELECT wyrażenie1, wyrażenie2 AS alias FROM złączenie ORDER BY alias Alias nadany wyrażeniu staje się nazwą odpowiedniej kolumny tabeli wynikowej (zamiast dosłownej postaci tego wyrażenia).
45
6a. wyliczanie pensji rocznej (bez alias’u):
SELECT personelNr, imie, nazwisko, pensja*12 FROM personel; mysql> SELECT personelNr, imie, nazwisko, pensja*12 AS pensjaRoczna FROM personel; | personelNr | imie | nazwisko | pensja*12 | | SA | Katarzyna | Morawska | | | SA | Maria | Hojna | | | SB | Sabina | Bober | | | SB | Daniel | Frankowski | | | SB | Małgorzata | Kowalska | | | SB | Anna | Biały | | | SB | Katarzyna | Michalska | | | SB | Dawid | Piotrowski | | | SB | Małgorzata | Plichta | | | SG | Karolina | Mucha | | | SG | Piotr | Cybulski | | | SL | Paweł | Nowak | | | SL | Paweł | Kowalski | | | SL | Monika | Munk | | | SL | Jan | Wiśniewski | | | SL | Julia | Lisicka | | | SL | Michał | Brzęczyk | | 17 rows in set (0.07 sec)
46
6b. wyliczanie wieku i jego ograniczenie:
SELECT personelNr, imie, nazwisko, stanowisko, dataUr, Year(Now())- Year(dataUr) AS wiek FROM personel WHERE (Year(Now())-Year(dataUr))>40; mysql> SELECT personelNr, imie, nazwisko, stanowisko, dataUr, Year(Now())- Year(dataUr) AS wiek FROM personel WHERE (Year(Now())-Year(dataUr))>40; | personelNr | imie | nazwisko | stanowisko | dataUr | wiek | | SB | Sabina | Bober | dyrektor | | 70 | | SB | Daniel | Frankowski | kierownik | | 52 | | SB | Anna | Biały | asystent | | 50 | | SB | Katarzyna | Michalska | dyrektor | | 50 | | SG | Karolina | Mucha | dyrektor | | 57 | | SL | Paweł | Nowak | kierownik | | 48 | | SL | Paweł | Kowalski | asystent | | 41 | | SL | Jan | Wiśniewski | dyrektor | | 65 | | SL | Julia | Lisicka | asystent | | 45 | | SL | Michał | Brzęczyk | asystent | | 51 | 10 rows in set (0.04 sec)
47
6b. wyliczanie wieku i jego ograniczenie (bez alias’u):
SELECT personelNr, imie, nazwisko, stanowisko, dataUr, Year(Now())- Year(dataUr) FROM personel WHERE (Year(Now())-Year(dataUr))>40; mysql> SELECT personelNr, imie, nazwisko, stanowisko, dataUr, Year(Now())-Year(dataUr) FROM personel WHERE (Year(Now())-Year(dataUr))>40; | personelNr | imie | nazwisko | stanowisko | dataUr | Year(Now())-Year(dataUr) | | SB | Sabina | Bober | dyrektor | | | | SB | Daniel | Frankowski | kierownik | | | | SB | Anna | Biały | asystent | | | | SB | Katarzyna | Michalska | dyrektor | | | | SG | Karolina | Mucha | dyrektor | | | | SL | Paweł | Nowak | kierownik | | | | SL | Paweł | Kowalski | asystent | | | | SL | Jan | Wiśniewski | dyrektor | | | | SL | Julia | Lisicka | asystent | | | | SL | Michał | Brzęczyk | asystent | | | 10 rows in set (0.04 sec)
48
Wybieranie wierszy: 7. warunek selekcji: porównanie pensja do stałej
SELECT personelNr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja>1000; mysql> SELECT personelNr, imie, nazwisko, stanowisko, pensja -> FROM personel -> WHERE pensja>1000; | personelNr | imie | nazwisko | stanowisko | pensja | | SA | Katarzyna | Morawska | kierownik | | | SB | Sabina | Bober | dyrektor | | | SB | Daniel | Frankowski | kierownik | | | SB | Anna | Biały | asystent | | | SB | Katarzyna | Michalska | dyrektor | | | SB | Dawid | Piotrowski | asystent | | | SB | Małgorzata | Plichta | asystent | | | SG | Karolina | Mucha | dyrektor | | | SG | Piotr | Cybulski | asystent | | | SL | Paweł | Nowak | kierownik | | | SL | Monika | Munk | asystent | | | SL | Jan | Wiśniewski | dyrektor | | 12 rows in set (0.01 sec)
49
SELECT biuroNr, ulica, miasto, kod FROM Biuro
8. złożony warunek selekcji: porównanie – podaj adresy biur w Łomży lub w Białymstoku SELECT biuroNr, ulica, miasto, kod FROM Biuro WHERE miasto='Łomża' OR miasto="Białystok"; mysql> SELECT biuroNr, ulica, miasto, kod -> FROM biuro -> WHERE miasto='Łomża' OR miasto="Białystok"; | biuroNr | ulica | miasto | kod | | B | Piękna | Białystok | | | B | Cicha | Łomża | | | B | Mała | Białystok | | | B | Dobra | Łomża | | | B | Słoneczna 55 | Białystok | | 5 rows in set (0.00 sec)
50
9. warunek selekcji przynależność do zbioru:
SELECT biuroNr, ulica, miasto, kod FROM biuro WHERE miasto IN ('Łomża','Białystok'); mysql> SELECT biuroNr, ulica, miasto, kod -> FROM biuro -> WHERE miasto IN ('Łomża', 'Białystok'); | biuroNr | ulica | miasto | kod | | B | Piękna | Białystok | | | B | Cicha | Łomża | | | B | Mała | Białystok | | | B | Dobra | Łomża | | | B | Słoneczna 55 | Białystok | | 5 rows in set (0.40 sec)
51
WHERE miasto NOT IN ('Łomża','Białystok');
czy też spoza zbioru: WHERE miasto NOT IN ('Łomża','Białystok'); mysql> SELECT biuroNr, ulica, miasto, kod -> FROM biuro -> WHERE miasto NOT IN ('Łomża', 'Białystok'); | biuroNr | ulica | miasto | kod | | B | Miodowa 32 | Grajewo | | | B | Akacjowa 16 | Augustów | | | B | Świerkowa 5 | Woźniewo | | | B | Olchowa 12 | Mińsk | NULL | 6 rows in set (0.02 sec)
52
SELECT personelNr, imie, nazwisko, stanowisko FROM personel
Inny przykład: SELECT personelNr, imie, nazwisko, stanowisko FROM personel WHERE stanowisko IN ('kierownik','dyrektor'); mysql> SELECT personelNr, imie, nazwisko, stanowisko -> FROM personel -> WHERE stanowisko IN ('kierownik','dyrektor'); | personelNr | imie | nazwisko | stanowisko | | SA | Katarzyna | Morawska | kierownik | | SB | Sabina | Bober | dyrektor | | SB | Daniel | Frankowski | kierownik | | SB | Katarzyna | Michalska | dyrektor | | SG | Karolina | Mucha | dyrektor | | SL | Paweł | Nowak | kierownik | | SL | Jan | Wiśniewski | dyrektor | 7 rows in set (0.00 sec)
53
lub: SELECT personelNr, imie, nazwisko, stanowisko FROM personel
WHERE stanowisko NOT IN ('kierownik','dyrektor'); mysql> SELECT personelNr, imie, nazwisko, stanowisko -> FROM personel -> WHERE stanowisko NOT IN ('kierownik','dyrektor'); | personelNr | imie | nazwisko | stanowisko | | SA | Maria | Hojna | asystent | | SB | Małgorzata | Kowalska | asystent | | SB | Anna | Biały | asystent | | SB | Dawid | Piotrowski | asystent | | SB | Małgorzata | Plichta | asystent | | SG | Piotr | Cybulski | asystent | | SL | Paweł | Kowalski | asystent | | SL | Monika | Munk | asystent | | SL | Julia | Lisicka | asystent | | SL | Michał | Brzęczyk | asystent | 10 rows in set (0.00 sec)
54
10a. Selekcja pensji z zakresu:
SELECT personelNr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja BETWEEN 2000 AND 3000; mysql> SELECT personelNr, imie, nazwisko, stanowisko, pensja -> FROM personel -> WHERE pensja BETWEEN 2000 AND 3000; | personelNr | imie | nazwisko | stanowisko | pensja | | SB | Sabina | Bober | dyrektor | | | SB | Katarzyna | Michalska | dyrektor | | | SG | Karolina | Mucha | dyrektor | | | SL | Jan | Wiśniewski | dyrektor | | 4 rows in set (0.01 sec)
55
10a. Selekcja pensji z zakresu:
lub SELECT personelNr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja>=2000 AND pensja<=3000; mysql> SELECT personelNr, imie, nazwisko, stanowisko, pensja -> FROM personel -> WHERE pensja>=2000 AND pensja<=3000; | personelNr | imie | nazwisko | stanowisko | pensja | | SB | Sabina | Bober | dyrektor | | | SB | Katarzyna | Michalska | dyrektor | | | SG | Karolina | Mucha | dyrektor | | | SL | Jan | Wiśniewski | dyrektor | | 4 rows in set (0.00 sec)
56
10b. Selekcja czynszu z zakresu oraz miast
SELECT nieruchomoscNr, miasto, typ, czynsz FROM nieruchomosc WHERE miasto='Białystok' AND czynsz BETWEEN 350 AND 450 OR miasto='Augustów'; mysql> SELECT nieruchomoscNr, miasto, typ, czynsz -> FROM nieruchomosc -> WHERE miasto='Białystok' AND czynsz BETWEEN 350 AND 450 OR miasto='Augustów'; | nieruchomoscNr | miasto | typ | czynsz | | A | Augustów | dom | | | B | Białystok | mieszkanie | | | B | Białystok | mieszkanie | | 3 rows in set (0.00 sec)
57
11. warunek selekcji – dopasowanie do wzorca
SELECT wlascicielNr, imie, nazwisko, adres, telefon FROM wlasciciel WHERE adres LIKE '%Białystok%'; lub WHERE adres LIKE "*Białystok*"; (w Access‘ie) mysql> SELECT wlascicielNr, imie, nazwisko, adres, telefon -> FROM wlasciciel -> WHERE adres LIKE '%Białystok%'; | wlascicielNr | imie | nazwisko | adres | telefon | | CO | Tatiana | Marcinkowski | Białystok, Wodna | | | CO | Karol | Frankowski | Białystok, Agrestowa 6 | | | CO | Tomasz | Szymański | Białystok, Parkowa 12 | | 3 rows in set (0.00 sec)
58
SELECT klientNr, data_wizyty, uwagi FROM wizyta
12. Warunek selekcji – wartości puste – podaj informacje wizytach w nieruchomości B4, po których nie zgłoszono uwag: SELECT klientNr, data_wizyty, uwagi FROM wizyta WHERE nieruchomoscNr='B4' AND uwagi IS NULL; mysql> SELECT klientNr, data_wizyty, uwagi -> FROM wizyta -> WHERE nieruchomoscNr='B4' AND uwagi IS NULL; | klientNr | data_wizyty | uwagi | | CR | | NULL | 1 row in set (0.00 sec)
59
WHERE nieruchomoscNr=‘B4’ AND uwagi IS NOT NULL;
lub zgłoszono uwagi: WHERE nieruchomoscNr=‘B4’ AND uwagi IS NOT NULL; mysql> SELECT klientNr, data_wizyty, uwagi -> FROM wizyta -> WHERE nieruchomoscNr='B4' AND uwagi IS NOT NULL; | klientNr | data_wizyty | uwagi | | CR | | brak jadalni | | CR | | za daleko | 2 rows in set (0.01 sec)
60
tabela wizyta: mysql> SELECT * FROM wizyta;
| klientnr | nieruchomoscnr | data_wizyty | uwagi | | CR | A | | za mały | | CR | B | | brak jadalni | | CR | A | | brak jadalni | | CR | B | | NULL | | CR | B | | NULL | | CR | B | | za daleko | 6 rows in set (0.00 sec)
61
Zastosowanie funkcji agregujących:
W standardzie ISO zdefiniowanych jest pięć funkcji agregujących: COUNT – zwraca liczbę wartości występujących w określonej kolumnie; SUM – zwraca sumę wartości występujących w określonej kolumnie; AVG – zwraca średnią wartości występujących w określonej kolumnie; MIN – zwraca najmniejszą wartość występującą w określonej kolumnie; MAX – zwraca największą wartość występującą w określonej kolumnie.
62
Funkcje COUNT, MIN i MAX można stosować zarówno do pól liczbowych jak i nieliczbowych.
Natomiast SUM i AVG jedynie do pól liczbowych. Funkcje agregujące mogą być stosowane jedynie na liście SELECT i w klauzuli HAVING
63
W MySQL istnieją następujące funkcje agregujące:
COUNT(wyrażenie) – zlicza wiersze, dla których wyrażenie przyjmuje wartość różną od NULL; AVG(wyrażenie) – oblicza średnią wartość wyrażenia dla uwzględnionych wierszy; MIN(wyrażenie), MAX(wyrażenie) – podają odpowiednio minimalną i maksymalną wartość wyrażenia dla uwzględnionych wierszy; SUM(wyrażenie) – sumuje wyrażenie po uwzględnionych wierszach; STD(wyrażenie) lub STDDEV(wyrażenie) – oblicza standardowe odchylenie wyrażenia; BIT_OR(wyrażenie), BIT_AND(wyrażenie) – alternatywa i odpowiednio koniunkcja bitów wyrażenia.
64
Liczba ocen każdego ucznia:
Przykłady: Liczba ocen każdego ucznia: mysql> SELECT uczen, COUNT(*)FROM oceny -> GROUP BY uczen; | uczen | COUNT(*) | | | | | | | 2 rows in set (0.05 sec)
65
Liczba ocen każdego ucznia z każdego przedmiotu:
mysql> SELECT przedmiot, uczen, COUNT(*) AS liczba -> FROM oceny GROUP BY przedmiot, uczen; | przedmiot | uczen | liczba | | biologia | | | | biologia | | | | matematyka | | | | matematyka | | | | polski | | | | polski | | | 6 rows in set (0.00 sec)
66
Liczba ocen każdego ucznia z wybranych przedmiotów:
mysql> SELECT przedmiot, uczen, COUNT(*) AS liczba -> FROM oceny -> WHERE przedmiot='polski' OR przedmiot='matematyka' -> GROUP BY przedmiot, uczen; | przedmiot | uczen | liczba | | matematyka | | | | matematyka | | | | polski | | | | polski | | |
67
Minimum z kolumny w grupie (jaką ma najgorszą ocenę z przedmiotu dany uczeń):
mysql> SELECT uczen, przedmiot, MIN(ocena) AS najgorsza -> FROM oceny GROUP BY uczen, przedmiot; | uczen | przedmiot | najgorsza | | | biologia | | | | matematyka | | | | polski | | | | biologia | | | | matematyka | | | | polski | |
68
Diagram związków:
69
Diagram związków:
70
SELECT Count(*) AS liczba FROM nieruchomosc WHERE czynsz>400;
13. Policz z ograniczeniem – w ilu nieruchomościach miesięczny czynsz jest wyższy od 350: SELECT Count(*) AS liczba FROM nieruchomosc WHERE czynsz>400; mysql> SELECT Count(*) AS liczba -> FROM nieruchomosc -> WHERE czynsz>400; | liczba | | | 1 row in set (0.00 sec)
71
Tabela nieruchomosc: mysql> SELECT nieruchomoscNr, ulica, miasto, typ, czynsz FROM nieruchomosc; | nieruchomoscNr | ulica | miasto | typ | czynsz | | A | Handlowa 16 | Augustów | dom | | | B | Nowa | Białystok | mieszkanie | | | B | Mała | Białystok | mieszkanie | | | B | Leśna | Białystok | mieszkanie | | | B | Dobra | Białystok | dom | | | G | Długa | Grajewo | dom | | | L | Akacjowa 6 | Łomża | mieszkanie | | 7 rows in set (0.00 sec)
72
SELECT Count(nieruchomoscNr) AS liczba FROM wizyta
14. Policz z ograniczeniem daty - ile nieruchomości odwiedzono w maju 2010: SELECT Count(nieruchomoscNr) AS liczba FROM wizyta WHERE Month(data_wizyty)=5 AND Year(data_wizyty)=2010; mysql> SELECT Count(nieruchomoscNr) AS liczba FROM wizyta -> WHERE Month(data_wizyty)=5 AND Year(data_wizyty)=2010; | liczba | | | 1 row in set (0.70 sec)
73
tabela wizyta: mysql> SELECT * FROM wizyta;
| klientnr | nieruchomoscnr | data_wizyty | uwagi | | CR | A | | za mały | | CR | B | | brak jadalni | | CR | A | | brak jadalni | | CR | B | | NULL | | CR | B | | NULL | | CR | B | | za daleko | 6 rows in set (0.00 sec)
74
SELECT COUNT(personelNr) AS liczba, SUM(pensja) AS suma FROM personel
15. Policz i sumuj – oblicz ilu jest dyrektorów i jaka jest ich sumaryczna pensja: SELECT COUNT(personelNr) AS liczba, SUM(pensja) AS suma FROM personel WHERE stanowisko='dyrektor'; mysql> SELECT COUNT(personelNr) AS liczba, SUM(pensja) AS suma -> FROM personel -> WHERE stanowisko='dyrektor'; | liczba | suma | | | | 1 row in set (0.00 sec)
75
SELECT MIN(pensja) AS min, MAX(pensja) AS max, AVG(pensja) AS srednia
16. Minimum, maksimum i średnia – policz parametry pensji wszystkich pracowników: SELECT MIN(pensja) AS min, MAX(pensja) AS max, AVG(pensja) AS srednia FROM personel; mysql> SELECT MIN(pensja) AS min, MAX(pensja) AS max, -> AVG(pensja) AS srednia -> FROM personel; | min | max | srednia | | 900 | 3000 | | 1 row in set (0.04 sec)
76
Grupowanie wyniku – klauzula GROUP BY
Zapytanie grupujące – zapytanie SELECT zawierające klauzulę GROUP BY – w trakcie jego obliczania dane z tabeli SELECT są dzielone na grupy i dla każdej z grup jest generowany jeden wiersz podsumowania. Kolumny grupowania – kolumny wymienione w klauzuli GROUP BY.
77
17. Policz z grupowaniem – ile jest nieruchomości w każdym mieście:
SELECT miasto, COUNT(nieruchomoscNr) AS liczba FROM nieruchomosc GROUP BY miasto; mysql> SELECT miasto, COUNT(nieruchomoscNr) AS liczba -> FROM nieruchomosc -> GROUP BY miasto; | miasto | liczba | | Łomża | | | Augustów | | | Białystok | | | Grajewo | | 4 rows in set (0.00 sec)
78
GROUP BY biuroNr ORDER BY biuroNr;
18. Policz z grupowaniem i sumowaniem - dla każdego biura liczbę pracowników i ich sumaryczną pensję: SELECT biuroNr, COUNT(personelNr) AS liczba, SUM(pensja) AS suma FROM personel GROUP BY biuroNr ORDER BY biuroNr; mysql> SELECT biuroNr, COUNT(personelNr) AS liczba, -> SUM(pensja) AS suma FROM personel -> GROUP BY biuroNr ORDER BY biuroNr; | biuroNr | liczba | suma | | B | | 3600 | | B | | 6400 | | B | | 3500 | | B | | 4900 | | B | | 4800 | | B | | 2600 | 6 rows in set (0.39 sec)
79
Wybór grup – klauzula HAVING
19. Policz z grupowaniem i wyborem grupy - dla każdego biura zatrudniającego więcej niż jednego (dwóch) pracowników, podaj ich liczbę oraz sumę ich zarobków: SELECT biuroNr, COUNT(personelNr) AS liczba, SUM(pensja) AS suma FROM personel GROUP BY biuroNr HAVING COUNT(personelNr)>1 ORDER BY biuroNr;
80
mysql> SELECT biuroNr, COUNT(personelNr) AS liczba,
-> SUM(pensja) AS suma -> FROM personel -> GROUP BY biuroNr -> HAVING COUNT(personelNr)>1 -> ORDER BY biuroNr; | biuroNr | liczba | suma | | B | | 3600 | | B | | 6400 | | B | | 3500 | | B | | 4900 | | B | | 4800 | | B | | 2600 | 6 rows in set (0.00 sec)
81
mysql> SELECT biuroNr, COUNT(personelNr) AS liczba,
-> SUM(pensja) AS suma -> FROM personel -> GROUP BY biuroNr -> HAVING COUNT(personelNr)>2 -> ORDER BY biuroNr; | biuroNr | liczba | suma | | B | | 3600 | | B | | 6400 | | B | | 4900 | | B | | 4800 | 4 rows in set (0.00 sec)
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.