Von Manoj Debnath
Tabellen in einer SQL-Datenbank können enorme Datenmengen enthalten, aber sie haben nicht immer ein nützliches Format, um einfach verwendet zu werden. Für eine effiziente Nutzung muss die Datenmenge nach bestimmten Kriterien gefiltert werden. Aus Sicherheitsgründen möchten wir möglicherweise nur eine bestimmte Menge an Daten veröffentlichen, während der Rest für privilegierte Benutzer zugänglich sein könnte. Die SQL-DML-Vorgänge sind erweiterbar und werden zum Filtern einer oder mehrerer Tabellen mithilfe komplexer Abfrageausdrücke verwendet. Unter Nutzung dieser Idee können wir mithilfe von SQL virtuelle Tabellen aus persistenten Basistabellen erstellen, die genau die Daten enthalten, die wir benötigen. Aus diesem Grund hat der SQL:2006-Standard die Verwendung von Ansichtstabellen oder Ansichten eingeführt. Die Definition eines Views oder einer virtuellen Tabelle existiert als Schemaobjekt. Dieser Artikel stellt das Konzept von Views in SQL vor, wie es funktioniert und zeigt anhand einiger Beispiele, wie es implementiert wird.
Einführung in SQL-Ansichten
SQL-Ansichten sind nichts anderes als virtuelle Tabellen, die sich im Speicher befinden und von einer oder mehreren Basistabellen abgeleitet sind. Virtuelle Tabellen bedeuten, dass die Tupel in Ansichten keine physische Existenz haben und nicht in der Datenbank gespeichert werden. Die Tupel sind wie temporäre Daten, die als Ergebnis der SQL-Abfrage erstellt werden, die normalerweise gefilterte Daten aus einer oder mehreren Basistabellen zieht. Daher gibt es eine Einschränkung hinsichtlich der Art der Operation, die auf eine Ansichtstabelle angewendet werden kann. Beispielsweise kann die Aktualisierungsoperation nicht auf alle Arten von Ansichten angewendet werden, es gibt jedoch keine Einschränkung bei der Anwendung von SQL-Abfragen darauf.
Die folgenden Beispiele wurden mit der MySQL-Datenbank getestet. Erstellen Sie zunächst einige Tabellen:
my_company Datenbank:
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);
Die Ansichten können als Referenztabelle betrachtet werden, und wir können sie so oft verwenden, wie wir wollen, obwohl sie möglicherweise nicht physisch vorhanden ist. Beispielsweise müssen wir möglicherweise häufig auf my_company verweisen Datenbank und suchen Sie Mitarbeiter und Projekt Information. Beachten Sie, dass es viele zu viele Beziehungen zwischen Mitarbeitern gibt und Projekt da eine Person an vielen Projekten arbeiten kann und auch ein Projekt viele Mitarbeiter hat. Anstatt also den Join von drei Tabellen anzugeben:Employee , EmpWorksOnProj und Projekt Jedes Mal, wenn wir Informationen für die Zusammenarbeit benötigen und eine Abfrage ausgeben, definieren wir eine Ansicht, die als Ergebnis der Verknüpfung zwischen diesen Tabellen angegeben wird. Der View bildet die aus dem Ergebnis der Abfrage erstellte virtuelle Tabelle. Der Vorteil besteht darin, dass die Abfrage jetzt aus einer einzelnen Ergebnistabelle abrufen kann, anstatt aus drei verknüpften Tabellen abrufen zu müssen. Die Tabellensammlung:Employee , Projekt , Abteilung etc. bilden somit die Basistabellen bzw. Definitionstabellen der View.
Lassen Sie uns einige Ansichten basierend auf dem oben angegebenen Schema erstellen.
CREATE VIEW V1 AS SELECT empName, projName, hoursWorked FROM Employee, Project, EmpWorksOnProj WHERE Employee.empId=EmpWorksOnProj.empId AND Project.projId=EmpWorksOnProj.projId;
Die Art und Weise, SQL-Abfragen für Ansichten oder virtuelle Tabellen anzugeben, ist die gleiche wie bei der Angabe von Abfragen, die Basistabellen betreffen. Sie können SQL SELECT für Ansichten verwenden, um die Daten wie folgt abzurufen:
AUSWÄHLEN * AUS V1;
Arbeitsname | Projektname | Gearbeitete Stunden |
Micky Maus | Clubhaus | 6,50 |
… | … | … |
Donald Duck | Landwirtschaft | 7.0 |
Folgendes erstellt eine zweite Ansicht:
CREATE VIEW V2 AS SELECT deptName, COUNT(*), SUM(salary) FROM Department, Employee WHERE Employee.deptId=Department.deptId GROUP BY deptName;
Die SQL-SELECT-Ergebnisse in
SELECT * FROM V1;
Abteilungsname | COUNT(*) | SUM(Gehalt) |
Musik | 5 | 56000,00 |
… | … | … |
Schauspiel | 2 | 25400,00 |
Beachten Sie, dass in View V1 die Attributnamen aus der Basistabelle abgeleitet werden. In V2 werden neue Attributnamen explizit angegeben, indem eine Eins-zu-Eins-Entsprechung zwischen den angegebenen Attributen der CREATE VIEW-Klausel und den in der SELECT-Klausel angegebenen verwendet wird. Entscheidend für die Definition der View ist die SELECT-Klausel bei der View.
Die angezeigten Informationen sollen immer aktuell sein. Das heißt, es muss immer die Änderungen widerspiegeln, die an den Basistabellen vorgenommen wurden, auf denen es definiert ist. Das ist interessant, weil es bedeutet, dass die Ansicht nicht zum Zeitpunkt ihrer Definition tatsächlich materialisiert wird, sondern später, wenn eine Abfrage darauf angegeben wird. Das Datenbankverwaltungssystem im Hintergrund ist dafür verantwortlich, die Ansicht aktuell zu halten.
AKTUALISIEREN, EINFÜGEN und LÖSCHEN in Ansichten
In SQL ist es möglich, aktualisierbare Ansichten zu erstellen, die verwendet werden können, um vorhandene Daten zu ändern oder neue Zeilen in die Ansicht einzufügen, die wiederum den Datensatz in die Basistabelle einfügen oder ändern . Ob eine Ansicht aktualisierbar ist oder nicht, wird durch die in der Ansichtsdefinition definierte SELECT-Anweisung bestimmt. Es gibt keine spezielle Klausel, die festlegt, dass eine Ansicht aktualisierbar ist. Typischerweise muss die Ansichtsdefinition einfach sein und darf keine Aggregatfunktionen wie SUM, AVG, MAX, MIN, COUNT enthalten. Jede Art von Gruppierung oder DISTINCT- oder JOIN-Klausel macht die Ansicht ebenfalls nicht aktualisierbar. Lesen Sie im entsprechenden Datenbankhandbuch des jeweiligen RDBMS nach, was eine Ansicht nicht aktualisierbar macht.
Lassen Sie uns eine aktualisierbare Ansicht erstellen:
CREATE VIEW v3_ch_dept_name AS SELECT deptId, deptName, deptMgrId, mgrStartDate FROM Department;
Die angezeigte SELECT-Abfrage:
SELECT * FROM v3_ch_dept_name;
Abteilungs-ID | Abteilungsname | DeptMgrId | MgrStartDate |
1 | Musik | 123456789 | 01.01.2020 |
… | … | … | … |
5 | Schauspiel | 987654321 | 2018-03-05 |
Aktualisieren Sie nun die Ansicht, indem Sie den Abteilungsnamen (deptName) ändern.
UPDATE v3_ch_dept_name SET deptName = 'Security' WHERE deptId = 5;
Eine Zeile kann wie folgt in die Ansicht eingefügt werden:
INSERT INTO v3_ch_dept_name VALUES (7,'Logistics',666884444,'1982-07-07');
Wir können auch wie folgt eine Zeile aus der Ansicht LÖSCHEN:
DELETE FROM v3_ch_dept_name WHERE deptId = 7;
In MySQL können Sie leicht die Ansichten in einer Datenbank finden, die aktualisierbar sind oder nicht, indem Sie den folgenden SELECT-Befehl verwenden.
SELECT table_name FROM information_schema.views WHERE is_updatable like 'YES' AND table_schema like 'my_company';
Ansichten aus der Datenbank löschen
Ein View kann immer mit DROP VIEW
DROP VIEW V1;
Beachten Sie, dass beim Ausführen des Befehls Ansicht löschen die Ansichtsdefinition entfernt wird. Die zugrunde liegenden Daten, die in den Basistabellen gespeichert sind, aus denen diese Ansicht abgeleitet wird, bleiben unverändert. Eine gelöschte Ansicht kann unter demselben Namen neu erstellt werden.
Die ALTER VIEW-Anweisung
Ansichten sind im Allgemeinen gemäß dem SQL:2006-Standard unveränderbar, dh die ALTER VIEW-Anweisung funktioniert nicht mit Ansichten. Es gibt jedoch RDBMS wie MySQL oder SQL Server, die diese Art von Anweisung unterstützen. Das Orakel glaubt daran, die Ansicht zuerst fallen zu lassen und sie dann neu zu erstellen, anstatt sie zu ändern. Daher variieren die von RDBMS auf Ansichten unterstützten Funktionalitäten von Produkt zu Produkt.
Schlussfolgerung
Die SQL-Ansichten sind auch ein nützliches Werkzeug für den Zugriff auf mehrere Datentypen. Komplexe Abfragen können innerhalb der Ansichtsdefinition gespeichert werden. Dies nutzt die Wiederverwendung, da wir die Ansicht aufrufen können, anstatt die Abfragen jedes Mal neu zu erstellen, wenn wir sie benötigen. Es ist eine bequeme Möglichkeit, Benutzern Informationen zu präsentieren, die viele Informationen verbergen, die wir nicht allen offenlegen möchten. Dies ist auch aus Sicherheitssicht wichtig. Komplexe Strukturen können synthetisiert und in einem einfachen Format für den Endbenutzer präsentiert werden.
Referenzen:
Elmasri, Ramez und Shamkant B. Navathe. Grundlagen von Datenbanksystemen . Pearson-Bildung.