sql >> Database teknologi >  >> RDS >> Mysql

MySQL-visninger

Her forklarer jeg, hvad MySQL "views" er, og hvordan man bruger dem.

MySQL giver os muligheden for at skabe visninger . En visning er defineret som en lagret forespørgsel, der, når den startes, producerer et resultatsæt. Nogle mennesker omtaler synspunkter som "virtuelle tabeller".

Klart som mudder? Lad os prøve igen.

Hvad er en visning?

En visning er en forespørgsel, som du gemmer i databasen. Du kan derefter køre det senere ved blot at kalde den visning (i stedet for at skrive forespørgslen ud igen).

Visningen kunne bestå af en kompleks forespørgsel, men den vil præsentere resultaterne, som om det var en tabel. Derfor kan du forespørge på visningen, som om det var en tabel.

For eksempel kan du have en kompleks forespørgsel, der udvælger data fra tre forskellige tabeller. Du kan enten skrive denne komplekse forespørgsel ud, hver gang du skal køre den, eller du kan gemme forespørgslen som en visning. Når den er blevet gemt som en visning, kan du køre en simpel SELECT sætning for at returnere resultaterne af den komplekse forespørgsel. Men du kan selvfølgelig også skrive en kompleks forespørgsel mod visningen, hvis det er nødvendigt.

Opret en visning

Det er meget enkelt at oprette visninger. Du går blot forud for din forespørgsel med én linje kode og kører den. Visningen vil straks blive oprettet i din database.

Syntaks

For at oprette en visning skal du skrive følgende sætning efterfulgt af forespørgslen:

CREATE VIEW view_name AS

Erstat view_name med hvilket navn du vil bruge til visningen.

Eksempel

Hvis vi kører følgende kode mod FruitShop database:

CREATE VIEW vFruitInventory AS
SELECT 
    Fruit.FruitName,
    Fruit.Inventory,
    Units.UnitName
FROM
	Fruit INNER JOIN Units ON
    Fruit.UnitId = Units.UnitId;

Vi ser nu en visning kaldet vFruitInventory opført under Visninger (du skal muligvis klikke på Opdater knappen for SCHEMAS menu først):

Det er en god idé at tænke på en navnekonvention for dine synspunkter (som med ethvert andet databaseobjekt) og holde sig til det. Mange udviklere præfikser deres visningsnavne med v , vw , v eller vw_ så det gør det nemmere at skelne visninger fra tabeller i deres forespørgsler. Andre udviklere er dog uenige i denne konvention og foretrækker, at deres tabel- og visningsnavne kan udskiftes.

Forespørgsel efter en visning

Nu kan vi forespørge i visningen, ligesom vi ville forespørge i en tabel:

SELECT * FROM vFruitInventory;

Resultat:

Vi kan selvfølgelig også bruge en mere specifik forespørgsel. For eksempel denne, der kun vælger de poster, hvor beholdningen er større end eller mindre end 10:

SELECT FruitName 
FROM vFruitInventory
WHERE Inventory <= 10;

Men vi kan ikke forespørgselskolonner, der ikke refereres til i visningen (selvom de er i de underliggende tabeller, som visningen forespørger på).

For eksempel kan vi forespørge Fruit tabel som denne:

SELECT * 
FROM Fruit
WHERE FruitId = 1;

Men vi kan ikke stille spørgsmål til ovenstående vFruitInventory se sådan her:

SELECT * 
FROM vFruitInventory
WHERE FruitId = 1;

Dette skyldes, at visningen ikke returnerer FruitId kolonne. Vi specificerede de nøjagtige kolonner i visningen, og det er alle, der returneres. Som nævnt er resultatsættet af visningen ligesom en tabel, og nogle kan lide at kalde det en "virtuel tabel". Hvis "tabellen" ikke inkluderer disse kolonner, kan du ikke forespørge på dem.

