Dominik Szydłowski. v. 2.718281828459045235



Podobne dokumenty
SQL (ang. Structured Query Language)

Systemy GIS Tworzenie zapytań w bazach danych

Bazy danych 10. SQL Widoki

Relacyjne bazy danych. Podstawy SQL

Podobnie jak wywołania funkcji w innych funkcjach, zapytania możemy zagnieżdżać w innych zapytaniach. Podzapytanie musi zostać zapisane w nawiasie.

E.14 Bazy Danych cz. 14 SQL Podzapytania

Wprowadzenie. Tworzenie widoków

Wykład 8. SQL praca z tabelami 5

Relacyjne bazy danych. Podstawy SQL

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

Oracle11g: Wprowadzenie do SQL

Wybór wszystkich danych: SELECT * FROM employee Wybór określonych kolumn lub wyrażeń: SELECT first_name, last_name, salary FROM employee

Bazy danych. dr inż. Arkadiusz Mirakowski

3. Podzapytania, łączenie tabel i zapytań

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Język SQL. instrukcja laboratoryjna. Politechnika Śląska Instytut Informatyki. laboratorium Bazy Danych

Przestrzenne bazy danych Podstawy języka SQL

Wstęp 5 Rozdział 1. Podstawy relacyjnych baz danych 9

DECLARE VARIABLE zmienna1 typ danych; BEGIN

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Laboratorium Bazy danych SQL 3 1

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

PODZAPYTANIE (SUBSELECT)

