Autor:Manoj Debnath
Tabele w bazie danych SQL mogą zawierać ogromną ilość danych, ale nie zawsze są one w użytecznym formacie, który można łatwo wykorzystać. Objętość danych musi być filtrowana w oparciu o określone kryteria efektywnego wykorzystania. Ze względów bezpieczeństwa możemy chcieć upublicznić tylko określoną ilość danych, podczas gdy reszta może być dostępna dla uprzywilejowanych użytkowników. Operacje SQL DML są rozszerzalne i używane do filtrowania przez jedną lub więcej tabel przy użyciu złożonych wyrażeń zapytań. Wykorzystując ten pomysł, możemy tworzyć wirtualne tabele z trwałych tabel bazowych za pomocą SQL, które zawierałyby dokładnie te dane, których potrzebujemy. To jest powód, dla którego standard SQL:2006 wprowadził użycie tabel widoków lub widoków. Definicja widoku lub tabeli wirtualnej istnieje jako obiekt schematu. Ten artykuł przedstawia koncepcję widoków w SQL, jak to działa i pokazuje, jak jest zaimplementowany na kilku przykładach.
Wprowadzenie do widoków SQL
Widoki SQL to nic innego jak wirtualne tabele znajdujące się w pamięci pochodzącej z jednej lub kilku tabel podstawowych. Tabele wirtualne oznaczają, że krotki w widokach nie istnieją fizycznie i nie są przechowywane w bazie danych. Krotki są jak dane tymczasowe utworzone w wyniku zapytania SQL, które zazwyczaj rysuje przefiltrowane dane z co najmniej jednej tabeli bazowej. W rezultacie istnieje ograniczenie typu operacji, które można zastosować do tabeli widoku. Na przykład, operacja aktualizacji nie może być zastosowana do widoków wszystkich typów, ale nie ma ograniczeń w stosowaniu do niej zapytania SQL.
Poniższe przykłady zostały przetestowane z bazą danych MySQL. Zacznij od stworzenia kilku tabel:
moja_firma baza danych:
CREATE DATABASE my_company; CREATE TABLE Employee( empId INT(11) UNSIGNED CHECK (empId > 0), empName VARCHAR(20), birthDate DATE, address TEXT(128), gender VARCHAR(1), salary DECIMAL(15,2), managerId INT(11) UNSIGNED, deptId INT(11) UNSIGNED, PRIMARY KEY(empId) ); CREATE TABLE Department( deptId INT(11) UNSIGNED CHECK (empId > 0), deptName VARCHAR(20), deptMgrId INT(11) UNSIGNED, mgrStartDate DATE, PRIMARY KEY(deptId) ); CREATE TABLE Project( projId INT(11) UNSIGNED CHECK (empId > 0), projName VARCHAR(20), projLocation TEXT(128), deptId INT(11) UNSIGNED, PRIMARY KEY(projId) ); CREATE TABLE EmpWorksOnProj( empId INT(11) UNSIGNED, projId INT(11) UNSIGNED, hoursWorked DECIMAL(4,2) ); ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId); ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId); ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId); ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
Widoki można traktować jako tabelę referencyjną i możemy jej używać tak często, jak chcemy, chociaż fizycznie może nie istnieć. Na przykład możemy często potrzebować odwołać się do moja_firma bazę danych i znajdź Pracownika i Projekt Informacja. Pamiętaj, że istnieje wiele relacji między pracownikiem i Projekt ponieważ jedna osoba może pracować nad wieloma projektami, a jeden projekt ma wielu pracowników. Dlatego zamiast określać łączenie trzech tabel:Pracownik , EmpWorksOnProj i Projekt za każdym razem, gdy potrzebujemy informacji wspólnych i wysyłamy zapytanie, definiujemy widok, który jest określony jako wynik łączenia między tymi tabelami. Widok tworzy wirtualną tabelę utworzoną z wyniku zapytania. Zaletą jest to, że zapytanie może teraz pobierać z pojedynczej tabeli wynikowej, zamiast pobierać z trzech połączonych tabel. Zbiór tabel:Pracownik , Projekt , Oddział itp. w ten sposób tworzą tabele bazowe lub tabele definiujące widok.
Stwórzmy kilka widoków na podstawie schematu podanego powyżej.
CREATE VIEW V1 AS SELECT empName, projName, hoursWorked FROM Employee, Project, EmpWorksOnProj WHERE Employee.empId=EmpWorksOnProj.empId AND Project.projId=EmpWorksOnProj.projId;
Sposób określania zapytań SQL w widoku lub tabeli wirtualnej jest taki sam, jak określanie zapytań obejmujących tabele podstawowe. Możesz użyć SQL SELECT na widokach, aby uzyskać dane w następujący sposób:
WYBIERZ * Z V1;
EmpName | Nazwa projektu | Godziny przepracowane |
Myszka Miki | ClubHouse | 6.50 |
… | … | … |
Kaczor Donald | Rolnictwo | 7,0 |
Poniżej tworzy się drugi widok:
CREATE VIEW V2 AS SELECT Nazwadziału, COUNT(*), SUM(wynagrodzenie) FROM Dział, Pracownik WHERE Pracownik.dział Id=Iddziału.Dział GROUP BY Nazwadziału;
Wynikiem SQL SELECT jest
SELECT * FROM V1;
Nazwa działu | LICZBA(*) | SUMA(wynagrodzenie) |
Muzyka | 5 | 56000.00 |
… | … | … |
Dramat | 2 | 25400,00 |
Należy zauważyć, że w widoku V1 nazwy atrybutów pochodzą z tabeli podstawowej. W wersji 2 nowe nazwy atrybutów są jawnie określane przy użyciu zgodności jeden do jednego między określonymi atrybutami klauzuli CREATE VIEW i atrybutami określonymi w klauzuli SELECT. Klauzula SELECT z widokiem decyduje o definicji widoku.
Informacje na widoku powinny być zawsze aktualne. Oznacza to, że musi zawsze odzwierciedlać zmiany dokonane w tabelach podstawowych, na których jest zdefiniowany. Jest to o tyle ciekawe, że oznacza to, że widok nie jest faktycznie materializowany w momencie definiowania go, ale później, gdy jest na nim określone zapytanie. System zarządzania bazą danych w tle jest odpowiedzialny za aktualizowanie widoku.
AKTUALIZUJ, WSTAWAJ i USUŃ w widokach
W SQL możliwe jest tworzenie aktualizowalnych widoków, których można używać do zmiany istniejących danych lub wstawiania nowych wierszy do widoku, który z kolei wstawia lub modyfikuje rekord w tabeli bazowej . Widok można aktualizować lub nie, jest określany przez instrukcję SELECT zdefiniowaną w definicji widoku. Nie ma specjalnej klauzuli określającej widok do aktualizacji. Zazwyczaj definicja widoku musi być prosta i nie może zawierać żadnych funkcji agregujących, takich jak SUM, AVG, MAX, MIN, COUNT. Każdy rodzaj grupowania lub klauzula DISTINCT lub JOIN również uniemożliwia aktualizację widoku. Zapoznaj się z odpowiednią instrukcją bazy danych konkretnego RDBMS, aby dowiedzieć się, co sprawia, że widok nie może być aktualizowany.
Stwórzmy widok, który można aktualizować:
CREATE VIEW v3_ch_dept_name AS SELECT deptId, deptName, deptMgrId, mgrStartDate FROM Department;
Wyświetlane zapytanie SELECT:
SELECT * FROM v3_ch_dept_name;
Identyfikator wydziału | Nazwa działu | Identyfikator działu Mgr | DataRozpoczęcia Mgr |
1 | Muzyka | 123456789 | 2020-01-01 |
… | … | … | … |
5 | Dramat | 987654321 | 2018-03-05 |
Teraz zaktualizuj widok, zmieniając nazwę działu (deptName).
UPDATE v3_ch_dept_name SET deptName = 'Security' WHERE deptId = 5;
Wiersz można wstawić do widoku w następujący sposób:
INSERT INTO v3_ch_dept_name VALUES (7,'Logistics',666884444,'1982-07-07');
Możemy również USUNĄĆ wiersz z widoku w następujący sposób:
DELETE FROM v3_ch_dept_name WHERE deptId = 7;
W MySQL możesz łatwo znaleźć widoki w bazie danych, które można aktualizować lub nie, używając polecenia SELECT.
SELECT table_name FROM information_schema.views WHERE is_updatable like 'YES' AND table_schema like 'my_company';
DROP widoki z bazy danych
Widok można zawsze usunąć za pomocą opcji DROP VIEW
DROP VIEW V1;
Zauważ, że kiedy wykonujemy polecenie drop view, usuwa ono definicję widoku. Podstawowe dane przechowywane w tabelach podstawowych, z których pochodzi ten widok, pozostają niezmienione. Po upuszczeniu widok można odtworzyć z tą samą nazwą.
Oświadczenie ALTER VIEW
Widoki są generalnie niezmienne zgodnie ze standardem SQL:2006, co oznacza, że instrukcja ALTER VIEW nie działa z widokami. Istnieją jednak RDBMS, takie jak MySQL lub SQL Server, które obsługują tego rodzaju instrukcje. Wyrocznia wierzy, że najpierw należy porzucić widok, a następnie odtworzyć go, a nie zmienić. Dlatego funkcje obsługiwane w widokach przez RDBMS różnią się w zależności od produktu.
Wniosek
Widoki SQL są również użytecznym narzędziem do uzyskiwania dostępu do wielu typów danych. Złożone zapytania mogą być przechowywane w definicji widoku. Wykorzystuje to ponowne użycie, ponieważ możemy wywoływać widok zamiast odtwarzać zapytania za każdym razem, gdy ich potrzebujemy. Jest to wygodny sposób na zaprezentowanie użytkownikowi informacji ukrywając wiele informacji, których nie chcemy udostępniać wszystkim. To ważne również z punktu widzenia bezpieczeństwa. Złożone struktury mogą być syntetyzowane i prezentowane w łatwym formacie dla użytkownika końcowego.
Referencje:
Elmasri, Ramez i Shamkant B. Navathe. Podstawy systemów baz danych . Edukacja Pearsona.