sql >> Databasteknik >  >> RDS >> Mysql

Hur man skapar och använder MySQL Views

Vad är en MySQL-vy?

En MySQL-vy är helt enkelt ett vanligt databasobjekt som kan spara mycket tid för SQL-frågeskrivare när de används på rätt sätt. En vy är en lagrad fråga som en användare kan referera till precis som en tabell. Många gånger kommer användare att finna att de använder samma basfråga om och om igen för att lösa flera problem. Vyer är ett sätt att snabbt spara den frågan och hänvisa till den senare.

Vilka är fördelarna med att använda vyer?

Utsikter har flera fördelar. Först visas vyer för MySQL-användaren precis som en tabell. SELECT-satsen kan referera till en vy precis som en tabell. En annan fördel är att när de underliggande tabellerna som hänvisas till av en vy ändras, ändras även vyns resultat. En tredje fördel är att en vy tar väldigt lite plats på servern. Vyns SQL-resultat beräknas varje gång den öppnas, så de lagras inte på servern förrän de nås.

Tabell för denna övning

För den här artikeln kommer en databas att skapas med information om en fiktiv biltävlingssäsong med tre förare, fyra banor och ett lopp på varje bana. I denna databas finns det fyra tabeller.

  • Drivrutiner
  • Spår
  • Lopp
  • Avslutar    

Strukturen för tabellerna är som beskrivs nedan.

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)
);

Drivrutiner

Nu, i vårt nästa steg, kommer vi att infoga tre förare och deras bilnummer i en tabell.

  • 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);

Våra resultat kommer nu att visa följande utdata.

ID Namn Bilnummer
1 Buddy Baker 28
2 Dale Earnhardt Jr. 8
3 Ricky Rudd 88

kapplöpningsbanor

Därefter lägger vi till fyra racerbanor och deras plats.

  • 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');

Våra resultat kommer nu att visa följande utdata.

ID Namn Plats
1 Talladega Superspeedway Lincoln, AL
2 Daytona International Speedway Daytona Beach, FL
3 Indianapolis Motor Speedway Speedway, IN
4 Michigan International Speedway Brooklyn, MI

Lopp

Nu är fyra lopp, tillsammans med distansen för varje, anmälda.

  • Daytona 500 ,2 500
  • Talladega 500,1 500
  • Brickyard 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');

Våra resultat kommer nu att visa följande utdata.

ID Namn Spåra Avstånd
1 Talladega 500 2 500
2 Daytona 500 1 500
3 Brickyard 400 3 400
4 Michigan 400 4 400

Resultat

Äntligen är nu tabellerna för början av säsongen skapade.

I det första racet på Daytona 500:

  • Ricky Rudd slutar först
  • Dale Earnhardt Jr slutar tvåa 
  • Buddy Baker slutar trea.
insert into finishes (driver, race, position) values
  (1,1,3),
  (2,1,2),
  (3,1,1);

Kompilerad data

Första datainmatning

Nu finns det faktiska data att fråga. Om vi ​​kör en fråga för att titta på alla förarresultat med deras motsvarande banor och lopp är det lite komplicerat eftersom det finns flera sammanfogningar.

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åra resultat visar nu följande utdata.

Drivrutin Lopp Spåra Plats Position
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

Andra datainmatning

När det andra racet, Talladega 500, data läggs till, kan frågan skrivas igen, på samma sätt som den tidigare frågan. I det här loppet kommer Dale Earnhardt på första plats och Buddy Baker på andra plats.

insert into finishes (driver, race, position) values
  (1,2,2),
  (2,2,1),
  (3,2,3);

Resultaten av ovanstående fråga skulle se ut så här.

Drivrutin Lopp Spåra Plats Position
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

Skapa vy

Nu när det finns flera lopp i databasen finns det nya sätt att se på resultaten. Frågor kan skrivas för "Bästa finish " och "Flest vinster .” Dessa frågor skulle alla börja med samma underliggande data om vilka förare som slutade i varje races position. För att förenkla processen för att utveckla dessa frågor kan en vy skapas med "skapa eller ersätt vy som" en klausul. Denna sats följs av den SQL som ska sparas. I det här fallet läggs den till före den föregående frågan som vi visade ovan.

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;

Resultatet är en kraftfull funktion i SQL. Detta resultat är nu något som ser ut som en tabell men kommer att ändras när ny information läggs till i någon underliggande tabell. Låt oss köra den här frågan.

