sql >> Databáze >  >> RDS >> Mysql

Pochopení pohledů v SQL

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 příkaz.

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.


  1. Rozdíl ve zpracování mezer mezi Oracle a SQL Server

  2. Vyberte datový typ pole v postgresu

  3. Jak vymažete protokol transakcí SQL Server?

  4. seznam schémat s velikostmi (relativní a absolutní) v databázi PostgreSQL