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

Zobrazení MySQL

Zde vysvětluji, co jsou "pohledy" MySQL a jak je používat.

MySQL nám poskytuje možnost vytvářet pohledy . pohled je definován jako uložený dotaz, který po vyvolání vytvoří sadu výsledků. Někteří lidé označují pohledy za „virtuální tabulky“.

Jasný jako bláto? Zkusme to znovu.

Co je zobrazení?

Pohled je dotaz, který uložíte do databáze. Později jej můžete spustit jednoduše voláním tohoto zobrazení (namísto opětovného vypisování dotazu).

Pohled může sestávat ze složitého dotazu, ale výsledky zobrazí, jako by to byla tabulka. Proto můžete dotazovat zobrazení, jako by šlo o tabulku.

Můžete mít například složitý dotaz, který vybírá data ze tří různých tabulek. Tento složitý dotaz můžete buď napsat pokaždé, když jej potřebujete spustit, nebo můžete dotaz uložit jako pohled. Jakmile je uložen jako pohled, můžete spustit jednoduchý SELECT příkaz vrátit výsledky složitého dotazu. Ale samozřejmě můžete také napsat složitý dotaz proti pohledu, pokud je to nutné.

Vytvořit zobrazení

Vytváření pohledů je velmi jednoduché. Stačí zadat před dotaz jeden řádek kódu a spustit jej. Pohled bude okamžitě vytvořen ve vaší databázi.

Syntaxe

Chcete-li vytvořit zobrazení, zadejte následující příkaz a za ním dotaz:

CREATE VIEW view_name AS

Nahraďte view_name s jakýmkoli názvem, který chcete použít pro zobrazení.

Příklad

Pokud spustíme následující kód proti FruitShop databáze:

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

Nyní vidíme pohled nazvaný vFruitInventory uvedeny v části Zobrazení (možná budete muset kliknout na Obnovit tlačítko pro SCHÉMA nejprve menu):

Je dobré si pro své pohledy vymyslet konvenci pojmenování (jako u každého jiného databázového objektu) a držet se jí. Mnoho vývojářů uvádí před názvy zobrazení v , vw , v_ nebo vw_ tak, aby bylo snazší rozlišit pohledy od tabulek v jejich dotazech. Jiní vývojáři však s touto konvencí nesouhlasí a dávají přednost tomu, aby jejich názvy tabulek a pohledů byly zaměnitelné.

Dotaz na zobrazení

Nyní můžeme dotazovat pohled stejně, jako bychom dotazovali tabulku:

SELECT * FROM vFruitInventory;

Výsledek:

Samozřejmě můžeme použít i konkrétnější dotaz. Například tento, který vybírá pouze ty záznamy, kde je inventář větší nebo menší než 10:

SELECT FruitName 
FROM vFruitInventory
WHERE Inventory <= 10;

Ale nemůžeme sloupce dotazu, na které se v zobrazení neodkazuje (i když jsou v podkladových tabulkách, které zobrazení dotazuje).

Můžeme se například zeptat na Ovoce tabulka takto:

SELECT * 
FROM Fruit
WHERE FruitId = 1;

Nemůžeme se ale dotazovat na výše uvedený vFruitInventory zobrazit takto:

SELECT * 
FROM vFruitInventory
WHERE FruitId = 1;

Důvodem je, že zobrazení nevrací FruitId sloupec. Zadali jsme přesné sloupce v pohledu a to jsou všechny, které jsou vráceny. Jak již bylo zmíněno, výsledná sada pohledu je jako tabulka a někteří ji rádi nazývají "virtuální tabulka". Pokud „tabulka“ tyto sloupce neobsahuje, nemůžete se na ně dotazovat.

Spíše než o omezení jde ve skutečnosti o funkci zhlédnutí. Tato funkce znamená, že můžeme uživatelům udělit přístup k některým sloupce tabulky, ale ne jiné (prostřednictvím zobrazení). Jinými slovy, můžeme uživateli udělit přístup k pohledu, aniž bychom mu udělili přístup k podkladovým tabulkám, ke kterým pohled přistupuje. Některé tabulky mohou ukládat citlivé informace, ke kterým uživatel nemá povolen přístup. Ale stejné tabulky mohou také ukládat necitlivé informace, které potřebují mít přístup. Co dělat? Vytvořte pohled! A tento pohled může vybrat pouze necitlivé informace z těchto tabulek.

Úprava zobrazení

Zde jsou dva různé způsoby úpravy zobrazení.

Možnost 1:Použijte ALTER VIEW Prohlášení

Zobrazení můžete upravit pomocí ALTER VIEW prohlášení. Takhle:

ALTER VIEW view_name AS

Nahraďte view_name s názvem pohledu, který chcete změnit.

Příklad

Přidejme Fruit.FruitId pole k zobrazení:

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

Nyní, když se pokusíme vrátit FruitId pole v našich dotazech získáme výsledky.

Upozorňujeme však, že se nemůžeme pokusit o přístup k tomuto poli jako Fruit.FruitId . Můžeme k němu přistupovat pouze jako FruitId . A tak to má být. Koneckonců, pohled je "virtuální tabulka" a nepotřebujeme znát strukturu tabulek, které se dotazuje.

Možnost 2:Použijte CREATE OR REPLACE

Pamatujte, že před spuštěním ALTER VIEW musí zobrazení existovat prohlášení. Pokud neexistuje, zobrazí se chyba. Tomuto problému se můžete vyhnout pomocí CREATE OR REPLACE prohlášení. Toto vytvoří pohled, pokud neexistuje, nebo jej nahradí, pokud existuje.

Výše uvedený pohled bychom tedy mohli vytvořit takto:

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

A pak bychom jej mohli aktualizovat pomocí stejného CREATE OR REPLACE prohlášení, ale pouze úprava definice. Například přidáním Fruit.FruitId pole:

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;

Vypuštění zobrazení

Zobrazení můžete pustit pomocí DROP VIEW prohlášení. Takhle:

DROP VIEW vFruitInventory

Výše uvedené prohlášení odstraní zobrazení s názvem vFruitInventory .

Vypuštění více zobrazení

Pomocí stejného DROP VIEW můžete zrušit více pohledů prohlášení. Každý název pohledu oddělte čárkou. Takhle:

DROP VIEW view_1, view_2 ...

Položka IF EXISTS Ustanovení

Můžete také použít IF EXISTS klauzule, která zabrání výskytu chyby, pokud pohled neexistuje:

DROP VIEW IF EXISTS view_1, view_2 ...

  1. Zkontrolujte, zda na tabulku odkazuje cizí klíč na serveru SQL pomocí OBJECTPROPERTY()

  2. Usnadněte si výkon SQL serveru

  3. Připojení AnySQL Maestro k Salesforce.com

  4. Jak vytvořit tabulku pomocí výběrového dotazu v SQL Server?