sql >> Databasteknik >  >> RDS >> Mysql

MySQL-vyer

Här förklarar jag vad MySQL "vyer" är och hur man använder dem.

MySQL ger oss möjligheten att skapa vyer . En vy definieras som en lagrad fråga som när den anropas producerar en resultatuppsättning. Vissa människor hänvisar till åsikter som "virtuella tabeller".

Klar som lera? Låt oss försöka igen.

Vad är en vy?

En vy är en fråga som du sparar i databasen. Du kan sedan köra det senare helt enkelt genom att anropa den vyn (istället för att skriva ut frågan igen).

Vyn kan bestå av en komplex fråga men den kommer att presentera resultaten som om det vore en tabell. Därför kan du fråga vyn som om det vore en tabell.

Du kan till exempel ha en komplex fråga som väljer data från tre olika tabeller. Du kan antingen skriva in den här komplexa frågan varje gång du behöver köra den, eller så kan du spara frågan som en vy. När den väl har sparats som en vy kan du köra en enkel SELECT för att returnera resultatet av den komplexa frågan. Men självklart kan du också skriva en komplex fråga mot vyn om det behövs.

Skapa en vy

Att skapa vyer är väldigt enkelt. Du föregår helt enkelt din fråga med en rad kod och kör den. Vyn skapas omedelbart i din databas.

Syntax

För att skapa en vy, skriv följande uttalande, följt av frågan:

CREATE VIEW view_name AS

Ersätt view_name med vilket namn du än vill använda för vyn.

Exempel

Om vi ​​kör följande kod mot FruitShop databas:

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 vy som heter vFruitInventory listas under Visningar (du kan behöva klicka på Uppdatera knappen för SCHEMAS meny först):

Det är en bra idé att tänka på en namnkonvention för dina åsikter (som med alla andra databasobjekt) och hålla fast vid den. Många utvecklare prefixer sina vynamn med v , vw , v eller vw_ så att det gör det lättare att skilja vyer från tabeller i sina frågor. Andra utvecklare håller dock inte med om denna konvention och föredrar att deras tabell- och vynamn är utbytbara.

Fråga en vy

Nu kan vi fråga vyn precis som vi skulle fråga en tabell:

SELECT * FROM vFruitInventory;

Resultat:

Naturligtvis kan vi också använda en mer specifik fråga. Till exempel, den här som bara väljer de poster där lagret är större än eller mindre än 10:

SELECT FruitName 
FROM vFruitInventory
WHERE Inventory <= 10;

Men vi kan inte frågekolumner som inte hänvisas till i vyn (även om de finns i de underliggande tabellerna som vyn frågar efter).

Till exempel kan vi fråga Fruit tabell så här:

SELECT * 
FROM Fruit
WHERE FruitId = 1;

Men vi kan inte fråga ovanstående vFruitInventory se så här:

SELECT * 
FROM vFruitInventory
WHERE FruitId = 1;

Detta beror på att vyn inte returnerar FruitId kolumn. Vi angav de exakta kolumnerna i vyn och de är allt som returneras. Som nämnts är resultatuppsättningen av vyn precis som en tabell och vissa vill kalla det en "virtuell tabell". Om "tabellen" inte innehåller dessa kolumner kan du inte fråga dem.

Istället för att vara en begränsning är detta faktiskt en funktion av synpunkter. Den här funktionen innebär att vi kan ge användare åtkomst till vissa kolumner i en tabell men inte andra (via vyn). Med andra ord kan vi ge en användare åtkomst till en vy utan att ge den användaren åtkomst till de underliggande tabellerna som vyn kommer åt. Vissa tabeller kan lagra känslig information som användaren inte har åtkomst till. Men samma tabeller kan också lagra okänslig information som de behöver få tillgång till. Vad ska man göra? Skapa en vy! Och den vyn kan bara välja okänslig information från dessa tabeller.

Ändra en vy

Här är två olika metoder för att ändra din vy.

Alternativ 1:Använd ALTER VIEW Uttalande

Du kan ändra en vy genom att använda ALTER VIEW påstående. Så här:

ALTER VIEW view_name AS

Ersätt view_name med namnet på vyn som du vill ändra.

Exempel

Låt oss lägga till Fruit.FruitId fältet till vyn:

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 försöker returnera FruitId fältet i våra frågor får vi resultat.

Men observera att vi inte kan försöka komma åt det här fältet som Fruit.FruitId . Vi kan bara komma åt det som FruitId . Och så här ska det vara. När allt kommer omkring är vyn en "virtuell tabell" och vi behöver inte veta strukturen på de tabeller som den frågar efter.

Alternativ 2:Använd SKAPA ELLER ERSÄTT

Observera att vyn måste finnas innan du kör ALTER VIEW påstående. Om det inte finns får du ett felmeddelande. Du kan undvika detta problem genom att använda en CREATE OR REPLACE påstående. Detta kommer att skapa vyn om den inte finns, eller ersätta den om den gör det.

Så vi kunde ha skapat ovanstående vy så här:

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

Och sedan kan vi uppdatera den genom att använda samma SKAPA ELLER ERSÄTT uttalande, utan bara ändra definitionen. Till exempel, lägga till Fruit.FruitId fält:

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;

Släpp en vy

Du släpper en vy genom att använda DROP VIEW påstående. Så här:

DROP VIEW vFruitInventory

Ovanstående uttalande tar bort vyn som heter vFruitInventory .

Släpp flera visningar

Du kan ta bort flera vyer med samma DROP VIEW påstående. Separera bara varje vynamn med ett kommatecken. Så här:

DROP VIEW view_1, view_2 ...

OM FINNS Klausul

Du kan också använda OM FINNS klausul för att förhindra att ett fel uppstår om en vy inte finns:

DROP VIEW IF EXISTS view_1, view_2 ...

  1. Vilka resurser finns för justering av databasprestanda?

  2. RDBMS vs NoSQL

  3. Hur skickar man XML från C# till en lagrad procedur i SQL Server 2008?

  4. Oracle SQL-fråga:Hämta senaste värden per grupp baserat på tid