sql >> Databasteknik >  >> RDS >> Mysql

Förstå vyer i SQL

Av Manoj Debnath

Tabeller i en SQL-databas kan innehålla enorma mängder data, men de är inte alltid i ett användbart format för att vara lätt att använda. Datavolymen måste filtreras utifrån vissa specificerade kriterier för effektiv användning. På grund av säkerhetsskäl kanske vi bara vill offentliggöra en viss mängd data medan resten kan vara tillgänglig för de privilegierade användarna. SQL DML-operationerna är utökningsbara och används för att filtrera genom en eller flera tabeller med hjälp av komplexa frågeuttryck. Med hjälp av idén kan vi skapa virtuella tabeller från beständiga bastabeller med SQL som skulle innehålla exakt den data vi behöver. Detta är anledningen till att SQL:2006-standarden introducerade användningen av vytabeller eller vyer. Definitionen av en vy eller en virtuell tabell existerar som ett schemaobjekt. Den här artikeln introducerar begreppet vyer i SQL, hur det fungerar och visar hur det implementeras med några exempel.

Introduktion till SQL-vyer

SQL-vyer är inget annat än virtuella tabeller som finns i minne som härrör från en eller flera bastabeller. Virtuella tabeller betyder att tuplarna i vyerna inte existerar fysiskt och inte lagras i databasen. Tuplarna är som tillfälliga data skapade som ett resultat av SQL-frågan som vanligtvis drar filtrerade data från en eller flera bastabeller. Som ett resultat finns det en begränsning för vilken typ av operation som kan tillämpas på en vytabell. Uppdateringsåtgärden kan till exempel inte tillämpas på alla typer av vyer, men den har ingen begränsning för att tillämpa SQL-fråga på den.

Exemplen nedan är testade med MySQL-databasen. Börja med att skapa några tabeller:

mitt_företag databas:

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);

Vyerna kan ses som en referenstabell, och vi kan använda den så ofta vi vill även om den kanske inte existerar fysiskt. Till exempel kan vi ofta behöva hänvisa till mitt_företag databas och hitta Anställd och Projekt information. Observera att det finns många till många relationer mellan Anställd och Projekt eftersom en person kan arbeta med många projekt och även ett projekt har många anställda. Därför, istället för att ange sammanfogningen av tre tabeller:Anställd , EmpWorksOnProj och Projekt varje gång vi behöver en samarbetsinformation och utfärdar en fråga, definierar vi en vy som specificeras som resultatet av sammanfogningen bland dessa tabeller. Vyn bildar den virtuella tabellen som skapats från resultatet av frågan. Fördelen är att frågan nu kan hämta från en enda resulterande tabell istället för att behöva hämta från tre sammanfogade tabeller. Samlingen av tabeller:Anställd , Projekt , Avdelning etc. bildar sålunda bastabellerna eller definierande tabellen för vyn.

Låt oss skapa några vyer baserat på schemat ovan.

CREATE VIEW V1
AS
SELECT
   empName, projName, hoursWorked
FROM
   Employee, Project, EmpWorksOnProj
WHERE
   Employee.empId=EmpWorksOnProj.empId
AND
   Project.projId=EmpWorksOnProj.projId;
 

Sättet att specificera SQL-frågor på vy eller virtuell tabell är detsamma som att ange frågor som involverar bastabeller. Du kan använda SQL SELECT på vyer för att hämta data enligt följande:

VÄLJ * FRÅN V1;

EmpName

Projnamn

Anställda timmar

Musse Pigg

Klubbhus

6,50

Kalle Anka

Jordbruk

7.0

Följande skapar en andra vy:

SKAPA VY V2 SOM SELECT deptName, COUNT(*), SUM(lön) FRÅN Department, Employee WHERE Employee.deptId=Department.deptId GROUP BY deptName;

SQL SELECT resulterar i

SELECT * FROM V1;

Avdelningsnamn

COUNT(*)

SUM(lön)

Musik

5

56000,00

Drama

2

25400,00

Observera att i vy V1 härleds attributnamnen från bastabellen. I V2 specificeras nya attributnamn uttryckligen med en till en överensstämmelse mellan de specificerade attributen för CREATE VIEW-satsen och de som specificeras i SELECT-satsen. SELECT-satsen med vyn är avgörande för definitionen av vyn.

