sql >> Database >  >> RDS >> Mysql

MySQL-weergaven maken en gebruiken

Wat is een MySQL-weergave?

Een MySQL-view is gewoon een gewoon databaseobject dat bij correct gebruik de schrijvers van SQL-query's veel tijd kan besparen. Een weergave is een opgeslagen query waarnaar een gebruiker kan verwijzen, net als een tabel. Vaak zullen gebruikers dezelfde basisquery steeds opnieuw gebruiken om meerdere problemen op te lossen. Weergaven zijn een manier om die zoekopdracht snel op te slaan en er later naar te verwijzen.

Wat zijn de voordelen van het gebruik van weergaven?

Uitzichten hebben verschillende voordelen. Ten eerste verschijnen weergaven voor de MySQL-gebruiker net als een tabel. De SELECT-component kan op dezelfde manier verwijzen naar een weergave als naar een tabel. Een ander voordeel is dat wanneer de onderliggende tabellen waarnaar wordt verwezen door een weergave veranderen, de resultaten van de weergave ook veranderen. Een derde voordeel is dat een view zeer weinig ruimte inneemt op de server. De SQL-resultaten van de weergave worden elke keer dat deze wordt geopend berekend, dus ze worden pas op de server opgeslagen als ze worden geopend.

Tabellen voor deze oefening

Voor dit artikel wordt een database gemaakt met informatie over een fictief autoraceseizoen met drie coureurs, vier circuits en één race op elk circuit. In deze database zijn er vier tabellen.

  • Stuurprogramma's
  • Tracks
  • Rassen
  • Eindigt    

De structuur voor de tabellen is zoals hieronder beschreven.

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

Stuurprogramma's

Nu, in onze volgende stap, zullen we drie chauffeurs en hun bedrijfsnummers in een tabel invoegen.

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

Onze resultaten laten nu de volgende uitvoer zien.

ID Naam Autonummer
1 Buddy Baker 28
2 Dale Earnhardt Jr. 8
3 Ricky Rudd 88

Racebanen

Vervolgens voegen we vier circuits en hun locatie toe.

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

Onze resultaten laten nu de volgende uitvoer zien.

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

Rassen

Nu zijn er vier races, samen met de afstand voor elk, ingeschreven.

  • Daytona 500, 2500
  • Talladega 500,1500
  • 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');

Onze resultaten laten nu de volgende uitvoer zien.

ID Naam Track Afstand
1 Talladega 500 2 500
2 Daytona 500 1 500
3 Brickyard 400 3 400
4 Michigan 400 4 400

Resultaten

Eindelijk zijn nu de tabellen voor het begin van het seizoen gemaakt.

In de eerste race op de Daytona 500:

  • Ricky Rudd eindigt als eerste
  • Dale Earnhardt Jr eindigt als tweede 
  • Buddy Baker wordt derde.
insert into finishes (driver, race, position) values
  (1,1,3),
  (2,1,2),
  (3,1,1);

Gecompileerde gegevens

Eerste gegevensinvoer

Nu zijn er feitelijke gegevens om op te vragen. Als we een query uitvoeren om alle coureursresultaten te bekijken met de bijbehorende circuits en races, is het een beetje ingewikkeld omdat er meerdere joins zijn.

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;

Onze resultaten laten nu de volgende output zien.

Stuurprogramma Race Track Locatie Positie
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

Tweede gegevensinvoer

Als de tweede race, de Talladega 500, gegevens worden toegevoegd, kan de query opnieuw worden geschreven, hetzelfde als de eerdere query. In deze race wordt Dale Earnhardt eerste en Buddy Baker tweede.

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

De resultaten van de bovenstaande zoekopdracht zien er als volgt uit.

Stuurprogramma Race Track Locatie Positie
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

Weergave maken

Nu er meerdere races in de database staan, zijn er nieuwe manieren om naar de resultaten te kijken. Query's kunnen worden geschreven voor "Beste afwerking ” en “Meeste overwinningen .” Deze zoekopdrachten zouden allemaal beginnen met dezelfde onderliggende gegevens van wat coureurs op de positie van elke race hebben geëindigd. Om het proces van het ontwikkelen van deze query's te vereenvoudigen, kan een weergave worden gemaakt met de clausule "weergave maken of vervangen als". Deze clausule wordt gevolgd door de SQL die moet worden opgeslagen. In dit geval wordt het toegevoegd vóór de vorige zoekopdracht die we hierboven lieten zien.

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;

