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

Jak vytvářet a používat pohledy MySQL

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.


  1. Jak připojit PHP k MySQL

  2. node.js + sdružování připojení mysql

  3. rozdělení alfa a čísel pomocí sql

  4. Oracle.DataAccess.dll nelze najít, ačkoli existuje