Tutaj wyjaśniam, czym są „widoki” MySQL i jak ich używać.
MySQL daje nam możliwość tworzenia widoków . widok jest zdefiniowane jako przechowywane zapytanie, które po wywołaniu tworzy zestaw wyników. Niektórzy nazywają widoki „wirtualnymi stołami”.
Czyste jak błoto? Spróbujmy jeszcze raz.
Co to jest widok?
Widok to zapytanie, które zapisujesz w bazie danych. Możesz go później uruchomić, po prostu wywołując ten widok (zamiast wypisywać zapytanie ponownie).
Widok może składać się ze złożonego zapytania, ale będzie przedstawiał wyniki tak, jakby był tabelą. W związku z tym można wysyłać zapytania do widoku tak, jakby był to tabela.
Na przykład możesz mieć złożone zapytanie, które wybiera dane z trzech różnych tabel. Możesz albo wpisać to złożone zapytanie za każdym razem, gdy chcesz je uruchomić, albo zapisać je jako widok. Po zapisaniu jako widok możesz uruchomić prosty SELECT
instrukcja zwracająca wyniki złożonego zapytania. Ale oczywiście możesz również napisać złożone zapytanie względem widoku, jeśli zajdzie taka potrzeba.
Utwórz widok
Tworzenie widoków jest bardzo proste. Po prostu poprzedzasz zapytanie jednym wierszem kodu i uruchamiasz je. Widok zostanie natychmiast utworzony w Twojej bazie danych.
Składnia
Aby utworzyć widok, wpisz następującą instrukcję, a następnie zapytanie:
CREATE VIEW view_name AS
Zastąp nazwa_widoku o dowolnej nazwie, której chcesz użyć dla widoku.
Przykład
Jeśli uruchomimy następujący kod w FruitShop baza danych:
CREATE VIEW vFruitInventory AS SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId;
Widzimy teraz widok o nazwie vFruitInventory wymienione w sekcji Widoki (może być konieczne kliknięcie przycisku Odśwież przycisk SCHEMATY najpierw menu):
Dobrym pomysłem jest wymyślenie konwencji nazewnictwa dla widoków (jak w przypadku każdego innego obiektu bazy danych) i trzymanie się jej. Wielu programistów poprzedza nazwy widoków przedrostkiem v
, vw
, v_
lub vw_
aby ułatwić odróżnienie widoków od tabel w ich zapytaniach. Jednak inni programiści nie zgadzają się z tą konwencją i wolą, aby ich nazwy tabel i widoków były wymienne.
Zapytanie o widok
Teraz możemy wysłać zapytanie do widoku tak samo, jak zapytanie do tabeli:
SELECT * FROM vFruitInventory;
Wynik:
Oczywiście możemy też użyć bardziej szczegółowego zapytania. Na przykład ten, który wybiera tylko te rekordy, w których inwentarz jest większy lub mniejszy niż 10:
SELECT FruitName FROM vFruitInventory WHERE Inventory <= 10;
Ale nie możemy Kolumny zapytań, do których nie odwołuje się widok (nawet jeśli znajdują się w tabelach źródłowych, do których wysyła zapytania).
Na przykład możemy zapytać o Owoce tabela w ten sposób:
SELECT * FROM Fruit WHERE FruitId = 1;
Ale nie możemy przeszukiwać powyższego vFruitInventory zobacz w ten sposób:
SELECT * FROM vFruitInventory WHERE FruitId = 1;
Dzieje się tak, ponieważ widok nie zwraca FruitId kolumna. Określiliśmy dokładne kolumny w widoku i tylko one są zwracane. Jak wspomniano, zestaw wyników widoku jest podobny do tabeli, a niektórzy lubią nazywać go „tablicą wirtualną”. Jeśli „tabela” nie zawiera tych kolumn, nie możesz wysłać do nich zapytania.
Zamiast być ograniczeniem, jest to w rzeczywistości funkcja wyświetleń. Ta funkcja oznacza, że możemy przyznać użytkownikom dostęp do niektórych kolumny tabeli, ale nie inne (poprzez widok). Innymi słowy, możemy przyznać użytkownikowi dostęp do widoku bez przyznawania temu użytkownikowi dostępu do tabel bazowych, do których uzyskuje dostęp widok. Niektóre tabele mogą przechowywać poufne informacje, do których użytkownik nie ma dostępu. Ale te same tabele mogą również przechowywać niewrażliwe informacje, których potrzebują mieć dostęp. Co robić? Stwórz widok! A ten widok może wybrać tylko niewrażliwe informacje z tych tabel.
Modyfikowanie widoku
Oto dwie różne metody modyfikacji widoku.
Opcja 1:Użyj ALTER VIEW
Oświadczenie
Możesz modyfikować widok, używając ALTER VIEW
oświadczenie. Tak:
ALTER VIEW view_name AS
Zastąp nazwa_widoku z nazwą widoku, który chcesz zmienić.
Przykład
Dodajmy Fruit.FruitId pole do widoku:
ALTER VIEW vFruitInventory AS SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId;
Teraz, gdy próbujemy zwrócić FruitId pole w naszych zapytaniach otrzymamy wyniki.
Pamiętaj jednak, że nie możemy próbować uzyskać dostępu do tego pola jako Fruit.FruitId
. Możemy uzyskać do niego dostęp tylko jako FruitId
. I tak powinno być. W końcu widok jest „wirtualną tabelą” i nie musimy znać struktury tabel, o które pyta.
Opcja 2:Użyj CREATE OR REPLACE
Pamiętaj, że widok musi istnieć przed uruchomieniem ALTER VIEW
oświadczenie. Jeśli nie istnieje, otrzymasz błąd. Możesz uniknąć tego problemu, używając CREATE OR REPLACE
oświadczenie. Spowoduje to utworzenie widoku, jeśli nie istnieje, lub zastąpienie go, jeśli tak.
Mogliśmy więc stworzyć powyższy widok w ten sposób:
CREATE OR REPLACE VIEW vFruitInventory AS SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId;
A potem możemy go zaktualizować, używając tego samego CREATE OR REPLACE
oświadczenie, ale tylko modyfikując definicję. Na przykład dodanie w Fruit.FruitId
pole:
CREATE OR REPLACE VIEW vFruitInventory AS SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId;
Porzucanie widoku
Upuszczasz widok za pomocą DROP VIEW
oświadczenie. Tak:
DROP VIEW vFruitInventory
Powyższe oświadczenie usunie widok o nazwie vFruitInventory .
Porzucanie wielu widoków
Możesz upuścić wiele widoków za pomocą tego samego DROP VIEW
oświadczenie. Po prostu oddziel każdą nazwę widoku przecinkiem. Tak:
DROP VIEW view_1, view_2 ...
Karta IF EXISTS
Klauzula
Możesz także użyć IF EXISTS
klauzula zapobiegająca wystąpieniu błędu, jeśli widok nie istnieje:
DROP VIEW IF EXISTS view_1, view_2 ...