Wykład 6. SQL praca z tabelami 3

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Autor: Joanna Karwowska

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Autor: Joanna Karwowska

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Podzapytania. SELECT atrybut_1, atrybut_2,... FROM relacja WHERE atrybut_n operator (SELECT atrybut_1, FROM relacja WHERE warunek

Podstawy języka T-SQL : Microsoft SQL Server 2016 i Azure SQL Database / Itzik Ben-Gan. Warszawa, Spis treści

Język SQL. Rozdział 6. Podzapytania Podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, operatory ANY, ALL i EXISTS.

Wykład 7 Implementacja języka SQL w systemach baz danych Oracle sortowanie, funkcje agregujące i podzapytania.

Autor: Joanna Karwowska

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Wymagania: Konstrukcja prostych zapytań w języku SQL, umiejętność wykorzystania funkcji wierszowych i agregujących.

Podstawy języka SQL cz. 2

Paweł Rajba

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

E.14 Bazy Danych cz. 17 SQL Widoki

Zarzadzanie transakcjami. Transakcje

Wykład 5. SQL praca z tabelami 2

SQL w 24 godziny / Ryan Stephens, Arie D. Jones, Ron Plew. Warszawa, cop Spis treści

Grupowanie i funkcje agregujące

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Microsoft SQL Server Podstawy T-SQL

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

- język zapytań służący do zapisywania wyrażeń relacji, modyfikacji relacji, tworzenia relacji

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Bazy danych. Polecenia SQL

Wykład 5: PHP: praca z bazą danych MySQL

BAZY DANYCH wprowadzenie do języka SQL. Opracował: dr inż. Piotr Suchomski

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Informatyka sem. III studia inżynierskie Transport 2018/19 LAB 2. Lab Backup bazy danych. Tworzenie kopii (backup) bazy danych

Szkolenie autoryzowane. MS Tworzenie zapytań do Microsoft SQL Server Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Program szkoleniowy Efektywni50+ Moduł IV Podstawy relacyjnych baz danych i język SQL

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Podzapytania do tabel W miejscu w którym możemy użyć nazwy tabeli, możemy użyć podzapytania

050 SQL ELEMENTY ZAAWANSOWANE. Prof. dr hab. Marek Wisła

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

Bazy danych SQL Server 2005

Zadania z SQLa (MS SQL Server)

Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Ćwiczenie zapytań języka bazy danych PostgreSQL

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Autor: Joanna Karwowska

Hurtownia Świętego Mikołaja projekt bazy danych

Kurs. Podstawy MySQL

Podstawowe zapytania SELECT (na jednej tabeli)

BAZA DANYCH SIECI HOTELI

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

CREATE USER

Instalacja MySQL.

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Wstęp do SQL. copyright: KGiIS WGGiOŚ AGH

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Wprowadzenie do baz danych

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

Język SQL Złączenia. Laboratorium. Akademia Morska w Gdyni

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

PODSTAWY BAZ DANYCH 13. PL/SQL

Transkrypt:

Dominik Szydłowski v. 2.718281828459045235

Będziemy pracować z bazą danych formula.sql złożonej z tabel: circuits - informacje o torach wyścigowych (18 rec.), drivers - informacje o kierowcach (22 rec.), teams - informacje o konstruktorach (10 rec.), Pełny skrypt wykonywanych poleceń na bazie formula znajduje się w pliku polecenia.txt. wszystkie polecenia z pliku polecenia.txt były wymyślone i testowane przeze mnie na phpmyadmin 2.9.0.2 z wynikiem pozytywnym. 2

Struktura tabeli circuits: id - unikalny identyfikator toru, name - nazwa toru, lap_record - nazwisko kierowcy który posiada na danym torze rekord jednego okrążenia, race_dist - dystans jaki pokonują kierowcy podczas wyścigu na danym torze. 3

Struktura tabeli drivers: id - unikalny identyfikator kierowcy, name imię kierowcy, last_name - nazwisko kierowcy, team_id unikalny identyfikator zespołu dla jakiego jeździ dany kierowca, nationality narodowość, last_place pozycja jaką dany kierowca zajął w klasyfikacji indywidualnej w sezonie 2008 (jeśli nie jeździł w sezonie 2008 - NULL), podiums informacja o tym ile razy na podium gościł dany kierowca, points ilość zgromadzonych punktów przez kierowcę w całej karierze gp_entered liczba startów w Grand Prix, championships liczba zdobytych mistrzostw świata, wins liczba zwycięstw w całej karierze, highest_race_finish najwyższa zdobyta pozycja w wyścigu, year_of_birth rok urodzenia. 4

Struktura tabeli teams: id - unikalny identyfikator zespołu, name - nazwa zespołu, base - siedziba, engines nazwa silnika jaką używa dany zespół w swoich bolidach, first_season rok w którym zadebiutował zespół, championships ilość zdobytych mistrzostw świata konstruktorów, pole_positions ilosć wywalczonych pierwszych pól w kwalifikacjach przez bolidy danego zespołu, place pozycja w klasyfikacji konstruktorów na zakończenie sezonu 2008. 5

6

Podzapytania lub zapytania zagnieżdżone to instrukcje SELECT umieszczone wewnątrz innych instrukcji SELECT. Podzapytanie może być użyte w dowolnej klauzuli w klauzuli FROM będziemy ich używać jako źródeł danych, w klauzuli SELECT jako odpowiedników zmiennych lub funkcji, w klauzuli WHERE do wybierania danych itd. 7

Podobnie jak wywołania funkcji w innych funkcjach, możemy zagnieżdżać zapytania w innych zapytaniach. Podzapytanie musi zostać zapisane w nawiasie. Analogia do znanych nam języków programowania. Serwer zarządzania bazą danych wykonuje podzapytania, zaczynając od najbardziej wewnętrznej instrukcji SELECT, po to, aby wynik tej instrukcji wykorzystać do wykonania zapytań zewnętrznych. 8

Podzapytania dzielą się na: Podzapytania powiązane i niepowiązane. podzapytanie powiązane wymaga danych z zapytania zewnętrznego, zanim może być wykonane. Dane zwrócone przez podzapytanie powiązane wprowadzane są z powrotem do zapytania zewnętrznego, a podzapytanie wykonywane jest tyle razy, ile wierszy zwróciło zapytanie zewnętrzne. podzapytanie niepowiązane wykonuje się tylko raz, przed zapytaniem zewnętrznym, a jego wyniki są przekazywane do zapytania zewnętrznego. Podzapytanie niepowiązane jest prostszym przykładem podzapytań. Podzapytania zwracające jeden wiersz i zwracające wiele wierszy. Kryterium podziału stanowi tutaj liczba wierszy zwracanych przez wewnętrzną instrukcję SELECT. 9

10

Podzapytania tego typu można traktować jak zwykłe wyrażenia. W szczególności podzapytania tego typu mogą być używane ze standardowymi operatorami porównań. 11

PRZYKŁAD 1. ZADANIE: Kierowca, który ma rekord jednego okrążenia na torze w Hockenheim (id toru 10). ZAPYTANIE: SELECT name, last_name, nationality FROM drivers WHERE last_name= (SELECT lap_record FROM circuits WHERE id=10); WYNIK: Kimi Raikkonen Finnish KOMENTARZ: Innego typu operatory jakie możemy zastosować:!=, <> lub #, >, >=, <, <= 12

Zapytania zagnieżdżone podające pojedynczą wartość: W instrukcji SELECT można wykorzystywać również funkcje agregujące do podania pojedynczej wartości (przypominam jakie): COUNT() zlicza liczbę wybranych wierszy; SUM() sumuje wartości w kolumnach numerycznych; MIN() znajduje minimalną wartość tekstową, typu daty lub numeryczną; MAX() znajduje maksymalną wartość; AVG() oblicza średnią wartość w kolumnach numerycznych. Wynikiem wykonywanej funkcji agregującej jest pojedyncza wartość. 13

PRZYKŁAD 2. ZADANIE: Poszukajmy w tabeli drivers najstarszego kierowcę. ZAPYTANIE: SELECT name, last_name, last_place, year_of_birth FROM drivers WHERE year_of_birth= (SELECT min(year_of_birth) FROM drivers); WYNIK: Michael Schumacher NULL 1969 14

PRZYKŁAD 3. ZADANIE: Zróbmy to samo co w przykładzie 2, z tą różnicą, żeby szukany przez nas kierowca brał udział w GP w 2008 roku. ZAPYTANIE: SELECT name, last_name, last_place, year_of_birth FROM drivers WHERE year_of_birth= (SELECT min(year_of_birth) FROM drivers WHERE last_place!='null'); WYNIK: David Coulthard 16 1971 KOMANTARZ: min(year_of_birth) - zwraca wartość minimalną w kolumnie year_of_birth 15

PRZYKŁAD 4. ZADANIE: Teraz dla odmiany wyszukajmy zawodników, dla których liczba zdobytych punktów jest większa od średniej. ZAPYTANIE: SELECT name, last_name, nationality, last_place, points FROM drivers WHERE points > (SELECT avg(points) FROM drivers); WYNIK: 8 zawodników spełnia to kryterium. 16

PRZYKŁAD 5. ZADANIE: Teraz poszukajmy weterana F1 czyli kierowcę, który miał najwięcej startów i nadal bierze udział w GP. ZAPYTANIE: SELECT name, last_name, wins, gp_entered FROM drivers WHERE gp_entered= (SELECT max(gp_entered) FROM drivers WHERE last_place!='null'); WYNIK: Rubens Barrichello 9 271 17

PRZYKŁAD 6. ZADANIE: I na koniec tego ćwiczenia poszukamy kierowcy który ma najwięcej startów w GP wśród tych wszystkich zawodników, którzy jeszcze nie zwyciężyli i nadal się ścigają. ZAPYTANIE: SELECT name, last_name, last_place, gp_entered FROM drivers WHERE gp_entered= (SELECT max(gp_entered) FROM drivers WHERE last_place!='null' AND wins=0 ); WYNIK: Nick Heidfeld 5 152 18

19

PRZYKŁAD 7. ZADANIE: Znajdźmy zespół w którym jeździ Polski kierowca. ZAPYTANIE: SELECT name, base, engines FROM teams WHERE id = (SELECT team_id FROM drivers WHERE nationality = 'Polish'); WYNIK: BWM Sauber Munich, Hinwil BMW 20

PRZYKŁAD 8. ZADANIE: Co by było, gdyby polecenie z przykładu 7 było użyte do odczytania kierowców narodowości niemieckiej? Ponieważ wewnętrzne zapytanie zwróciłoby listę wartości (mamy kilku kierowców o takiej narodowości), a nie pojedynczy wiersz, MySQL nie mógłby poprawnie obliczyć wyniku zapytania zewnętrznego (niemożliwe jest sprawdzenie, czy identyfikator klienta jest równy zbiorowi wartości) i zamiast listy teamów otrzymalibyśmy komunikat o błędzie. Przekształceniem tej instrukcji tak, aby podzapytanie mogło zwrócić dowolną liczbę wartości (włączając w to 0), a przy tym działało zgodnie z naszymi oczekiwaniami, zajmiemy się w kolejnym przykładzie. ZAPYTANIE: SELECT name, base, engines FROM teams WHERE id = (SELECT team_id FROM drivers WHERE nationality = 'German' AND last_place!='null'); WYNIK: MySQL zwrócił komunikat: #1242 - Message: Subquery returns more than 1 row Z pomocą przyjdzie nam wyrażenie IN 21

W języku SQL można wykorzystać zapytania zagnieżdżone, które podają kilka wartości z jednej kolumny. Podzapytania zwracające listę wartości mogą być wykorzystane w wyrażeniach typu IN, NOT IN, EXISTS, NOT EXIST, oraz łącznie ze słowami kluczowymi ANY lub ALL. 22

Podzapytania z wyrażeniem IN Wyrażenie IN jest wykorzystywane do sprawdzenia, czy wartość należy do pewnego zbioru. Podzapytanie może być wykorzystane do wybrania tego zbioru wartości. Przekształćmy naszą instrukcję z przykładu 8 tak, aby wykorzystać w podzapytaniu operator IN. 23

PRZYKŁAD 9. Słowo kluczowe IN. ZADANIE: Modyfikacja polecenia z przykładu 8. ZAPYTANIE: SELECT name, base, engines FROM teams WHERE id IN (SELECT team_id FROM drivers WHERE nationality = 'German' AND last_place!='null'); WYNIK: Jako wynik wyświetli się nam 5 teamów. 24

PRZYKŁAD 10*. Słowo kluczowe IN oraz GROUP BY. ZADANIE: Utwórzmy klasyfikację, która nam powie, który z kierowców wygrał rywalizację wewnątrz zespołową. ZAPYTANIE: SELECT name, last_name FROM drivers WHERE last_place IN (SELECT min(last_place) FROM drivers WHERE last_place!='null' GROUP BY team_id) ORDER BY last_place; KOMENTARZ: Klauzula GROUP BY układa wiersze w grupy, w których określona kolumna ma tą samą wartość, a następnie redukuje tą grupę do pojedynczego wiersza w tablicy wynikowej. Kolumna wyszczególniona w klauzuli SELECT musi być zawarta w klauzuli GROUP BY i odwrotnie. 25

PRZYKŁAD 11*. Podzapytanie vs złączenie ZADANIE: W niektórych przypadkach możemy podzapytanie zastąpić złączeniem. Szukamy kierowców, którzy mają rekord jednego okrążenia. ZAPYTANIE A (podzapytanie): SELECT name, last_name FROM drivers WHERE last_name IN (SELECT lap_record FROM circuits) ORDER BY last_name; ZAPYTANIE B (złączenie): SELECT DISTINCT drivers.name, last_name FROM drivers, circuits WHERE (last_name = lap_record) ORDER BY last_name; 26

Podzapytania z wyrażeniem NOT IN Wyniki podzapytań mogą być również porównywane również za pomocą operatora NOT IN. Wartość logiczna takiego wyrażenia jest prawdziwa, gdy wartość testowana nie należy do listy wartości zwróconych przez podzapytanie. Nie zaleca się korzystania z wyrażeń NOT IN w podzapytaniach z powodu ich niskiej wydajności. W większości wypadków można zamiast tego skorzystać z zapytania wykorzystującego złączenie zewnętrzne. 27

PRZYKŁAD 12. Słowo kluczowe NOT IN. ZADANIE: Szukamy kierowców, którzy nie posiadają rekordu jednego okrążeni na torze, które długość jest większa od 306 km. ZAPYTANIE: SELECT name, last_name FROM drivers WHERE last_name NOT IN (SELECT lap_record FROM circuits WHERE race_dist > 306) ORDER BY last_name; WYNIK: 17 kierowców. Zmieńmy NOT IN na IN. W wyniku otrzymany tych kierowców którzy taki rekord posiadają. 28

Podzapytania z wyrażeniem ANY Słowo kluczowe ANY służy do sprawdzania, czy warunek umieszczony w klauzuli WHERE jest prawdziwy dla dowolnej wartości podawanej przez wewnętrzną instrukcję SELECT. W przypadku użycia operatora ANY, wartość bieżącego wiersza zwróconego przez zapytanie zewnętrzne jest porównywana z każdą wartością zwróconą przez wewnętrzne zapytanie. Wystarczy, że jedno z tych porównań będzie prawdziwe (czyli wiersz z wyniku zapytania zewnętrznego przynajmniej raz spełni warunek logiczny), a całe porównanie będzie traktowane jako spełnione. Innymi słowy, wiersz zostanie wybrany, jeżeli wyrażenie jest zgodne z co najmniej jedną wartością zwróconą przez zapytanie wewnętrzne. 29

PRZYKŁAD 13. Słowo kluczowe ANY. ZADANIE: Wyszukajmy teamy dla których liczba zdobytych pole position (P1) jest większa od liczby zdobytych P1 jakiegokolwiek innego zespołu. ZAPYTANIE: SELECT * FROM teams WHERE pole_positions > ANY (SELECT pole_positions FROM teams); WYNIK: W wyniku tej selekcji otrzymamy 6 teamów. 30

PRZYKŁAD 14. Słowo kluczowe ANY. ZADANIE: Wyszukajmy kierowców którzy mają liczbę zwycięstw większą od jakiegokolwiek innego zawodnika w stawce. ZAPYTANIE: SELECT name, last_name FROM drivers WHERE wins > ANY (SELECT wins FROM drivers) ORDER BY wins, last_name; KOMENTARZ: W wewnętrznym selekcie dostaniemy wszystkie wiersze wins z tabeli drivers. Dodatkowo sortujemy otrzymane wyniki najpierw według zwycięstw później według nazwiska. 31

Podzapytania z wyrażeniem ALL Słowo kluczowe ALL służy do sprawdzania, czy warunek umieszczony w klauzuli WHERE jest prawdziwy dla wszystkich wartości podawanych przez wewnętrzną instrukcję SELECT. W przypadku użycia operatora ALL warunek musi być spełniony przez wszystkie wartości wybrane w podzapytaniu. Innymi słowy, jeśli wykonujemy porównanie oparte na równości, to wartość z lewej strony równania musi być równa każdej wartości wyniku podzapytania, żeby wynik całego porównania też był prawdziwy. 32

PRZYKŁAD 15. Słowo kluczowe ALL. ZADANIE: Kierowca, który ma największą/najmniejszą liczbę zwycięstw. ZAPYTANIE A: SELECT * FROM drivers WHERE wins >= ALL (SELECT wins FROM drivers); ZAPYTANIE B: SELECT name, last_name FROM drivers WHERE wins <= ALL (SELECT wins FROM drivers); WYNIK: Michael Schumacher lub 8 zawodników, którzy nie maję zwycięstwa na swoim koncie. 33

Podzapytania z wyrażeniem EXIST W przypadku podzapytań czasami chcemy jedynie sprawdzić, czy wiersz spełniający podane warunki istnieje w bazie danych. Prostą metodą sprawdzenia, czy dany wiersz występuje w podanej tabeli jest użycie wyrażenia EXIST. Ponieważ operator EXIST zwraca wartość logiczną True, gdy wewnętrzne podzapytanie zwróci jakikolwiek wynik, a False, gdy zwróci pusty zbiór, nie ma znaczenia, co znajdzie się w klauzuli SELECT wewnętrznego podzapytania. 34

Podzapytania z wyrażeniem EXIST Dzisiaj już używaliśmy wyrażenia EXIST tylko trochę nieświadomie. Importując bazę danych serwer SQL wykonał 9 zapytań w tym: DROP TABLE IF EXISTS circuits DROP TABLE IF EXISTS drivers DROP TABLE IF EXISTS teams 35

PRZYKŁAD 16. Słowo kluczowe EXIST. ZADANIE: Za pomocą polecenia EXIST wyszukajmy kierowcy, który posiada rekord jednego okrążenia na jednym z torów. ZAPYTANIE: SELECT * FROM drivers WHERE EXISTS (SELECT * FROM circuits WHERE lap_record = last_name); KOMENTARZ: Wykorzystujemy tutaj złącznie tabeli drivers oraz circuits. 36

Podzapytania z wyrażeniem NOT EXIST Jeżeli interesuje nas brak jakichś danych, a nie ich istnienie, możemy sprawdzić to za pomocą wyrażenia NOT EXIST. 37

PRZYKŁAD 17. Słowo kluczowe NOT EXIST. ZADANIE: Zmodyfikujmy polecenie z przykładu 16 i znajdźmy kierowcę, który nie posiada rekordu okrążenia. ZAPYTANIE: SELECT * FROM drivers WHERE NOT EXISTS (SELECT * FROM circuits WHERE lap_record = last_name); 38

39

Podzapytania niepowiązane wykonywane są następująco: Wykonana zostaje wewnętrzna instrukcja SELECT. Jej wyniki zostają przekazane do zapytania zewnętrznego. Otrzymane dane pozwalają wykonać zapytanie zewnętrzne Podzapytania jako źródła danych Jak już widzieliśmy wynik podzapytania może być zbiorem danych źródłowych dla innego zapytania. W takim przypadku podzapytanie znajduje się w klauzuli FROM zapytania nadrzędnego. 40

PRZYKŁAD 18. Inne spojrzenie na podzapytania niepowiązane ZADANIE: Wyświetlmy zawodników, którzy w sezonie 2008 zajęli pozycje w klasyfikacji generalnej od 1 do 8. ZAPYTANIE: SELECT * FROM ( SELECT name, last_name, last_place FROM drivers ORDER BY points/gp_entered) AS zawodnik WHERE last_place <= 8; KOMENTARZ: MySQL, wykonując tę instrukcję, najpierw wykonał wewnętrzne zapytanie i nazwał wynik zawodnik, a następnie odczytał z tymczasowej tabeli zawodnik te wiersze, dla których spełniony był warunek last_place <= 8; Charakterystyczne dla zapytań niepowiązanych jest to, że zapytanie wewnętrzne można wykonać jako osobną instrukcję. 41

Podzapytania powiązane: podzapytanie takie wykonywane jest dla każdego wiersza wyniku zapytania zewnętrznego i może być z nim porównywane. Podzapytanie powiązane jest przykładem dynamicznego złączenia wyniku zapytania z każdym kolejnym wierszem wyniku zapytania zewnętrznego. Podzapytanie powiązane, jako przykład dynamicznego złączenia, można łatwo rozpoznać po tym, że kolumna (kolumny) wyniku podzapytania jest porównywana z kolumną (kolumnami) wyniku zapytania zewnętrznego. Niezależne wykonanie wewnętrznego zapytania jest w tym przypadku niemożliwe. 42

Podzapytania z operatorem EXISTS Za pomocą operatorów EXISTS i NOT EXISTS możemy ograniczyć wynik zapytania zewnętrznego do wierszy odpowiednio zwróconych (lub nie) przez podzapytanie powiązane. 43

PRZYKŁAD 19. ZADANIE: Przykład zastosowania podzapytań do wyszukiwania duplikatów danych. ZAPYTANIE: SELECT name, last_name FROM drivers AS T1 WHERE EXISTS (SELECT id FROM drivers AS T2 WHERE T1.last_name=T2.last_name AND T1.name=T2.name AND T1.id<>T2.id); KOMENTARZ: Pokazane podzapytanie powiązane wyświetla wszystkie informacje o tych kierowcach, którzy mają to samo imię i nazwisko, ale różne id, a więc dane, które pomyłkowo mogły zostać kilkakrotnie wprowadzone do bazy. 44

PRZYKŁAD 20. ZADANIE: W poprzednim przykładzie w naszej bazie nie znaleziono duplikatów, zatem dodajmy dubla do bazy i ponówmy poprzednie zapytanie aby jeszcze raz sprawdzić działanie zapytania z przykładu 19. ZAPYTANIE: INSERT INTO drivers (id, name, last_name, team_id, nationality, last_place, podiums, points, gp_entered, championships, wins, highest_race_finish, year_of_birth) VALUES (NULL, 'Adrian', 'Sutil', 10, 'German', 20, 0, 1, 35, 0, 0, 8, 1983); WYNIK: Jako wynik powinniśmy otrzymać nazwisko kierowcy, któremu zrobiliśmy dubla w bazie drivers. 45

Jak to działa? Wykonując tę instrukcję, MySQL odczytuje jeden wiersz z tabeli drivers i sprawdza, czy w całej tabeli nie ma zapisanych danych o kierowcy, który miałby to samo imię i nazwisko, ale różny identyfikator. Jeżeli tak, operator EXISTS zwraca prawdę i dane kierowcy dołączane są do wyniku. Następnie odczytywany jest drugi wiersz z tabeli drivers i cały proces powtarza się aż do sprawdzenia wszystkich wierszy. 46

ZAPYTANIA WIELOKROTNE W języku SQL zapytania mogą być zagnieżdżone jedno w drugim tworząc zapytaniami wielokrotnymi. 47

PRZYKŁAD 21. ZAPYTANIE WIELOKRONE. ZADANIE: Szukamy toru na którym ma rekord kierowca z teamu, którego liczba mistrzostw jest większa od średniej, zaś sam kierowca ma liczbę zwycięst poniżej średniej. ZAPYTANIE: SELECT name, lap_record FROM circuits WHERE lap_record IN (SELECT last_name FROM drivers WHERE team_id IN (SELECT id FROM teams WHERE championships > (SELECT AVG(championships) FROM teams)) AND wins < (SELECT AVG(wins) FROM drivers) ); 48

49

Tworzenie widoków Aby utworzyć widok, należy wykonać instrukcję: CREATE [OR REPLACE] VIEW Nazwa_widoku [(lista kolumn)] AS SELECT zapytanie Opcjonalny parametr lista kolumn definiuje nazwy kolumn dla perspektywy. Lista kolumn tworzonej perspektywy musi zawierać dokładnie tyle pozycji, ile kolumn zwraca instrukcja SELECT. Jeżeli w klauzuli SELECT użyliśmy wyrażeń, należy jawnie określić nazwy kolumn widoku. Zapytanie jest dowolną z kilkoma wyjątkami poprawnie sformułowaną instrukcją SELECT języka SQL. Jeżeli chcemy zmienić wcześniej utworzony widok, należy po słowie kluczowym CREATE użyć opcji OR REPLACE. Tak utworzony widok jest w gruncie rzeczy aliasem tabeli. 50

PRZYKŁAD 22. CREATE VIEW. ZADANIE: Utwórzmy widok dla tabeli circuits. ZAPYTANIE: CREATE VIEW V_circuits AS SELECT id, name, race_dist FROM circuits; KOMENTARZ: Pokazuje sposób utworzenia widoku ograniczającego użytkownikom dostęp do poufnych informacji np. lap_record. 51

PRZYKŁAD 23. SELECT * FROM View. Utworzonego widoku można używać tak jak zwykłej tabeli. Wykonanie instrukcji z listingu poniżej zwróci dane torów których dystans jest większy od 301 km. ZAPYTANIE: SELECT* FROM V_circuits WHERE race_dist >301; KOMENTARZ: Widoki umożliwiają prezentowanie danych w sposób najbardziej wygodny dla użytkowników, niezależnie od struktury tabel fizycznych. Użytkownikom o wiele łatwiej wpisać polecenie SELECT * nazwa_widoku zawierającego wyłącznie kolumny najczęściej przez nich używane, niż wypisywać poszczególne nazwy kolumn przy korzystaniu z tabeli. 52

Modyfikowanie widoków Możemy zmienić definicję widoku przez wykonanie instrukcji ALTER VIEW. W ten sposób zmienimy definicję widoku, ale uprawnienia nadane do niego użytkownikom pozostaną Usuwanie widoków Niepotrzebne widoki mogą zostać usunięte z bazy danych. Ponieważ usunięcie tabeli bazowej nie spowoduje automatycznego usunięcia powiązanych z nią widoków, z reguły instrukcje DROP TABLE i DROP VIEW wykonywane są łącznie 53

PRZYKŁAD 24. ALTER VIEW. Zmiana definicji widoku. ZAPYTANIE: ALTER VIEW V_circuits AS SELECT * FROM circuits WHERE race_dist >=301 WITH CHECK OPTION; KOMENTARZ: Możemy zmienić definicję widoku przez wykonanie instrukcji ALTER VIEW. W ten sposób zmienimy definicję widoku, ale uprawnienia nadane do niego użytkownikom pozostaną. 54

PRZYKŁAD 25. SELECT * FROM View. Dodajmy do tabeli circuits rekord. Następnie sprawdźmy co się stało z naszym widokiem. ZAPYTANIE: INSERT INTO circuits ( id, name, lap_record, race_dist) VALUES (NULL, 'Krakow', 'No_name', '298.15 ); SELECT * FROM V_circuits; KOMENTARZ: Widok jest tworzony dynamicznie. 55

PRZYKŁAD 26. DROP VIEW. Usuwamy niepotrzebny widok ZAPYTANIE: DROP VIEW V_circuits; KOMENTARZ: Podobnie jak w przypadku usuwania tabel, aby MySQL usunął widok, musimy mieć nadane uprawnienia administratora baz danych lub być właścicielem tego widoku. 56

Korzyści: Wygoda - uproszczenie zapytań kierowanych do systemu. Utworzenie dodatkowego poziomu zabezpieczenia tabelipoprzez ograniczenie dostępu do określonych kolumn lubwierszy tabeli bazowej. Pokazywanie danych z innej perspektywy - dla przykładu widok może zostać użyty do zmiany nazwy kolumny bez zmiany rzeczywistych danych zapisanych w tabeli. Tworzenie warstwy abstrakcji. 57

Wady: Wydajność - widok nie istnieje rzeczywiście jest dynamicznie. Brak możliwości modyfikacji danych (w przypadku widoków niemodyfikowalnych). 58

Właścicielem praw autorskich do pliku SQL_R.pdf jest Dominique Sz. Dozwolone jest wykonanie jednej kopii papierowej na potrzeby własne użytkownika. Zabronione jest wykonywanie dalszych reprodukcji, przetwarzanie i kopiowanie plików komputerowych, zawierających ów plik na jakikolwiek komputer, dyskietkę, płytę CD, DVD, lub inny nośnik plików komputerowych o którym mowa na stronie internetowej: http://pl.wikipedia.org/wiki/pamięć_komputerowa. [cytat zaczerpnięty z sieci ] 59