Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So erstellen und verwenden Sie MySQL-Ansichten

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.