Od Manoje Debnatha
Tabulky v databázi SQL mohou obsahovat obrovské množství dat, ale ne vždy jsou v užitečném formátu, aby se daly snadno použít. Objem dat musí být filtrován na základě určitých specifikovaných kritérií pro efektivní využití. Z bezpečnostních důvodů můžeme chtít zveřejnit pouze určité množství dat, zatímco zbytek může být přístupný privilegovaným uživatelům. Operace SQL DML jsou rozšiřitelné a používají se k filtrování jedné nebo více tabulek pomocí složitých výrazů dotazů. S využitím této myšlenky můžeme vytvořit virtuální tabulky z perzistentních základních tabulek pomocí SQL, které by obsahovaly přesně ta data, která potřebujeme. To je důvod, proč standard SQL:2006 zavedl použití pohledových tabulek nebo pohledů. Definice pohledu nebo virtuální tabulky existuje jako objekt schématu. Tento článek představuje koncept pohledů v SQL, jak funguje a ukazuje, jak je implementován na několika příkladech.
Úvod do SQL Views
Pohledy SQL nejsou nic jiného než virtuální tabulky umístěné v paměti odvozené z jedné nebo více základních tabulek. Virtuální tabulky znamenají, že n-tice v pohledech fyzicky neexistují a nejsou uloženy v databázi. N-tice jsou jako dočasná data vytvořená jako výsledek dotazu SQL, který obvykle čerpá filtrovaná data z jedné nebo více základních tabulek. V důsledku toho existuje omezení typu operace, kterou lze použít na tabulku zobrazení. Operaci aktualizace například nelze použít na všechny typy pohledů, ale nemá žádné omezení na použití dotazu SQL.
Níže uvedené příklady jsou testovány s databází MySQL. Začněte vytvořením několika tabulek:
moje_společnost databáze:
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);
Pohledy lze považovat za referenční tabulku a můžeme ji používat tak často, jak chceme, i když nemusí fyzicky existovat. Například můžeme často potřebovat odkazovat na moje_společnost databázi a najděte Zaměstnanec a Projekt informace. Všimněte si, že mezi zaměstnancem existuje mnoho nebo mnoho vztahů a Projekt protože jedna osoba může pracovat na mnoha projektech a také jeden projekt má mnoho zaměstnanců. Proto místo určení spojení tří tabulek:Zaměstnanec , EmpWorksOnProj a Projekt pokaždé, když potřebujeme informace o spolupráci a zadáme dotaz, definujeme pohled, který je specifikován jako výsledek spojení mezi těmito tabulkami. Pohled tvoří virtuální tabulku vytvořenou z výsledku dotazu. Výhodou je, že dotaz nyní může načítat z jedné výsledné tabulky místo toho, aby musel načítat ze tří spojených tabulek. Kolekce tabulek:Zaměstnanec , Projekt , Oddělení atd. tvoří základní tabulky nebo definující tabulku pohledu.
Vytvořme několik pohledů na základě výše uvedeného schématu.
CREATE VIEW V1 AS SELECT empName, projName, hoursWorked FROM Employee, Project, EmpWorksOnProj WHERE Employee.empId=EmpWorksOnProj.empId AND Project.projId=EmpWorksOnProj.projId;
Způsob zadávání dotazů SQL v pohledu nebo virtuální tabulce je stejný jako při zadávání dotazů zahrnujících základní tabulky. Pomocí SQL SELECT na pohledech můžete získat data následovně:
SELECT * FROM V1;
EmpName | Název projektu | Odpracované hodiny |
Mickey Mouse | Klubovna | 6,50 |
… | … | … |
Kačer Donald | Zemědělství | 7.0 |
Následující vytvoří druhý pohled:
CREATE VIEW V2 AS SELECT deptName, COUNT(*), SUM(plat) FROM Department, Employee WHERE Employee.deptId=Department.deptId GROUP BY deptName;
Výsledkem SQL SELECT je
SELECT * FROM V1;
DeptName | POČET(*) | SUM(plat) |
Hudba | 5 | 56 000,00 |
… | … | … |
Drama | 2 | 25400,00 |
Všimněte si, že v pohledu V1 jsou názvy atributů odvozeny ze základní tabulky. Ve verzi V2 jsou nové názvy atributů explicitně specifikovány pomocí korespondence jedna ku jedné mezi zadanými atributy klauzule CREATE VIEW a těmi, které jsou uvedeny v klauzuli SELECT. Klauzule SELECT s pohledem je rozhodující pro definici pohledu.
Zobrazené informace by měly být vždy aktuální. To znamená, že musí vždy odrážet změny provedené v základních tabulkách, na kterých je definován. To je zajímavé, protože to znamená, že pohled se ve skutečnosti nezhmotní v okamžiku jeho definování, ale později, když je na něj specifikován dotaz. Systém správy databáze na pozadí je zodpovědný za udržování aktuálního zobrazení.
AKTUALIZOVAT, INSERT a DELETE v zobrazeních
V SQL je možné vytvářet aktualizovatelné pohledy, které lze použít ke změně existujících dat nebo vložení nových řádků do pohledu, který zase vloží nebo upraví záznam v základní tabulce . To, zda je pohled aktualizovatelný nebo ne, je určeno příkazem SELECT definovaným v definici pohledu. Neexistuje žádná zvláštní klauzule, která by určila, že pohled bude aktualizovatelný. Obvykle musí být definice pohledu jednoduchá a nesmí obsahovat žádné agregační funkce, jako je SUM, AVG, MAX, MIN, COUNT. Jakýkoli druh seskupení nebo klauzule DISTINCT nebo JOIN také činí pohled neaktualizovatelným. Informace o tom, proč je pohled neaktualizovatelný, naleznete v příslušném databázovém manuálu konkrétního RDBMS.
Pojďme vytvořit pohled, který lze aktualizovat:
CREATE VIEW v3_ch_dept_name AS SELECT deptId, deptName, deptMgrId, mgrStartDate FROM Department;
Dotaz SELECT na zobrazení:
SELECT * FROM v3_ch_dept_name;
DeptId | DeptName | DeptMgrId | MgrStartDate |
1 | Hudba | 123456789 | 2020-01-01 |
… | … | … | … |
5 | Drama | 987654321 | 2018-03-05 |
Nyní aktualizujte zobrazení změnou názvu oddělení (deptName).
UPDATE v3_ch_dept_name SET deptName = 'Security' WHERE deptId = 5;
Řádek lze do pohledu vložit následovně:
INSERT INTO v3_ch_dept_name VALUES (7,'Logistics',666884444,'1982-07-07');
Také můžeme ODSTRANIT řádek z pohledu následovně:
DELETE FROM v3_ch_dept_name WHERE deptId = 7;
V MySQL můžete snadno najít pohledy v databázi, které jsou aktualizovatelné nebo nepoužívají následující příkaz SELECT.
SELECT table_name FROM information_schema.views WHERE is_updatable like 'YES' AND table_schema like 'my_company';
DROP pohledy z databáze
Pohled lze vždy odstranit pomocí DROP VIEW
DROP VIEW V1;
Všimněte si, že když spustíme příkaz drop view, odstraní definici pohledu. Základní data uložená v základních tabulkách, ze kterých je tento pohled odvozen, zůstávají nezměněna. Po vynechání pohledu lze znovu vytvořit se stejným názvem.
Příkaz ALTER VIEW
Pohledy jsou obecně neměnné podle standardu SQL:2006, to znamená, že příkaz ALTER VIEW s pohledy nefunguje. Existují však RDBMS jako MySQL nebo SQL Server, které podporují tento druh příkazů. Oracle věří v to, že pohled je třeba nejprve shodit a poté jej znovu vytvořit, spíše než jej měnit. Proto se funkce podporované v zobrazeních pomocí RDBMS liší produkt od produktu.
Závěr
Pohledy SQL jsou také užitečným nástrojem pro přístup k více typům dat. V definici pohledu lze ukládat složité dotazy. To využívá opětovné použití, protože můžeme vyvolat zobrazení namísto opětovného vytváření dotazů pokaždé, když je potřebujeme. Je to pohodlný způsob, jak prezentovat informace uživateli, skrývající mnoho informací, které nechceme vystavovat každému. To je důležité i z hlediska bezpečnosti. Složité struktury lze syntetizovat a prezentovat ve snadném formátu pro koncového uživatele.
Odkazy:
Elmasri, Ramez a Shamkant B. Navathe. Základy databázových systémů . Pearson Education.