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.