Was ist eine MySQL-Ansicht?
Eine MySQL-Ansicht ist einfach ein gewöhnliches Datenbankobjekt, das bei richtiger Verwendung dem Autor von SQL-Abfragen viel Zeit sparen kann. Eine Ansicht ist eine gespeicherte Abfrage, auf die ein Benutzer wie auf eine Tabelle verweisen kann. Häufig verwenden Benutzer dieselbe Basisabfrage immer wieder, um mehrere Probleme zu lösen. Ansichten sind eine Möglichkeit, diese Abfrage schnell zu speichern und später darauf zu verweisen.
Was sind die Vorteile der Verwendung von Ansichten?
Ansichten haben mehrere Vorteile. Erstens erscheinen Ansichten für den MySQL-Benutzer wie eine Tabelle. Die SELECT-Klausel kann auf eine Ansicht genauso verweisen wie auf eine Tabelle. Ein weiterer Vorteil besteht darin, dass sich die Ergebnisse der Ansicht ebenfalls ändern, wenn sich die zugrunde liegenden Tabellen ändern, auf die von einer Ansicht verwiesen wird. Ein dritter Vorteil ist, dass eine Ansicht sehr wenig Speicherplatz auf dem Server benötigt. Die SQL-Ergebnisse der Ansicht werden bei jedem Zugriff berechnet, sodass sie erst nach dem Zugriff auf dem Server gespeichert werden.
Tabellen für diese Übung
Für diesen Artikel wird eine Datenbank erstellt, die Informationen über eine fiktive Autorennsaison mit drei Fahrern, vier Strecken und einem Rennen auf jeder Strecke enthält. In dieser Datenbank gibt es vier Tabellen.
- Treiber
- Spuren
- Rennen
- Fertig
Die Struktur für die Tabellen ist wie unten beschrieben.
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)
);
Treiber
Im nächsten Schritt werden wir nun drei Fahrer und ihre Autonummern in eine Tabelle einfügen.
- Kumpel Baker 28
- Dale Earnhardt Jr. 8
- Ricky Rudd88
insert into drivers (name,car_number) values
('Buddy Baker',28),
('Dale Earnhardt Jr.',8),
('Ricky Rudd',88);
Unsere Ergebnisse zeigen nun die folgende Ausgabe.
ID | Name | Autonummer |
1 | Buddy Baker | 28 |
2 | Dale Earnhardt Jr. | 8 |
3 | Ricky Rudd | 88 |
Rennstrecken
Als Nächstes fügen wir vier Rennstrecken und ihren Standort hinzu.
- Talladega Superspeedway - Lincoln, AL
- Daytona International Speedway - Daytona Beach, Florida
- Indianapolis Motor Speedway - Rennstrecke, 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');
Unsere Ergebnisse zeigen nun die folgende Ausgabe.
ID | Name | Standort |
1 | Talladega Superspeedway | Lincoln, AL |
2 | Daytona International Speedway | Daytona Beach, FL |
3 | Indianapolis Motor Speedway | Schnellstraße, IN |
4 | Michigan International Speedway | Brooklyn, MI |
Rennen
Jetzt werden vier Rennen zusammen mit der jeweiligen Distanz eingetragen.
- Daytona 500, 2.500
- Talladega 500,1.500
- Ziegelei 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');
Unsere Ergebnisse zeigen nun die folgende Ausgabe.
ID | Name | Verfolgen | Entfernung |
1 | Talladega 500 | 2 | 500 |
2 | Daytona 500 | 1 | 500 |
3 | Brickyard 400 | 3 | 400 |
4 | Michigan 400 | 4 | 400 |
Ergebnisse
Endlich sind nun die Tabellen für den Saisonstart erstellt.
Im ersten Rennen beim Daytona 500:
- Ricky Rudd kommt als Erster ins Ziel
- Dale Earnhardt Jr. wird Zweiter
- Buddy Baker wird Dritter.
insert into finishes (driver, race, position) values
(1,1,3),
(2,1,2),
(3,1,1);
Erstellte Daten
Erste Dateneingabe
Jetzt gibt es tatsächliche Daten, die abgefragt werden können. Wenn wir eine Abfrage ausführen, um alle Fahrerergebnisse mit ihren entsprechenden Strecken und Rennen anzuzeigen, ist dies etwas kompliziert, da es mehrere Verknüpfungen gibt.
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;
Unsere Ergebnisse zeigen nun die folgende Ausgabe.
Treiber | Rennen | Verfolgen | Standort | 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 |
Zweite Dateneingabe
Wenn Daten zum zweiten Rennen, dem Talladega 500, hinzugefügt werden, könnte die Abfrage erneut geschrieben werden, genau wie die frühere Abfrage. In diesem Rennen wird Dale Earnhardt Erster und Buddy Baker Zweiter.
insert into finishes (driver, race, position) values
(1,2,2),
(2,2,1),
(3,2,3);
Die Ergebnisse der obigen Abfrage würden wie folgt aussehen.
Treiber | Rennen | Verfolgen | Standort | 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 |
Ansicht erstellen
Da es nun mehrere Rennen in der Datenbank gibt, gibt es neue Sichtweisen auf die Ergebnisse. Abfragen können für „Best Finish“ geschrieben werden “ und „Die meisten Siege .“ Diese Abfragen würden alle mit den gleichen zugrunde liegenden Daten darüber beginnen, was die Fahrer in den jeweiligen Rennpositionen beendeten. Um den Entwicklungsprozess dieser Abfragen zu vereinfachen, kann eine Ansicht mit der Klausel „Ansicht erstellen oder ersetzen als“ erstellt werden. Auf diese Klausel folgt das zu speichernde SQL. In diesem Fall wird es vor der vorherigen Abfrage hinzugefügt, die wir oben gezeigt haben.
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;
Das Ergebnis ist eine leistungsstarke Funktion von SQL. Dieses Ergebnis sieht jetzt wie eine Tabelle aus, ändert sich jedoch, wenn neue Informationen zu einer zugrunde liegenden Tabelle hinzugefügt werden. Lassen Sie uns diese Abfrage ausführen.
select * from all_finishes;
Treiber | Rennen | Verfolgen | Standort | 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 |
Die Ergebnisse sind identisch mit denen, als wir diese Abfrage das letzte Mal ausgeführt haben:
Der Unterschied besteht darin, dass die Ansicht jetzt wie eine Tabelle abgefragt werden kann. Eine Abfrage, die die Gewinner jedes Rennens anzeigt.
select * from all_finishes where position = 1;
Die Abfrage liefert diese Ergebnisse.
Treiber | Rennen | Verfolgen | Standort | Position |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Dale Earnhardt, Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Es kann auch eine Abfrage geschrieben werden, um den Leader basierend auf dem durchschnittlichen Finish anzuzeigen.
select avg(position) as finish,
driver
from all_finishes
group by driver
order by finish;
Was zeigt, dass Dale Earnhardt in dieser Saison bisher in Führung liegt:
Fertig stellen | Treiber |
1.5 | Dale Earnhardt, Jr. |
2.0 | Ricky Rudd |
2.5 | Buddy Baker |
Da Ansichten auf andere Ansichten verweisen können, können mit diesen Abfragen umfangreichere Ansichten erstellt werden.
create view standings_leader as
select avg(position) as finish,
driver
from all_finishes
group by driver
order by finish;
Die Ergebnisse der obigen Abfrage würden wie folgt aussehen.
Fertig stellen | Treiber |
1.5 | Dale Earnhardt, Jr. |
2.0 | Ricky Rudd |
2.5 | Buddy Baker |
Sowie:
create view race_winners as
select * from all_finishes where position = 1;
Was uns die gleichen Ergebnisse liefert.
Treiber | Rennen | Verfolgen | Standort | Position |
Ricky Rudd | Daytona 500 | Daytona International Speedway | Daytona Beach, FL | 1 |
Dale Earnhardt, Jr. | Talladega 500 | Talladega Superspeedway | Lincoln, AL | 1 |
Hinzufügen von Daten
Der stärkste Teil der Ansichten ist, dass wir, wenn wir weitere Daten wie diese Rennenden hinzufügen, bei denen Buddy Baker das Brickyard 400 und das Michigan 400 gewinnt, einfach unsere Ansichten abfragen können, um die gleichen Ergebnisse zu erhalten.
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);
Jetzt können wir mit dieser Abfrage alle Finishs sehen.
select * from all_finishes;\
Die Ergebnisse der obigen Abfrage würden wie folgt aussehen.
Treiber | Rennen | Verfolgen | Standort | 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 | Schnellstraße, IN | 1 |
Dale Earnhardt Jr. | Brickyard 400 | Indianapolis Motor Speedway | Schnellstraße, IN | 3 |
Ricky Rudd | Brickyard 400 | Indianapolis Motor Speedway | Schnellstraße, 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 |
Wir können auch ausführen:
select * from race_winners;
Was uns ergibt:
Treiber | Rennen | Verfolgen | Standort | 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 | Schnellstraße, IN | 1 |
Buddy Baker | Michigan 400 | Michigan International Speedway | Brooklyn, MI | 1 |
Außerdem ergibt dies den Serienmeister:
select * from standings_leader;
Was ergibt:
Fertig stellen | Treiber |
2 | Buddy Baker |
2 | Dale Earnhardt, Jr. |
2 | Ricky Rudd |
Schlussfolgerung
Wenn wir eine Abfrage in unserem Datenbankserver (genauer gesagt im Datenbankkatalog) speichern und ihr einen Namen geben, wird diese neu benannte Abfrage Datenbankansicht oder einfacher Ansicht genannt. MySQL-Ansichten sind eine leistungsstarke Möglichkeit, wichtige und wiederverwendbare Abfragen zu speichern, die uns helfen können, den Abruf wichtiger Informationen zu beschleunigen. Da diese gespeicherten Ansichten auf andere Ansichten verweisen können, können mit diesen umfangreichen Abfragen detailliertere Ansichten erstellt werden.
Bewerten Sie uns!
Wir sind stolz darauf, The Most Helpful Humans In Hosting™ zu sein!
Unsere Support-Teams bestehen aus erfahrenen Linux-Technikern und talentierten Systemadministratoren, die über fundierte Kenntnisse mehrerer Webhosting-Technologien verfügen, insbesondere der in diesem Artikel besprochenen.
Sollten Sie Fragen zu diesen Informationen haben, stehen wir Ihnen jederzeit rund um die Uhr, 7 Tage die Woche, 365 Tage im Jahr zur Verfügung, um alle Fragen zu Fragen im Zusammenhang mit diesem Artikel zu beantworten.
Wenn Sie ein vollständig verwalteter VPS-Server, dedizierter Cloud-Server, eine private VMWare-Cloud, ein privater übergeordneter Server, verwaltete Cloud-Server oder ein Eigentümer eines dedizierten Servers sind und Sie sich unwohl fühlen, einen der beschriebenen Schritte auszuführen, werden wir ist per Telefon unter 800.580.4985, per Chat oder Support-Ticket erreichbar, um Sie bei diesem Vorgang zu unterstützen.