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