I stedet for at være en begrænsning er dette faktisk en funktion af synspunkter. Denne funktion betyder, at vi kan give brugere adgang til nogle kolonner i en tabel, men ikke andre (via visningen). Med andre ord kan vi give en bruger adgang til en visning uden at give denne bruger adgang til de underliggende tabeller, som visningen tilgår. Nogle tabeller kan gemme følsomme oplysninger, som brugeren ikke har adgang til. Men de samme tabeller kan også gemme ikke-følsomme oplysninger, som de bruger adgang. Hvad skal man gøre? Skab en udsigt! Og den visning kan kun vælge de ikke-følsomme oplysninger fra disse tabeller.

Ændring af en visning

Her er to forskellige metoder til at ændre din visning.

Mulighed 1:Brug ALTER VIEW Erklæring

Du kan ændre en visning ved at bruge ALTER VIEW udmelding. Sådan:

ALTER VIEW view_name AS

Erstat view_name med navnet på den visning, du gerne vil ændre.

Eksempel

Lad os tilføje Fruit.FruitId felt til visningen:

ALTER VIEW vFruitInventory AS
SELECT 
	Fruit.FruitId,
    Fruit.FruitName,
    Fruit.Inventory,
    Units.UnitName
FROM
	Fruit INNER JOIN Units ON
    Fruit.UnitId = Units.UnitId;

Nu, når vi prøver at returnere FruitId felt i vores forespørgsler vil vi få resultater.

Men bemærk, at vi ikke kan forsøge at få adgang til dette felt som Fruit.FruitId . Vi kan kun få adgang til det som FruitId . Og sådan skal det være. Når alt kommer til alt, er visningen en "virtuel tabel", og vi har ikke behov for at kende strukturen af ​​de tabeller, den forespørger på.

Mulighed 2:Brug CREATE OR REPLACE

Bemærk, at visningen skal eksistere, før du kører ALTER VIEW udmelding. Hvis det ikke findes, vil du modtage en fejl. Du kan undgå dette problem ved at bruge en CREATE OR REPLACE udmelding. Dette vil oprette visningen, hvis den ikke eksisterer, eller erstatte den, hvis den gør.

Så vi kunne have oprettet ovenstående visning sådan her:

CREATE OR REPLACE VIEW vFruitInventory AS
SELECT 
    Fruit.FruitName,
    Fruit.Inventory,
    Units.UnitName
FROM
	Fruit INNER JOIN Units ON
    Fruit.UnitId = Units.UnitId;

Og så kunne vi opdatere den ved at bruge den samme CREATE OR REPLACE udsagn, men bare ændre definitionen. For eksempel ved at tilføje Fruit.FruitId felt:

CREATE OR REPLACE VIEW vFruitInventory AS
SELECT 
	Fruit.FruitId,
    Fruit.FruitName,
    Fruit.Inventory,
    Units.UnitName
FROM
	Fruit INNER JOIN Units ON
    Fruit.UnitId = Units.UnitId;

Slip en visning

Du slipper en visning ved at bruge DROP VIEW udmelding. Sådan:

DROP VIEW vFruitInventory

Ovenstående erklæring vil fjerne visningen kaldet vFruitInventory .

Slet flere visninger

Du kan droppe flere visninger ved at bruge den samme DROP VIEW udmelding. Bare adskil hvert visningsnavn med et komma. Sådan:

DROP VIEW view_1, view_2 ...

HVIS FINDER Klausul

Du kan også bruge HVIS EKSISTERER klausul for at forhindre en fejl i at opstå, hvis en visning ikke eksisterer:

DROP VIEW IF EXISTS view_1, view_2 ...

  1. Hvordan udlæses resultatet af SELECT-sætningen, som udføres ved hjælp af indbygget dynamisk SQL?

  2. MySQL enkelt citater, dobbelte citater, tilbage citater Brug forklaret

  3. Hent række hvor datetime column =today - SQL server noob

  4. SQL Inner Join