select * from all_finishes;
Drivrutin Lopp Spåra Plats Position
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

Resultaten är identiska med förra gången vi körde den här frågan:

Skillnaden är att nu kan vyn efterfrågas som en tabell. En fråga som visar vinnarna av varje lopp.

select * from all_finishes where position = 1;

Frågan ger dessa resultat.

Drivrutin Lopp Spåra Plats Position
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

En fråga kan också skrivas för att visa ledaren baserat på genomsnittlig finish.

select avg(position) as finish,
  driver
from all_finishes
  group by driver
     order by finish;

Vilket visar Dale Earnhardt i ledningen hittills för säsongen:

Slutför Drivrutin
1.5 Dale Earnhardt, Jr.
2.0 Ricky Rudd
2.5 Buddy Baker

Eftersom vyer kan referera till andra vyer kan mer omfattande vyer skapas med dessa frågor.

create view standings_leader as
select avg(position) as finish,
  driver
from all_finishes
  group by driver
     order by finish;

Resultaten av ovanstående fråga skulle se ut så här.

Slutför Drivrutin
1.5 Dale Earnhardt, Jr.
2.0 Ricky Rudd
2.5 Buddy Baker

Samt:

create view race_winners as
select * from all_finishes where position = 1;

Vilket ger oss samma resultat.

Drivrutin Lopp Spåra Plats Position
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

Lägga till data

Den mest potenta delen av åsikter är att när vi lägger till mer data som dessa tävlingsavslutningar där Buddy Baker vinner Brickyard 400 och Michigan 400, kan vi bara fråga våra åsikter för att få samma resultat.

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);

Nu kan vi se alla avslut med denna fråga.

select * from all_finishes;\

Resultaten av ovanstående fråga skulle se ut så här.

Drivrutin Lopp Spåra Plats Position
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 Brickyard 400 Indianapolis Motor Speedway Speedway, IN 1
Dale Earnhardt Jr. Brickyard 400 Indianapolis Motor Speedway Speedway, IN 3
Ricky Rudd Brickyard 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

Vi kan också köra:

select * from race_winners;

Vilket ger oss:

Drivrutin Lopp Spåra Plats Position
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, FL 1
Dale Earnhardt Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1
Buddy Baker Brickyard 400 Indianapolis Motor Speedway Speedway, IN 1
Buddy Baker Michigan 400 Michigan International Speedway Brooklyn, MI 1

Detta resulterar också i seriemästaren:

select * from standings_leader;

Vilket resulterar i:

Slutför Drivrutin
2 Buddy Baker
2 Dale Earnhardt, Jr.
2 Ricky Rudd

Slutsats

När vi sparar en fråga i vår databasserver (närmare bestämt i databaskatalogen) och ger den ett namn, kallas denna ny namngivna fråga en databasvy, eller, enklare, en vy. MySQL Views är ett kraftfullt sätt att spara viktiga och återanvändbara frågor som kan hjälpa oss att påskynda hämtningen av viktig information. Eftersom dessa sparade vyer kan referera till andra vyer, kan mer detaljerade vyer skapas med dessa omfattande frågor.

Betygsätt oss!

Vi är stolta över att vara de mest hjälpsamma människorna inom Hosting™!

Våra supportteam är fyllda med erfarna Linux-tekniker och duktiga systemadministratörer som har ingående kunskap om flera webbhotelltekniker, särskilt de som diskuteras i den här artikeln.

Om du har några frågor angående denna information, är vi alltid tillgängliga för att svara på alla frågor som rör denna artikel, 24 timmar om dygnet, 7 dagar i veckan 365 dagar om året.

Om du är en helt hanterad VPS-server, Cloud Dedicated, VMWare Private Cloud, Private Parent Server, Managed Cloud Servers eller en dedikerad serverägare och du är obekväm med att utföra något av stegen som beskrivs, vi kan nås via telefon @800.580.4985, en chatt eller supportbiljett för att hjälpa dig med denna process.


  1. ScaleGrid nu tillgängligt i Sydney AWS-regionen

  2. MariaDB JSON_VALID() Förklarad

  3. 3 sätt att formatera ett tal som en procentandel i PostgreSQL

  4. Byt namn på en kolumn i SQL Server (T-SQL)