Informationen om visning ska alltid vara uppdaterad. Det betyder att den alltid måste återspegla de ändringar som gjorts i bastabellerna som den är definierad på. Detta är intressant, eftersom det betyder att vyn faktiskt inte materialiseras vid tidpunkten för att definiera den, utan senare när en fråga specificeras på den. Databashanteringssystemet i bakgrunden ansvarar för att vyn uppdateras.

UPPDATERA, INFOGA och DELETE på visningar

I SQL är det möjligt att skapa uppdateringsbara vyer som kan användas för att ändra befintliga data eller infoga nya rader i vyn som i sin tur infogar eller modifierar posten i bastabellen . En vy är uppdateringsbar eller inte bestäms av SELECT-satsen definierad i vydefinitionen. Det finns ingen särskild klausul för att ange att en vy ska kunna uppdateras. Vanligtvis måste vydefinitionen vara enkel och får inte innehålla några aggregerade funktioner som SUM, AVG, MAX, MIN, COUNT. Någon form av gruppering eller DISTINCT eller JOIN-klausul gör också att vyn inte kan uppdateras. Se den relevanta databasmanualen för det specifika RDBMS för vad som gör att en vy inte kan uppdateras.

Låt oss skapa en vy som är uppdateringsbar:

CREATE VIEW v3_ch_dept_name
AS
SELECT
   deptId, deptName, deptMgrId, mgrStartDate
FROM
   Department;

SELECT-frågan som visas:

SELECT * FROM v3_ch_dept_name;

DeptId

Avdelningsnamn

DeptMgrId

MgrStartDate

1

Musik

123456789

2020-01-01

5

Drama

987654321

2018-03-05

Uppdatera nu vyn genom att ändra avdelningens namn (deptName).

UPDATE
   v3_ch_dept_name
SET
   deptName = 'Security'
WHERE
   deptId = 5;

En rad kan infogas i vyn enligt följande:

INSERT
   INTO v3_ch_dept_name
VALUES (7,'Logistics',666884444,'1982-07-07');

Vi kan också RADERA en rad från vyn enligt följande:

DELETE FROM v3_ch_dept_name WHERE deptId = 7;

I MySQL kan du enkelt hitta vyerna i en databas som är uppdateringsbara eller som inte använder följande SELECT-kommando.

SELECT
   table_name
FROM
   information_schema.views
WHERE
   is_updatable like 'YES'
AND
   table_schema like 'my_company';

DROP vyer från databasen

En vy kan alltid kasseras med DROP VIEW kommando.

DROP VIEW V1;

Observera att när vi kör kommandot drop view tar det bort vydefinitionen. De underliggande data som lagras i bastabellerna som denna vy härrör från förblir oförändrade. En vy som en gång har tappats kan återskapas med samma namn.

ALTER VIEW-satsen

Vyer är i allmänhet oföränderliga enligt SQL:2006-standarden, det betyder att ALTER VIEW-satsen inte fungerar med vyer. Det finns dock RDBMS som MySQL eller SQL Server som stöder denna typ av uttalande. Oraklet tror på att först släppa vyn och sedan återskapa den snarare än att ändra den. Därför varierar de funktioner som stöds på visningar av RDBMS:er från produkt till produkt.

Slutsats

SQL-vyerna är också användbara verktyg för att komma åt flera datatyper. Komplexa frågor kan lagras inom vydefinitionen. Detta utnyttjar återanvändning eftersom vi kan anropa vyn istället för att återskapa frågorna varje gång vi behöver dem. Det är ett bekvämt sätt att presentera information för användaren och dölja mycket information som vi inte vill exponera för alla. Detta är också viktigt ur ett säkerhetsperspektiv. Komplexa strukturer kan syntetiseras och presenteras i ett enkelt format för slutanvändaren.

Referenser:

Elmasri, Ramez och Shamkant B. Navathe. Grundläggande av databassystem . Pearson Education.


  1. Sammanfoga flera tabeller i SQL

  2. Hur man installerar SQL Server på Windows

  3. Att få en dynamiskt genererad pivottabell till en Temp-tabell

  4. Hur REGEX_REPLACE()-funktionen fungerar i MySQL