sql >> Database teknologi >  >> RDS >> Mysql

Sådan opretter og bruger du MySQL-visninger

Hvad er en MySQL-visning?

En MySQL-visning er simpelthen et almindeligt databaseobjekt, der kan spare SQL-forespørgselsskrivere for meget tid, når det bruges korrekt. En visning er en lagret forespørgsel, som en bruger kan henvise til ligesom en tabel. Mange gange vil brugere finde på at bruge den samme basisforespørgsel igen og igen for at løse flere problemer. Visninger er en måde hurtigt at gemme den forespørgsel og henvise til den senere.

Hvad er fordelene ved at bruge visninger?

Udsigt har flere fordele. For det første vises visninger for MySQL-brugeren ligesom en tabel. SELECT-sætningen kan referere til en visning nøjagtigt ligesom en tabel. En anden fordel er, at når de underliggende tabeller, der refereres til af en visning, ændres, ændres visningens resultater også. En tredje fordel er, at en visning fylder meget lidt på serveren. Visningens SQL-resultater beregnes, hver gang den tilgås, så de gemmes ikke på serveren, før de er tilgået.

Tabeller til denne øvelse

Til denne artikel vil der blive oprettet en database med information om en fiktiv bilvæddeløbssæson med tre kørere, fire baner og et løb på hver bane. I denne database er der fire tabeller.

  • Drivere
  • Numre
  • Løb
  • Afslutter    

Strukturen for tabellerne er som skitseret nedenfor.

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

Drivere

Nu, i vores næste trin, vil vi indsætte tre chauffører og deres bilnumre i en tabel.

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

Vores resultater vil nu vise følgende output.

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

Væddeløbsbaner

Dernæst tilføjer vi fire racerbaner og deres placering.

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

Vores resultater vil nu vise følgende output.

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

Løb

Nu er fire løb, sammen med distancen for hver, tilmeldt.

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

Vores resultater vil nu vise følgende output.

ID Navn Spor Afstand
1 Talladega 500 2 500
2 Daytona 500 1 500
3 Brickyard 400 3 400
4 Michigan 400 4 400

Resultater

Endelig er tabellerne for sæsonstart nu lavet.

I det første løb på Daytona 500:

  • Ricky Rudd slutter først
  • Dale Earnhardt Jr. slutter på andenpladsen 
  • Buddy Baker slutter på tredjepladsen.
insert into finishes (driver, race, position) values
  (1,1,3),
  (2,1,2),
  (3,1,1);

Kompilerede data

Første datainput

Nu er der faktiske data at forespørge på. Hvis vi kører en forespørgsel for at se på alle kørerresultater med deres tilsvarende spor og løb, er det lidt kompliceret, da der er flere joinforbindelser.

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;

Vores resultater viser nu følgende output.

Driver Løb Spor Placering 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

Anden datainput

Da den anden race, Talladega 500, tilføjes data, kan forespørgslen skrives igen, det samme som den tidligere forespørgsel. I dette løb kommer Dale Earnhardt på førstepladsen, og Buddy Baker på andenpladsen.

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

Resultaterne af ovenstående forespørgsel ville se sådan ud.

Driver Løb Spor Placering 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

Opret visning

Nu hvor der er flere løb i databasen, er der nye måder at se resultaterne på. Forespørgsler kan skrives til "Bedste finish ” og “Flest sejre ." Disse forespørgsler ville alle begynde med de samme underliggende data om, hvilke kørere der sluttede i hvert løbs position. For at forenkle processen med at udvikle disse forespørgsler kan en visning oprettes med "opret eller erstat visning som" en klausul. Denne klausul efterfølges af den SQL, der skal gemmes. I dette tilfælde tilføjes det før den forrige forespørgsel, som vi viste ovenfor.

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 er en kraftfuld funktion i SQL. Dette resultat er nu noget, der ligner en tabel, men som vil ændre sig, når ny information tilføjes til en underliggende tabel. Lad os køre denne forespørgsel.

select * from all_finishes;
Driver Løb Spor Placering 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

Resultaterne er identiske med sidste gang, vi kørte denne forespørgsel:

Forskellen er, at nu kan visningen forespørges som en tabel. En forespørgsel, der viser vinderne af hvert løb.

select * from all_finishes where position = 1;

Forespørgslen giver disse resultater.

Driver Løb Spor Placering Position
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

En forespørgsel kan også skrives for at vise lederen baseret på gennemsnitlig finish.

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

Hvilket viser Dale Earnhardt i føringen indtil videre for sæsonen:

Afslut Driver
1.5 Dale Earnhardt, Jr.
2.0 Ricky Rudd
2.5 Buddy Baker

Fordi visninger kan referere til andre visninger, kan der oprettes mere omfattende visninger med disse forespørgsler.

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

Resultaterne af ovenstående forespørgsel ville se sådan ud.

Afslut Driver
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;

Hvilket giver os de samme resultater.

Driver Løb Spor Placering Position
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

Tilføjelse af data

Den mest potente del af visninger er, at når vi tilføjer flere data som disse løbsafslutninger, hvor Buddy Baker vinder Brickyard 400 og Michigan 400, kan vi bare spørge vores synspunkter for at få de samme resultater.

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 alle færdigheder med denne forespørgsel.

select * from all_finishes;\

Resultaterne af ovenstående forespørgsel ville se sådan ud.

Driver Løb Spor Placering 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 også køre:

select * from race_winners;

Hvilket giver os:

Driver Løb Spor Placering 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

Dette resulterer også i seriemesteren:

select * from standings_leader;

Hvilket resulterer i:

Afslut Driver
2 Buddy Baker
2 Dale Earnhardt, Jr.
2 Ricky Rudd

Konklusion

Når vi gemmer en forespørgsel i vores databaseserver (mere specifikt i databasekataloget) og giver den et navn, kaldes denne nye navngivne forespørgsel en databasevisning, eller mere enkelt en visning. MySQL Views er en effektiv måde at gemme vitale og genbrugelige forespørgsler, som kan hjælpe os med at fremskynde genfindingen af ​​vigtig information. Fordi disse gemte visninger kan referere til andre visninger, kan der oprettes mere detaljerede visninger med disse omfattende forespørgsler.

Vurder os!

Vi er stolte af at være de mest hjælpsomme mennesker inden for Hosting™!

Vores supportteams er fyldt med erfarne Linux-teknikere og talentfulde systemadministratorer, som har indgående kendskab til flere webhostingteknologier, især dem, der er diskuteret i denne artikel.

Skulle du have spørgsmål vedrørende denne information, er vi altid til rådighed til at besvare eventuelle spørgsmål vedrørende denne artikel, 24 timer i døgnet, 7 dage om ugen 365 dage om året.

Hvis du er en fuldt administreret VPS-server, Cloud Dedicated, VMWare Private Cloud, Private Parent-server, Managed Cloud-servere eller en dedikeret serverejer, og du er utilpas med at udføre nogen af ​​de skitserede trin, vi kan kontaktes via telefon @800.580.4985, en chat- eller supportbillet for at hjælpe dig med denne proces.


  1. Hvordan bruger man ANY i stedet for IN i en WHERE-klausul med Rails?

  2. MySQL-OPDATERING:Top 5 tips til T-SQL-udviklere

  3. MySQL VARCHAR-længder og UTF-8

  4. Hvordan spooler jeg til en CSV-formateret fil ved hjælp af SQLPLUS?