Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałAlicja Galant Został zmieniony 10 lat temu
1
POWTÓRZENIE Kontrola integralności danych; dane wymagane;
więzy dziedzinowe; integralność encji; integralność referencyjna (związków); więzy ogólne. Zapytania SELECT; Funkcje agregujące; Przykłady.
2
Podzapytania - zapytania SELECT umieszczone w innym zapytaniu SELECT
2. Podzapytanie z równością – podaj wszystkich pracowników zatrudnionych w biurze przy ulicy Dobrej 22: SELECT personelNr, imie, nazwisko, stanowisko FROM personel WHERE biuroNr=(SELECT biuroNr FROM biuro WHERE ulica = 'Dobra 22');
3
mysql> SELECT personelNr, imie, nazwisko, stanowisko
-> FROM personel -> WHERE biuroNr=(SELECT biuroNr -> FROM biuro WHERE ulica = 'Dobra 22'); | personelNr | imie | nazwisko | stanowisko | | SL | Jan | Wiśniewski | dyrektor | | SL | Julia | Lisicka | asystent | | SL | Michał | Brzęczyk | asystent | 3 rows in set (0.01 sec)
4
3. Podzapytanie z funkcją agregującą – podaj wszystkich
3. Podzapytanie z funkcją agregującą – podaj wszystkich pracowników, których pensja jest wyższa od średniej; pokaż różnice między poszczególnymi pensjami a średnią: SELECT personelNr, imie, nazwisko, stanowisko, pensja, pensja-(SELECT AVG(pensja)FROM personel) AS roznica FROM personel WHERE pensja>(SELECT AVG(pensja) FROM personel) ORDER BY pensja;
5
mysql> SELECT personelNr, imie, nazwisko, stanowisko, pensja,
-> pensja-(SELECT AVG(pensja)FROM personel) AS roznica -> FROM personel -> WHERE pensja>(SELECT AVG(pensja) FROM personel) -> ORDER BY pensja; | personelNr | imie | nazwisko | stanowisko | pensja | roznica | | SA | Katarzyna | Morawska | kierownik | | | | SB | Daniel | Frankowski | kierownik | | | | SG | Karolina | Mucha | dyrektor | | | | SB | Sabina | Bober | dyrektor | | | | SB | Katarzyna | Michalska | dyrektor | | | | SL | Jan | Wiśniewski | dyrektor | | | 6 rows in set (0.06 sec) mysql> SELECT AVG(pensja) FROM personel; | AVG(pensja) | | | 1 row in set (0.00 sec)
6
4a. Podzapytania zagnieżdżone - powtórzenia właścicieli nieruchomości:
SELECT wlascicielNr, nieruchomoscNr, miasto, ulica FROM nieruchomosc WHERE wlascicielNr IN (SELECT wlascicielNr FROM nieruchomosc GROUP BY wlascicielNr HAVING Count(*)>1 ) ORDER BY wlascicielNr;
7
mysql> SELECT wlascicielNr, nieruchomoscNr, miasto, ulica
-> FROM nieruchomosc -> WHERE wlascicielNr IN (SELECT wlascicielNr FROM nieruchomosc -> GROUP BY wlascicielNr HAVING Count(*)>1 ) -> ORDER BY wlascicielNr; | wlascicielNr | nieruchomoscNr | miasto | ulica | | CO | B | Białystok | Dobra 18 | | CO | L | Łomża | Akacjowa 6 | | CO | B | Białystok | Nowa | | CO | B | Białystok | Mała | 4 rows in set (0.06 sec)
8
4b. Podzapytania zagnieżdżone podwójnie - podaj wszystkie nieruchomości nadzorowane przez pracowników zatrudnionych w biurze przy ulicy Małej 63: SELECT nieruchomoscNr, miasto, ulica FROM nieruchomosc WHERE personelNr IN (SELECT personelNr FROM personel WHERE biuroNr = (SELECT biuroNr FROM biuro WHERE ulica = 'Mała 63'));
9
mysql> SELECT nieruchomoscNr, miasto, ulica
-> FROM nieruchomosc -> WHERE personelNr IN (SELECT personelNr FROM personel -> WHERE biuroNr = (SELECT biuroNr FROM biuro WHERE -> ulica = 'Mała 63')); | nieruchomoscNr | miasto | ulica | | B | Białystok | Nowa 5 | | B | Białystok | Mała 2 | | B | Białystok | Leśna 6 | | B | Białystok | Dobra 18 | 4 rows in set (0.01 sec)
10
5. Zastosowanie ANY / SOME - znajdź wszystkich pracowników, którzy mają pensję wyższą niż przynajmniej jeden pracownik biura o numerze B003 SELECT personelNr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja > ANY (SELECT pensja FROM personel WHERE biuroNr='B003');
11
mysql> SELECT personelNr, imie, nazwisko, stanowisko, pensja
-> FROM personel -> WHERE pensja > SOME (SELECT pensja FROM personel WHERE biuroNr='B003'); | 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.00 sec)
12
6. zastosowanie ALL - znajdź wszystkich pracowników, którzy mają pensję wyższą niż pensja każdego z pracowników biura o numerze B003 SELECT personelNr, imie, nazwisko, stanowisko, pensja FROM personel WHERE pensja > ALL (SELECT pensja FROM personel WHERE biuroNr='B003');
13
mysql> SELECT personelNr, imie, nazwisko, stanowisko, pensja
-> FROM personel -> WHERE pensja > ALL (SELECT pensja FROM personel WHERE biuroNr='B003'); | personelNr | imie | nazwisko | stanowisko | pensja | | SB | Katarzyna | Michalska | dyrektor | | | SL | Jan | Wiśniewski | dyrektor | | 2 rows in set (0.04 sec)
14
Pracownicy biura B003 i ich zarobki:
mysql> SELECT personelNr, imie, nazwisko, pensja -> FROM personel WHERE biuroNr = 'B003' -> ORDER BY pensja DESC; | personelNr | imie | nazwisko | pensja | | SB | Sabina | Bober | | | SB | Daniel | Frankowski | | | SB | Anna | Biały | | | SB | Małgorzata | Kowalska | | 4 rows in set (0.00 sec)
15
Wszyscy pracownicy biur i ich zarobki:
mysql> SELECT personelNr, imie, nazwisko, pensja, biuroNr -> FROM personel ORDER BY pensja DESC; | personelNr | imie | nazwisko | pensja | biuroNr | | SL | Jan | Wiśniewski | | B | | SB | Katarzyna | Michalska | | B | | SB | Sabina | Bober | | B | | SG | Karolina | Mucha | | B | | SB | Daniel | Frankowski | | B | | SA | Katarzyna | Morawska | | B | | SL | Paweł | Nowak | | B | | SG | Piotr | Cybulski | | B | | SB | Małgorzata | Plichta | | B | | SB | Anna | Biały | | B | | SB | Dawid | Piotrowski | | B | | SL | Monika | Munk | | B | | SB | Małgorzata | Kowalska | | B | | SL | Paweł | Kowalski | | B | | SL | Michał | Brzęczyk | | B | | SA | Maria | Hojna | | B | | SL | Julia | Lisicka | | B | 17 rows in set (0.00 sec)
16
Zapytania dotyczące wielu tabel
17
Proste złączenie dwóch tabel
SELECT k.klientNr, imie, nazwisko, nieruchomoscNr, uwagi FROM klient k, wizyta w WHERE k.klientNr = w.klientNr; mysql> SELECT k.klientNr, imie, nazwisko, nieruchomoscNr, uwagi -> FROM klient k, wizyta w -> WHERE k.klientNr = w.klientNr; | klientNr | imie | nazwisko | nieruchomoscNr | uwagi | | CR | Michał | Rafalski | A | za mały | | CR | Michał | Rafalski | B | brak jadalni | | CR | Ludwik | Wierzba | A | brak jadalni | | CR | Ludwik | Wierzba | B | NULL | | CR | Ludwik | Wierzba | B | NULL | | CR | Janusz | Kalinowski | B | za daleko | 6 rows in set (0.03 sec) Dla każdej z tabel wymienionych w klauzuli FROM można zdefiniować nazwę zastępczą - alias.
18
Złączenia tabel: Instrukcja SELECT o postaci:
SELECT wyrażenie1, wyrażenie2, FROM tabela1, tabela2, ... zwraca tabelę o kolumnach zawierających wartości podanych wyrażeń, obliczone dla iloczynu kartezjańskiego (pełnego złączenia) podanych tabel.
19
Iloczyn kartezjański SELECT k.klientNr, imie, nazwisko, nieruchomoscNr, uwagi FROM klient k, wizyta w; mysql> SELECT k.klientNr, imie, nazwisko, nieruchomoscNr, uwagi -> FROM klient k, wizyta w; | klientNr | imie | nazwisko | nieruchomoscNr | uwagi | | CO | Alicja | Stefańska | A | za mały | | CO | Alicja | Stefańska | B | brak jadalni | | CO | Alicja | Stefańska | A | brak jadalni | | CO | Alicja | Stefańska | B | NULL | | CO | Alicja | Stefańska | B | NULL | | CO | Alicja | Stefańska | B | za daleko | | CO | Katarzyna | Winiarska | A | za mały | | CO | Katarzyna | Winiarska | B | brak jadalni | | CO | Katarzyna | Winiarska | A | brak jadalni | | CO | Katarzyna | Winiarska | B | NULL | | CO | Katarzyna | Winiarska | B | NULL | | CO | Katarzyna | Winiarska | B | za daleko | | CO | Anna | Nowak | A | za mały | | CO | Anna | Nowak | B | brak jadalni | | CO | Anna | Nowak | A | brak jadalni | ...
20
| CO18 | Anna | Nowak | B36 | NULL |
| CO | Anna | Nowak | B | za daleko | | CR | Michał | Rafalski | A | za mały | | CR | Michał | Rafalski | B | brak jadalni | | CR | Michał | Rafalski | A | brak jadalni | | CR | Michał | Rafalski | B | NULL | | CR | Michał | Rafalski | B | NULL | | CR | Michał | Rafalski | B | za daleko | | CR | Ludwik | Wierzba | A | za mały | | CR | Ludwik | Wierzba | B | brak jadalni | | CR | Ludwik | Wierzba | A | brak jadalni | | CR | Ludwik | Wierzba | B | NULL | | CR | Ludwik | Wierzba | B | NULL | | CR | Ludwik | Wierzba | B | za daleko | | CR | Janusz | Kalinowski | A | za mały | | CR | Janusz | Kalinowski | B | brak jadalni | | CR | Janusz | Kalinowski | A | brak jadalni | | CR | Janusz | Kalinowski | B | NULL | | CR | Janusz | Kalinowski | B | NULL | | CR | Janusz | Kalinowski | B | za daleko | | CR | Maria | Tomaszewska | A | za mały | | CR | Maria | Tomaszewska | B | brak jadalni | | CR | Maria | Tomaszewska | A | brak jadalni | | CR | Maria | Tomaszewska | B | NULL | | CR | Maria | Tomaszewska | B | NULL | | CR | Maria | Tomaszewska | B | za daleko | 42 rows in set (0.00 sec)
21
Najczęściej bardziej przydatne są zapytania wykorzystujące równozłączenia tabel, a nie iloczyny kartezjańskie. Dokonuje się tego za pomocą odpowiednio dobranego warunku w klauzuli WHERE: SELECT wyrażenie1, wyrażenie2, ... FROM tabela1, tabela2, ... WHERE warunek Notacje: tabela1, tabela2 tabela1 JOIN tabela2 są równoważne. Warunek w klauzuli WHERE powinien być wyrażeniem logicznym dotyczącym kolumn złączanych tabel, dyktuje on które wiersze iloczynu kartezjańskiego zostaną uwzględnione w złączeniu.
22
Inny sposób złączenia tabel to złączenie zewnętrzne.
MySQL implementuje dwie postacie zapisu lewostronnego złączenia zewnętrznego: tabela1 LEFT [OUTER] JOIN tabela2 ON warunek gdzie warunek po słowie kluczowym ON może być dowolnym wyrażeniem logicznym zbudowanym z wykorzystaniem nazw kolumn złączanych tabel. Oraz druga postać: USING (kolumna1, kolumna2, ...)
23
Lista nazw kolumn po słowie kluczowym USING musi zawierać kolumny występujące w obu złączanych tabelach pod tymi samymi nazwami. Inaczej mówiąc, notacja powyższa jest równoważna zapisowi tabela1 LEFT [OUTER] JOIN tabela2 ON tabela1.kolumna1=tabela2.kolumna1 AND tabela1.kolumna2=tabela2.kolumna2 ... Słowo kluczowe OUTER jest opcjonalne i nie ma wpływu na efekt złączenia.
24
Definicja (lewostronnego) złączenia zewnętrznego oznacza, że jeżeli w ,,prawej'' tabeli brak wiersza ,,pasującego'' do pewnego wiersza tabeli ,,lewej'' (tzn. spełniającego warunek złączenia), to stworzony zostanie wiersz zawierający wartość NULL we wszystkich kolumnach pochodzących z tabeli ,,prawej''. Dodatkowo istnieje jeszcze operacja naturalnego złączenia lewostronnego: tabela1 NATURAL LEFT [OUTER] JOIN tabela2 będąca po prostu skrótowym zapisem złączenia z klauzulą USING zawierającą jako argument listę nazw wszystkich kolumn powtarzających się w obu złączanych tabelach.
25
Złączenia Operacja złączenia kojarzy dane z dwóch tabel, tworząc pary z wierszy, w których kolumny złączenia mają taką samą wartość. Dla złączenia wewnętrznego – jeżeli wiersz tabeli nie zostanie połączony w parę (z żadnym wierszem z drugiej tabeli), to nie trafia do tabeli wynikowej. Złączenie zewnętrzne zachowuje wiersze niespełniające warunku złączenia.
26
7. Złączenie wewnętrzne - podaj biura i nieruchomości znajdujące się w tym samym mieście: mysql> SELECT * FROM biuro2; | biuronr | miasto | | B002 | Łomża | | B003 | Białystok | | B004 | Grajewo | mysql> SELECT * FROM nieruchomosc2; | nieruchomoscr | miasto | | A | Augustów | | B | Białystok | | L | Łomża | SELECT Biuro2.*, Nieruchomosc2.* FROM Biuro1 INNER JOIN Nieruchomosc2 ON Biuro2.miasto = Nieruchomosc2.miasto;
27
Polecenie równoważne: SELECT biuro2.*, nieruchomosc2.*
mysql> SELECT biuro2.*, nieruchomosc2.* -> FROM biuro2 INNER JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; | biuroNr | miasto | nieruchomoscNr | miasto | | B | Białystok | B | Białystok | | B | Łomża | L | Łomża | 2 rows in set (0.00 sec) Polecenie równoważne: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 INNER JOIN nieruchomosc2 USING(miasto);
28
Przykład na innych tabelach:
SELECT biuro.biuronr, biuro.miasto, personel.personelnr, personel.nazwisko, personel.biuronr FROM biuro INNER JOIN personel ON biuro.biuronr = personel.biuronr;
29
8. Lewostronne złączenie zewnętrzne:
- podaj biura i nieruchomości znajdujące się w tym samym mieście, umieść również te biura, w których nie zarejestrowano żadnej nieruchomości: SELECT Biuro2.*, Nieruchomosc2.* FROM Biuro2 LEFT JOIN Nieruchomosc2 ON Biuro2.miasto = Nieruchomosc2.miasto; mysql> SELECT biuro2.*, nieruchomosc2.* -> FROM biuro2 LEFT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; | biuroNr | miasto | nieruchomoscNr | miasto | | B | Łomża | L | Łomża | | B | Białystok | B | Białystok | | B | Grajewo | NULL | NULL | 3 rows in set (0.02 sec)
30
SELECT biuro2.*, nieruchomosc2.*
Z dodanymi warunkami: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto) WHERE nieruchomosc2.miasto IS NULL; mysql> SELECT biuro2.*, nieruchomosc2.* -> FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto) -> WHERE nieruchomosc2.miasto IS NULL; | biuroNr | miasto | nieruchomoscNr | miasto | | B | Grajewo | NULL | NULL | 1 row in set (0.00 sec)
31
Przykład na innych tabelach:
SELECT biuro.biuronr, biuro.miasto, personel.personelnr, personel.nazwisko, personel.biuronr FROM biuro LEFT JOIN personel ON biuro.biuronr = personel.biuronr;
32
9. Prawostronne złączenie zewnętrzne:
- podaj biura i nieruchomości znajdujące się w tym samym mieście, umieść również nieruchomości nie zarejestrowane w żadnym biurze: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 RIGHT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; mysql> SELECT biuro2.*, nieruchomosc2.* -> FROM biuro2 RIGHT JOIN nieruchomosc2 ON biuro2.miasto = nieruchomosc2.miasto; | biuroNr | miasto | nieruchomoscNr | miasto | | NULL | NULL | A | Augustów | | B | Białystok | B | Białystok | | B | Łomża | L | Łomża | 3 rows in set (0.00 sec)
33
SELECT biuro2.*, nieruchomosc2.*
Z dodanymi warunkami: SELECT biuro2.*, nieruchomosc2.* FROM biuro2 LEFT JOIN nieruchomosc2 USING(miasto) WHERE biuro2.miasto IS NULL; mysql> SELECT biuro2.*, nieruchomosc2.* -> FROM biuro2 RIGHT JOIN nieruchomosc2 USING(miasto) -> WHERE biuro2.miasto IS NULL; | biuroNr | miasto | nieruchomoscNr | miasto | | NULL | NULL | A | Augustów | 1 row in set (0.01 sec)
34
Przykład na innych tabelach:
SELECT biuro.biuronr, biuro.miasto, personel.personelnr, personel.nazwisko, personel.biuronr FROM biuro RIGHT JOIN personel ON biuro.biuronr = personel.biuronr; Wynik w tym przypadku identyczny jak dla INNER JOIN ze względu na istniejące więzy między tabelami
35
Pełne złączenie zewnętrzne
- podaj biura i nieruchomości znajdujące się w tym samym mieście, umieść również te biura, w których nie zarejestrowano żadnej nieruchomości oraz nieruchomości nie zarejestrowane w żadnym biurze: SELECT Biuro2.*, Nieruchomosc2.* FROM Biuro1 FULL JOIN Nieruchomosc2 ON Biuro2.miasto = Nieruchomosc2.miasto;
36
Utworzenie pełnego złączenia zewnętrznego (z wykorzystaniem UNION):
(SELECT biuro2.biuroNr, biuro2.miasto, nieruchomosc2.nieruchomoscNr, nieruchomosc2.miasto AS miasto2 FROM (biuro2 LEFT JOIN nieruchomosc2 ON (biuro2.miasto = nieruchomosc2.miasto))) UNION FROM (biuro2 RIGHT JOIN nieruchomosc2 ON (biuro2.miasto = nieruchomosc2.miasto)));
37
mysql> (SELECT biuro2.biuroNr, biuro2.miasto,
nieruchomosc2.nieruchomoscNr, -> nieruchomosc2.miasto AS miasto2 -> FROM (biuro2 LEFT JOIN nieruchomosc2 ON (biuro2.miasto = nieruchomosc2.miasto))) -> UNION -> (SELECT biuro2.biuroNr, biuro2.miasto, -> FROM (biuro2 RIGHT JOIN nieruchomosc2 ON (biuro2.miasto = nieruchomosc2.miasto))); | biuronr | miasto | nieruchomoscnr | miasto2 | | B | Łomża | L | Łomża | | B | Białystok | B | Białystok | | B | Grajewo | NULL | NULL | | NULL | NULL | A | Augustów | 4 rows in set (0.00 sec)
38
mysql> (SELECT biuro2.biuroNr, biuro2.miasto,
nieruchomosc2.nieruchomoscNr, -> nieruchomosc2.miasto -> FROM (biuro2 LEFT JOIN nieruchomosc2 ON (biuro2.miasto = nieruchomosc2.miasto))) -> UNION -> (SELECT biuro2.biuroNr, biuro2.miasto, -> FROM (biuro2 RIGHT JOIN nieruchomosc2 ON (biuro2.miasto = nieruchomosc2.miasto))); | biuroNr | miasto | nieruchomoscNr | miasto | | B | Łomża | L | Łomża | | B | Białystok | B | Białystok | | B | Grajewo | NULL | NULL | | NULL | NULL | A | Augustów | 4 rows in set (0.00 sec)
39
UNION mysql> (SELECT nieruchomoscnr, miasto, personelnr FROM nieruchomosc WHERE biuronr='B003' AND personelnr='SB23') -> UNION -> (SELECT nieruchomoscnr, miasto, personelnr FROM nieruchomosc WHERE biuronr='B005' AND personelnr='SL31') -> ORDER BY nieruchomoscnr; | nieruchomoscnr | miasto | personelnr | | B | Białystok | SB | | B | Białystok | SB | | L | Łomża | SL | 3 rows in set (0.11 sec)
40
LIMIT mysql> (SELECT nieruchomoscNr, miasto, personelNr FROM nieruchomosc WHERE biuroNr='B003' AND personelNr='SB23') -> UNION -> (SELECT nieruchomoscNr, miasto, personelNr FROM nieruchomosc WHERE biuroNr='B005' AND personelNr='SL31') -> ORDER BY nieruchomoscnr -> LIMIT 2; | nieruchomoscnr | miasto | personelnr | | B | Białystok | SB | | B | Białystok | SB | 2 rows in set (0.09 sec)
41
LIMIT mysql> SELECT personelNr, imie, nazwisko, pensja, biuroNr
-> FROM personel -> LIMIT 8; | personelNr | imie | nazwisko | pensja | biuroNr | | SA | Katarzyna | Morawska | | B | | SA | Maria | Hojna | | B | | SB | Sabina | Bober | | B | | SB | Daniel | Frankowski | | B | | SB | Małgorzata | Kowalska | | B | | SB | Anna | Biały | | B | | SB | Katarzyna | Michalska | | B | | SB | Dawid | Piotrowski | | B | 8 rows in set (0.00 sec)
42
Widoki (views) - Perspektywy:
Perspektywa – dynamicznie obliczany wynik jednej lub wielu operacji relacyjnych tworzących nową relację (tabelę) z relacji bazowych. Perspektywa jest relacją wirtualną, która nie musi fizycznie istnieć w bazie danych, ale może być wyliczona w każdej chwili na żądanie użytkownika. Składnia polecenia: CREATE [OR REPLACE] VIEW nazwa_perspektywy [(lista_kolumn)] AS SELECT zapytanie [WITH [CASCADED | LOCAL] CHECK OPTION]
43
Jeżeli w poleceniu pominięta jest lista kolumn, to każda z kolumn perspektywy będzie miała taką samą nazwę, jak odpowiednia kolumna w wyniku zapytania SELECT. Lista kolumn powinna być podana, jeśli istnieją jakiekolwiek niejasności dotyczące nazw kolumn (np. dla kolumn wyliczanych lub, gdy w wyniku złączenia powstają dwie kolumny o identycznych nazwach).
44
Usuwanie perspektywy:
DROP VIEW [IF EXISTS] nazwa_perspektywy [, nazwa_perspektywy] ... [RESTRICT | CASCADE] Modyfikowanie perspektywy: ALTER VIEW nazwa_perspektywy [(lista_kolumn)] AS SELECT zapytanie [WITH [CASCADED | LOCAL] CHECK OPTION]
45
Rodzaje perspektyw: Utworzenie perspektywy poziomej:
mysql> CREATE VIEW _11_biuro_B003 AS SELECT personelNr, imie, nazwisko, stanowisko, pensja -> FROM personel WHERE biuronr='B003'; -> SELECT * FROM _11_biuro_B003; Query OK, 0 rows affected (0.02 sec) | personelNr | imie | nazwisko | stanowisko | pensja | | SB | Sabina | Bober | dyrektor | | | SB | Daniel | Frankowski | kierownik | | | SB | Małgorzata | Kowalska | asystent | | | SB | Anna | Biały | asystent | | 4 rows in set (0.01 sec)
46
Utworzenie perspektywy pionowej:
mysql> CREATE VIEW _10_dyrektorzy AS SELECT personelnr, pensja -> FROM personel WHERE stanowisko='dyrektor'; -> SELECT * FROM _10_dyrektorzy; Query OK, 0 rows affected (0.03 sec) | personelnr | pensja | | SB | | | SB | | | SG | | | SL | | 4 rows in set (0.02 sec)
47
Perspektywy oparte na grupowaniu:
mysql> CREATE VIEW srednie AS SELECT uczen, przedmiot, -> AVG(ocena) AS srednia FROM oceny -> GROUP BY uczen, przedmiot; -> SELECT* FROM srednie; | uczen | przedmiot | srednia | | | biologia | | | | matematyka | | | | polski | | | | biologia | | | | matematyka | | | | polski | |
48
Podaj nieruchomości, które były wynajmowane częściej niż średnio:
mysql> CREATE VIEW tmp AS SELECT count(nieruchomoscNr) AS ile FROM wynajecie w GROUP BY nieruchomoscNr; Query OK, 0 rows affected (0.04 sec) mysql> SELECT * FROM tmp; | ile | | 3 | | 4 | | 2 | 7 rows in set (0.01 sec)
49
mysql> CREATE VIEW srednio AS SELECT n. nieruchomoscNr, miasto, n
mysql> CREATE VIEW srednio AS SELECT n.nieruchomoscNr, miasto, n.czynsz, count(*) FROM nieruchomosc n, wynajecie w -> WHERE w.nieruchomoscNr = n.nieruchomoscNr -> GROUP BY nieruchomoscNr -> HAVING count(*)>=(SELECT AVG(ile) FROM tmp); Query OK, 0 rows affected (0.10 sec) mysql> SELECT * FROM srednio; | nieruchomoscNr | miasto | czynsz | count(*) | | A | Augustów | | | | B | Białystok | | | 2 rows in set (0.01 sec)
50
SELECT AVG(ile) AS srednia FROM (SELECT count(nieruchomoscNr) AS ile
FROM wynajecie w GROUP BY nieruchomoscNr) tmp; mysql> SELECT AVG(ile) AS srednia FROM -> (SELECT count(nieruchomoscNr) AS ile -> FROM wynajecie w GROUP BY nieruchomoscNr) tmp; | srednia | | | 1 row in set (0.00 sec)
51
Podaj nieruchomości, które były wynajmowane częściej niż średnio:
SELECT n.nieruchomoscNr, miasto, n.czynsz, count(*) FROM nieruchomosc n, wynajecie w WHERE w.nieruchomoscNr = n.nieruchomoscNr GROUP BY nieruchomoscNr HAVING count(*)>=(SELECT AVG(ile) FROM (SELECT count(nieruchomoscNr) AS ile FROM wynajecie w GROUP BY nieruchomoscNr) tmp); | nieruchomoscNr | miasto | czynsz | count(*) | | A | Augustów | | | | B | Białystok | | |
52
bez WHERE mysql> SELECT n.nieruchomoscNr, miasto, n.czynsz, count(*) -> FROM nieruchomosc n, wynajecie w -> GROUP BY nieruchomoscNr -> HAVING count(*)>=(SELECT AVG(ile) FROM -> (SELECT count(nieruchomoscNr) AS ile -> FROM wynajecie w GROUP BY nieruchomoscNr) tmp); | nieruchomoscNr | miasto | czynsz | count(*) | | A | Augustów | | | | B | Białystok | | | | B | Białystok | | | | B | Białystok | | | | B | Białystok | | | | G | Grajewo | | | | L | Łomża | | | 7 rows in set (0.01 sec) Wszystkie 7 nieruchomości i wszystkie 17 wynajęć
53
Inne przykłady: mysql> CREATE TABLE test (ilosc INT, cena INT);
Query OK, 0 rows affected (0.05 sec) mysql> INSERT INTO test VALUES(3, 50); Query OK, 1 row affected (0.00 sec) mysql> CREATE VIEW w AS SELECT ilosc, cena, ilosc*cena AS wartosc FROM test; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM w; | ilosc | cena | wartosc | | | 50 | | 1 row in set (0.00 sec)
54
mysql> CREATE VIEW roczna AS SELECT personelNr, stanowisko, pensja, pensja*12 AS pensja_roczna FROM personel; Query OK, 0 rows affected (0.02 sec) mysql> SELECT * FROM roczna; | personelNr | stanowisko | pensja | pensja_roczna | | SA | kierownik | | | | SA | asystent | | | | SB | dyrektor | | | | SB | kierownik | | | | SB | asystent | | | | SB | asystent | | | | SB | dyrektor | | | | SB | asystent | | | | SB | asystent | | | | SG | dyrektor | | | | SG | asystent | | | | SL | kierownik | | | | SL | asystent | | | | SL | asystent | | | | SL | dyrektor | | | | SL | asystent | | | | SL | asystent | | | 17 rows in set (0.01 sec)
55
mysql> CREATE TABLE t1 (a INT);
Query OK, 0 rows affected (0.19 sec) mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2 -> WITH CHECK OPTION; Query OK, 0 rows affected (0.08 sec) mysql> CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0 -> WITH LOCAL CHECK OPTION; Query OK, 0 rows affected (0.05 sec) mysql> CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0 -> WITH CASCADED CHECK OPTION; Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO v2 VALUES (2); Query OK, 1 row affected (0.06 sec) mysql> select * from t1; | a | | 2 | 1 row in set (0.00 sec)
56
mysql> select * from t1;
| a | | 2 | 1 row in set (0.00 sec) mysql> INSERT INTO v1 VALUES (2); ERROR 1369 (HY000): CHECK OPTION failed 'biuro.v1' mysql> INSERT INTO v3 VALUES (2); ERROR 1369 (HY000): CHECK OPTION failed 'biuro.v3' mysql> INSERT INTO v1 VALUES (1); Query OK, 1 row affected (0.00 sec) | 1 | 2 rows in set (0.01 sec)
57
mysql> CREATE VIEW _10_dyrektorzy2 AS SELECT personelnr,nazwisko,imie,stanowisko, pensja,biuroNr FROM personel WHERE stanowisko='dyrektor' AND pensja >= 2500 WITH CHECK OPTION; SELECT * FROM _10_dyrektorzy2; Query OK, 0 rows affected (0.01 sec) | personelnr | nazwisko | imie | stanowisko | pensja | biuroNr | | SB | Michalska | Katarzyna | dyrektor | | B | | SL | Wiśniewski | Jan | dyrektor | | B | 2 rows in set (0.00 sec) mysql> INSERT INTO _10_dyrektorzy2 (personelNr, nazwisko, imie, stanowisko, pensja, biuroNr) VALUES ('SA1 ','Biedak', 'Jan', 'dyrektor', 2000, 'B007 '); ERROR 1369 (HY000): CHECK OPTION failed 'gilg._10_dyrektorzy2' mysql> INSERT INTO _10_dyrektorzy2 (personelNr,nazwisko,imie,stanowisko,pensja, biuroNr) VALUES ('SC1 ','Bogacz', 'Jan', 'dyrektor', 5000, 'B001 '); Query OK, 1 row affected, 2 warnings (0.09 sec) mysql> SELECT * FROM _10_dyrektorzy2; | SC | Bogacz | Jan | dyrektor | | B | 3 rows in set (0.00 sec)
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.