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

Come creare e utilizzare viste MySQL

Cos'è una vista MySQL?

Una vista MySQL è semplicemente un normale oggetto di database che può far risparmiare molto tempo ai writer di query SQL se utilizzato correttamente. Una vista è una query memorizzata a cui un utente può fare riferimento proprio come una tabella. Molte volte gli utenti si ritroveranno a utilizzare la stessa query di base più e più volte per risolvere più problemi. Le visualizzazioni sono un modo per salvare rapidamente quella query e farvi riferimento in un secondo momento.

Quali sono i vantaggi dell'utilizzo delle viste?

Le visualizzazioni hanno diversi vantaggi. Innanzitutto, le viste appaiono all'utente MySQL proprio come una tabella. La clausola SELECT può fare riferimento a una vista esattamente come farebbe con una tabella. Un altro vantaggio è che quando cambiano le tabelle sottostanti a cui fa riferimento una vista, cambiano anche i risultati della vista. Un terzo vantaggio è che una vista occupa pochissimo spazio sul server. I risultati SQL della vista vengono calcolati ogni volta che vi si accede, quindi non vengono archiviati sul server fino a quando non vi si accede.

Tabelle per questo esercizio

Per questo articolo, verrà creato un database contenente informazioni su una stagione di corse automobilistiche immaginarie con tre piloti, quattro piste e una gara su ciascuna pista. In questo database sono presenti quattro tabelle.

  • Driver
  • Tracce
  • Gare
  • Finiture    

La struttura delle tabelle è quella descritta di seguito.

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

Autisti

Ora, nel passaggio successivo, inseriremo tre conducenti e i loro numeri di auto in una tabella.

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

I nostri risultati ora mostreranno il seguente output.

ID Nome Numero auto
1 Buddy Baker 28
2 Dale Earnhardt Jr. 8
3 Ricky Rudd 88

Ippodromi

Successivamente, aggiungiamo quattro circuiti e la loro posizione.

  • Talladega Superspeedway - Lincoln, AL
  • Autodromo internazionale di Daytona - Daytona Beach, FL
  • Autodromo di Indianapolis - 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');

I nostri risultati ora mostreranno il seguente output.

ID Nome Posizione
1 Talladega Superspeedway Lincoln, AL
2 Autodromo internazionale di Daytona Daytona Beach, FL
3 Autodromo di Indianapolis Autostrada, IN
4 Michigan International Speedway Brooklyn, MI

Gare

Ora vengono inserite quattro gare, insieme alla distanza per ciascuna.

  • Daytona 500 .2.500
  • Talladega 500.1.500
  • Mattoni 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');

I nostri risultati ora mostreranno il seguente output.

ID Nome Traccia Distanza
1 Talladega 500 2 500
2 Daytona 500 1 500
3 Brickyard 400 3 400
4 Michigan 400 4 400

Risultati

Finalmente vengono create le tabelle per l'inizio della stagione.

Nella prima gara alla Daytona 500:

  • Ricky Rudd arriva primo
  • Dale Earnhardt Jr è secondo 
  • Buddy Baker finisce terzo.
insert into finishes (driver, race, position) values
  (1,1,3),
  (2,1,2),
  (3,1,1);

Dati compilati

Primo inserimento dati

Ora ci sono dati effettivi da interrogare. Se eseguiamo una query per guardare tutti i risultati dei piloti con le loro piste e gare corrispondenti, è un po' complicato in quanto ci sono diversi join.

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;

I nostri risultati ora mostrano il seguente output.

Driver Gara Traccia Posizione Posizione
Buddy Baker Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 3
Dale Earnhardt Jr. Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 2
Ricky Rudd Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 1

Secondo input di dati

Quando i dati della seconda gara, il Talladega 500, vengono aggiunti, la query potrebbe essere scritta di nuovo, come la query precedente. In questa gara, Dale Earnhardt arriva primo e Buddy Baker arriva secondo.

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

I risultati della query precedente sarebbero simili a questo.

Driver Gara Traccia Posizione Posizione
Buddy Baker Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 3
Dale Earnhardt Jr. Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 2
Ricky Rudd Daytona 500 Autodromo internazionale di Daytona 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

Crea vista

