Co je zobrazení MySQL?
Pohled MySQL je prostě obyčejný databázový objekt, který může při správném použití ušetřit mnoho času autorům dotazů SQL. Pohled je uložený dotaz, na který může uživatel odkazovat stejně jako na tabulku. Mnohokrát uživatelé zjistí, že používají stejný základní dotaz znovu a znovu k vyřešení více problémů. Zobrazení představují způsob, jak rychle uložit tento dotaz a odkazovat na něj později.
Jaké jsou výhody používání pohledů?
Pohledy mají několik výhod. Za prvé, zobrazení se uživateli MySQL jeví jako tabulka. Klauzule SELECT může odkazovat na pohled přesně jako na tabulku. Další výhodou je, že když se změní podkladové tabulky, na které pohled odkazuje, změní se také výsledky pohledu. Třetí výhodou je, že pohled zabírá velmi málo místa na serveru. Výsledky SQL zobrazení se počítají při každém přístupu, takže nejsou uloženy na serveru, dokud k nim není přístup.
Tabulky pro toto cvičení
Pro tento článek bude vytvořena databáze obsahující informace o fiktivní sezóně automobilových závodů se třemi jezdci, čtyřmi tratěmi a jedním závodem na každé trati. V této databázi jsou čtyři tabulky.
- Ovladače
- Stopy
- Závody
- Dokončí
Struktura tabulek je popsána níže.
create table drivers
(
id int auto_increment,
name varchar(64) not null,
car_number int not null,
constraint drivers_pk
primary key (id)
);
create table tracks
(
id int auto_increment,
name varchar(64) not null,
location varchar(64) not null,
constraint track_pk
primary key (id)
);
create table races
(
id int auto_increment,
name varchar(64) not null,
track int not null,
distance int not null,
constraint races_pk
primary key (id)
);
create table finishes
(
id int auto_increment,
driver int not null,
race int not null,
position int not null,
constraint finishes_pk
primary key (id)
);
Ovladače
Nyní v dalším kroku vložíme do tabulky tři řidiče a jejich čísla aut.
- Buddy Baker 28
- Dale Earnhardt Jr. 8
- Ricky Rudd 88
insert into drivers (name,car_number) values
('Buddy Baker',28),
('Dale Earnhardt Jr.',8),
('Ricky Rudd',88);
Naše výsledky nyní ukážou následující výstup.
ID | Název | Číslo vozu |
1 | Buddy Baker | 28 |
2 | Dale Earnhardt Jr. | 8 |
3 | Ricky Rudd | 88 |
Závodní dráhy
Dále přidáme čtyři závodní dráhy a jejich umístění.
- Talladega Superspeedway – Lincoln, AL
- Daytona International Speedway – Daytona Beach, FL
- Indianapolis Motor Speedway – Speedway, IN
- Michigan International Speedway – Brooklyn, MI
insert into tracks (name,location) values
('Talladega Superspeedway','Lincoln, AL'),
('Daytona International Speedway','Daytona Beach, FL'),
('Indianapolis Motor Speedway','Speedway, IN'),
('Michigan International Speedway','Brooklyn, MI');
Naše výsledky nyní ukážou následující výstup.
ID | Název | Umístění |
1 | Talladega Superspeedway | Lincoln, AL |
2 | Daytona International Speedway | Daytona Beach, FL |
3 | Indianapolis Motor Speedway | Speedway, IN |
4 | Michigan International Speedway | Brooklyn, MI |
Závody
Nyní jsou přihlášeny čtyři závody spolu se vzdáleností každého z nich.
- Daytona 500 , 2 500
- Talladega 500,1,500
- Cihelna 400,3, 400
- Michigan 400, 4, 400
insert into races (name,track,distance) values
('Daytona 500',2,500),
('Talladega 500',1,500),
('Brickyard 400',3,400),
('Michigan 400',4,'400');
Naše výsledky nyní ukážou následující výstup.
ID | Název | Sledovat | Vzdálenost |
1 | Talladega 500 | 2 | 500 |
2 | Daytona 500 | 1 | 500 |
3 | Chelna 400 | 3 | 400 |
4 | Michigan 400 | 4 | 400 |
Výsledky
Konečně jsou nyní vytvořeny tabulky pro začátek sezóny.
V prvním závodě na Daytona 500:
- Ricky Rudd skončí první
- Dale Earnhardt Jr. skončil druhý
- Buddy Baker skončil třetí.
insert into finishes (driver, race, position) values
(1,1,3),
(2,1,2),
(3,1,1);
Zkompilovaná data
První zadání dat
Nyní existují skutečná data k dotazování. Pokud spustíme dotaz, abychom se podívali na všechny výsledky jezdců s jejich odpovídajícími tratěmi a závody, je to trochu komplikované, protože existuje několik spojení.
select d.name as driver,
r.name as race,
t.name as track,
t.location as location,
f.position as position
from finishes f
left join races r
on f.race = r.id
left join tracks t
on r.track = t.id
left join drivers d
on d.id = f.driver;
Naše výsledky nyní ukazují následující výstup.
Ovladač | Závod | Sledovat | Umístění | Pozice |
Buddy Baker | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 3 |
Dale Earnhardt Jr. | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 2 |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Druhý vstup dat
Vzhledem k tomu, že druhá rasa, Talladega 500, jsou přidána data, dotaz lze napsat znovu, stejně jako předchozí dotaz. V tomto závodě je na prvním místě Dale Earnhardt a na druhém Buddy Baker.
insert into finishes (driver, race, position) values
(1,2,2),
(2,2,1),
(3,2,3);
Výsledky výše uvedeného dotazu by vypadaly takto.
Ovladač | Závod | Sledovat | Umístění | Pozice |
Buddy Baker | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 3 |
Dale Earnhardt Jr. | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 2 |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Buddy Baker | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 2 |
Dale Earnhardt, Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Ricky Rudd | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 3 |
Vytvořit zobrazení
Nyní, když je v databázi více závodů, existují nové způsoby, jak nahlížet na výsledky. Dotazy lze psát na „Nejlepší provedení “ a „Nejvíce výher .“ Všechny tyto dotazy by začínaly stejnými základními údaji o tom, co jezdci dokončili v jednotlivých závodech. Pro zjednodušení procesu vývoje těchto dotazů lze pohled vytvořit s klauzulí „vytvořit nebo nahradit pohled jako“. Po této klauzuli následuje SQL, který se má uložit. V tomto případě se přidá před předchozí dotaz, který jsme ukázali výše.
create or replace view all_finishes as
select d.name as driver,
r.name as race,
t.name as track,
t.location as location,
f.position as position
from finishes f
left join races r
on f.race = r.id
left join tracks t
on r.track = t.id
left join drivers d
on d.id = f.driver;
Výsledkem je výkonná funkce SQL. Tento výsledek je nyní něco, co vypadá jako tabulka, ale změní se, když jsou do jakékoli podkladové tabulky přidány nové informace. Spusťte tento dotaz.
select * from all_finishes;
Ovladač | Závod | Sledovat | Umístění | Pozice |
Buddy Baker | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 3 |
Dale Earnhardt Jr. | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 2 |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Buddy Baker | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 2 |
Dale Earnhardt, Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Ricky Rudd | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 3 |
Výsledky jsou stejné jako při posledním spuštění tohoto dotazu:
Rozdíl je v tom, že pohled lze nyní dotazovat jako tabulku. Dotaz, který ukazuje vítěze každého závodu.
select * from all_finishes where position = 1;
Dotaz poskytuje tyto výsledky.
Ovladač | Závod | Sledovat | Umístění | Pozice |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Dale Earnhardt, Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Lze také napsat dotaz pro zobrazení odkazu na základě průměrného dokončení.
select avg(position) as finish,
driver
from all_finishes
group by driver
order by finish;
Což ukazuje, že Dale Earnhardt je zatím v této sezóně ve vedení:
Dokončit | Ovladač |
1.5 | Dale Earnhardt, Jr. |
2.0 | Ricky Rudd |
2.5 | Buddy Baker |
Protože pohledy mohou odkazovat na jiné pohledy, lze pomocí těchto dotazů vytvořit rozsáhlejší pohledy.
create view standings_leader as
select avg(position) as finish,
driver
from all_finishes
group by driver
order by finish;
Výsledky výše uvedeného dotazu by vypadaly takto.
Dokončit | Ovladač |
1.5 | Dale Earnhardt, Jr. |
2.0 | Ricky Rudd |
2.5 | Buddy Baker |
Stejně jako:
create view race_winners as
select * from all_finishes where position = 1;
Což nám poskytuje stejné výsledky.
Ovladač | Závod | Sledovat | Umístění | Pozice |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Dale Earnhardt, Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Přidávání dat
Nejúčinnější částí zobrazení je to, že když přidáme další data, jako jsou tato dokončení závodu, kde Buddy Baker vyhraje Brickyard 400 a Michigan 400, můžeme se pouze dotazovat na naše zobrazení a získat stejné výsledky.
insert into finishes (driver, race, position) values
(1,3,1),
(2,3,3),
(3,3,2);
insert into finishes (driver, race, position) values
(1,4,1),
(2,4,2),
(3,4,3);
Nyní můžeme vidět všechna dokončení tohoto dotazu.
select * from all_finishes;\
Výsledky výše uvedeného dotazu by vypadaly takto.
Ovladač | Závod | Sledovat | Umístění | Pozice |
Buddy Baker | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 3 |
Dale Earnhardt Jr. | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 2 |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Buddy Baker | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 2 |
Dale Earnhardt Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Ricky Rudd | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 3 |
Buddy Baker | Chelna 400 | Indianapolis Motor Speedway | Speedway, IN | 1 |
Dale Earnhardt Jr. | Chelna 400 | Indianapolis Motor Speedway | Speedway, IN | 3 |
Ricky Rudd | Chelna 400 | Indianapolis Motor Speedway | Speedway, IN | 2 |
Buddy Baker | Michigan 400 | Michigan International Speedway | Brooklyn, MI | 1 |
Dale Earnhardt Jr. | Michigan 400 | Michigan International Speedway | Brooklyn, MI | 2 |
Ricky Rudd | Michigan 400 | Michigan International Speedway | Brooklyn, MI | 3 |
Můžeme také spustit:
select * from race_winners;
Což nám dává:
Ovladač | Závod | Sledovat | Umístění | Pozice |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Dale Earnhardt Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Buddy Baker | Chelna 400 | Indianapolis Motor Speedway | Speedway, IN | 1 |
Buddy Baker | Michigan 400 | Michigan International Speedway | Brooklyn, MI | 1 |
Výsledkem je také vítěz série:
select * from standings_leader;
Výsledkem je:
Dokončit | Ovladač |
2 | Buddy Baker |
2 | Dale Earnhardt, Jr. |
2 | Ricky Rudd |
Závěr
Když uložíme dotaz na náš databázový server (přesněji do databázového katalogu) a pojmenujeme jej, tento nově pojmenovaný dotaz se nazývá pohled databáze, nebo jednodušeji pohled. Zobrazení MySQL představují účinný způsob, jak uložit důležité a znovu použitelné dotazy, které nám mohou pomoci urychlit získávání důležitých informací. Protože tyto uložené pohledy mohou odkazovat na další pohledy, lze pomocí těchto podstatných dotazů vytvořit podrobnější pohledy.
Ohodnoťte nás!
Jsme hrdí na to, že jsme nejužitečnějšími lidmi v hostingu™!
Naše týmy podpory jsou plné zkušených linuxových techniků a talentovaných systémových administrátorů, kteří důvěrně znají různé technologie webhostingu, zejména ty, které jsou popsány v tomto článku.
Máte-li jakékoli dotazy týkající se těchto informací, jsme vždy k dispozici, abychom odpověděli na jakékoli dotazy týkající se problémů souvisejících s tímto článkem, 24 hodin denně, 7 dní v týdnu 365 dní v roce.
Pokud jste plně spravovaný server VPS, vyhrazený pro cloud, privátní cloud VMWare, soukromý nadřazený server, spravované cloudové servery nebo vlastníte vyhrazený server a není vám příjemné provádět kterýkoli z uvedených kroků, můžete zastihnout prostřednictvím telefonu @800.580.4985, chatu nebo lístku podpory, který vám pomůže s tímto procesem.