Het resultaat is een krachtige functie van SQL. Dit resultaat is nu iets dat eruitziet als een tabel, maar zal veranderen wanneer nieuwe informatie wordt toegevoegd aan een onderliggende tabel. Laten we deze zoekopdracht uitvoeren.

select * from all_finishes;
Stuurprogramma Race Track Locatie Positie
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

De resultaten zijn identiek aan de laatste keer dat we deze zoekopdracht uitvoerden:

Het verschil is dat de weergave nu als een tabel kan worden opgevraagd. Een zoekopdracht die de winnaars van elke race laat zien.

select * from all_finishes where position = 1;

De zoekopdracht levert deze resultaten op.

Stuurprogramma Race Track Locatie Positie
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

Er kan ook een query worden geschreven om de leider weer te geven op basis van het gemiddelde resultaat.

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

Wat laat zien dat Dale Earnhardt tot nu toe aan de leiding staat voor het seizoen:

Voltooien Stuurprogramma
1,5 Dale Earnhardt, Jr.
2.0 Ricky Rudd
2,5 Buddy Baker

Omdat weergaven kunnen verwijzen naar andere weergaven, kunnen met deze zoekopdrachten uitgebreidere weergaven worden gemaakt.

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

De resultaten van de bovenstaande zoekopdracht zien er als volgt uit.

Voltooien Stuurprogramma
1,5 Dale Earnhardt, Jr.
2.0 Ricky Rudd
2,5 Buddy Baker

Evenals:

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

Wat ons dezelfde resultaten oplevert.

Stuurprogramma Race Track Locatie Positie
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

Gegevens toevoegen

Het meest krachtige deel van de weergaven is dat wanneer we meer gegevens toevoegen, zoals deze race-afwerkingen waarbij Buddy Baker de Brickyard 400 en de Michigan 400 wint, we gewoon onze opvattingen kunnen opvragen om dezelfde resultaten te krijgen.

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 kunnen we alle afwerkingen met deze zoekopdracht zien.

select * from all_finishes;\

De resultaten van de bovenstaande zoekopdracht zien er als volgt uit.

Stuurprogramma Race Track Locatie Positie
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

We kunnen ook uitvoeren:

select * from race_winners;

Dat geeft ons:

Stuurprogramma Race Track Locatie Positie
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

Dit resulteert ook in de seriekampioen:

select * from standings_leader;

Wat resulteert in:

Voltooien Stuurprogramma
2 Buddy Baker
2 Dale Earnhardt, Jr.
2 Ricky Rudd

Conclusie

Wanneer we een zoekopdracht opslaan in onze databaseserver (meer specifiek in de databasecatalogus) en deze een naam geven, wordt deze nieuw benoemde zoekopdracht een databaseweergave genoemd, of, eenvoudiger, een weergave. MySQL-weergaven zijn een krachtige manier om vitale en herbruikbare zoekopdrachten op te slaan die ons kunnen helpen het ophalen van belangrijke informatie te versnellen. Omdat deze opgeslagen weergaven kunnen verwijzen naar andere weergaven, kunnen met deze substantiële zoekopdrachten meer gedetailleerde weergaven worden gemaakt.

Beoordeel ons!

We zijn er trots op de meest behulpzame mensen in Hosting™ te zijn!

Onze ondersteuningsteams zijn gevuld met ervaren Linux-technici en getalenteerde systeembeheerders die een grondige kennis hebben van meerdere webhostingtechnologieën, vooral de technologieën die in dit artikel worden besproken.

Mocht u vragen hebben over deze informatie, dan zijn wij altijd beschikbaar om al uw vragen met betrekking tot dit artikel te beantwoorden, 24 uur per dag, 7 dagen per week 365 dagen per jaar.

Als u een volledig beheerde VPS-server, Cloud Dedicated, VMWare Private Cloud, Private Parent-server, Managed Cloud Servers of een Dedicated server-eigenaar bent en u zich niet op uw gemak voelt bij het uitvoeren van een van de beschreven stappen, is bereikbaar via telefoon @800.580.4985, een chat- of supportticket om u bij dit proces te helpen.


  1. Verschil tussen tijdstempels in milliseconden in Oracle

  2. Top PostgreSQL-beveiligingsbedreigingen

  3. 6 manieren om te controleren of een tabel bestaat in SQL Server (T-SQL-voorbeelden)

  4. Arabisch opslaan in SQL-database