Ora che ci sono più gare nel database, ci sono nuovi modi di guardare i risultati. Le query possono essere scritte per "Miglior risultato ” e “La maggior parte delle vittorie .” Queste query inizierebbero tutte con gli stessi dati sottostanti di ciò che i piloti hanno terminato in ogni posizione di gara. Per semplificare il processo di sviluppo di queste query, è possibile creare una vista con la clausola "crea o sostituisci vista come". Questa clausola è seguita dall'SQL da salvare. In questo caso, viene aggiunto prima della query precedente che abbiamo mostrato sopra.

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;

Il risultato è una potente funzionalità di SQL. Questo risultato è ora qualcosa che assomiglia a una tabella ma cambierà quando vengono aggiunte nuove informazioni a qualsiasi tabella sottostante. Eseguiamo questa query.

select * from all_finishes;
Driver Gara Traccia Posizione Posizione
Buddy Baker Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 3
Dale Earnhardt Jr. Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 2
Ricky Rudd Daytona 500 Autodromo internazionale di Daytona 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

I risultati sono identici all'ultima volta che abbiamo eseguito questa query:

La differenza è che ora la vista può essere interrogata come una tabella. Una query che mostra i vincitori di ogni gara.

select * from all_finishes where position = 1;

La query fornisce questi risultati.

Driver Gara Traccia Posizione Posizione
Ricky Rudd Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

È anche possibile scrivere una query per visualizzare la direttrice in base alla finitura media.

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

Il che mostra Dale Earnhardt in testa finora per la stagione:

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

Poiché le viste possono fare riferimento ad altre viste, è possibile creare viste più estese con queste query.

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

I risultati della query precedente sarebbero simili a questo.

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

Oltre a:

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

Il che ci fornisce gli stessi risultati.

Driver Gara Traccia Posizione Posizione
Ricky Rudd Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

Aggiunta di dati

La parte più potente delle visualizzazioni è che quando aggiungiamo più dati come questi arrivi di gara in cui Buddy Baker vince il Brickyard 400 e il Michigan 400, possiamo semplicemente interrogare le nostre visualizzazioni per ottenere gli stessi risultati.

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

Ora possiamo vedere tutte le finiture con questa query.

select * from all_finishes;\

I risultati della query precedente sarebbero simili a questo.

Driver Gara Traccia Posizione Posizione
Buddy Baker Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 3
Dale Earnhardt Jr. Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 2
Ricky Rudd Daytona 500 Autodromo internazionale di Daytona 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 Autodromo di Indianapolis Autostrada, IN 1
Dale Earnhardt Jr. Brickyard 400 Autodromo di Indianapolis Autostrada, IN 3
Ricky Rudd Brickyard 400 Autodromo di Indianapolis Autostrada, 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

Possiamo anche eseguire:

select * from race_winners;

Che ci dà:

Driver Gara Traccia Posizione Posizione
Ricky Rudd Daytona 500 Autodromo internazionale di Daytona Daytona Beach, FL 1
Dale Earnhardt Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1
Buddy Baker Brickyard 400 Autodromo di Indianapolis Autostrada, IN 1
Buddy Baker Michigan 400 Michigan International Speedway Brooklyn, MI 1

Inoltre, questo si traduce nel campione della serie:

select * from standings_leader;

Che si traduce in:

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

Conclusione

Quando salviamo una query nel nostro server di database (più specificamente nel catalogo del database) e le assegniamo un nome, questa nuova query viene chiamata vista del database o, più semplicemente, vista. Le visualizzazioni MySQL sono un modo efficace per salvare query vitali e riutilizzabili che possono aiutarci a velocizzare il recupero di informazioni importanti. Poiché queste viste di salvataggio possono fare riferimento ad altre viste, è possibile creare viste più dettagliate con queste query sostanziali.

Votaci!

Siamo orgogliosi di essere gli esseri umani più utili nell'hosting™!

I nostri team di supporto sono pieni di tecnici Linux esperti e amministratori di sistema di talento che hanno una conoscenza approfondita di più tecnologie di hosting Web, in particolare quelle discusse in questo articolo.

In caso di domande relative a queste informazioni, siamo sempre disponibili a rispondere a qualsiasi domanda con problemi relativi a questo articolo, 24 ore al giorno, 7 giorni alla settimana 365 giorni all'anno.

Se sei un server VPS completamente gestito, dedicato al cloud, cloud privato VMWare, server padre privato, server cloud gestiti o proprietario di un server dedicato e ti senti a disagio nell'esecuzione di uno qualsiasi dei passaggi descritti, noi può essere raggiunto tramite telefono @800.580.4985, una chat o un ticket di supporto per assisterti in questo processo.