Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak tworzyć i używać widoków MySQL

Co to jest widok MySQL?

Widok MySQL to po prostu zwykły obiekt bazy danych, który, jeśli jest używany poprawnie, może zaoszczędzić wiele czasu autorom zapytań SQL. Widok to przechowywane zapytanie, do którego użytkownik może odwoływać się tak samo jak do tabeli. Wiele razy użytkownicy będą musieli w kółko korzystać z tego samego zapytania podstawowego, aby rozwiązać wiele problemów. Widoki to sposób na szybkie zapisanie tego zapytania i późniejsze odwoływanie się do niego.

Jakie są zalety korzystania z widoków?

Widoki mają kilka zalet. Po pierwsze, widoki są widoczne dla użytkownika MySQL jak tabela. Klauzula SELECT może odwoływać się do widoku dokładnie tak, jak do tabeli. Kolejną zaletą jest to, że gdy zmieniają się tabele bazowe, do których odwołuje się widok, zmieniają się również wyniki widoku. Trzecią zaletą jest to, że widok zajmuje bardzo mało miejsca na serwerze. Wyniki SQL widoku są obliczane przy każdym dostępie, więc nie są przechowywane na serwerze, dopóki nie zostaną udostępnione.

Tabele do tego ćwiczenia

W tym artykule zostanie utworzona baza danych zawierająca informacje o fikcyjnym sezonie wyścigów samochodowych z trzema kierowcami, czterema trasami i jednym wyścigiem na każdym torze. W tej bazie danych znajdują się cztery tabele.

  • Kierowcy
  • Utwory
  • Wyścigi
  • Wykończenia    

Struktura tabel została przedstawiona poniżej.

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

Sterowniki

Teraz, w naszym następnym kroku, wstawimy trzech kierowców i ich numery samochodów do tabeli.

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

Nasze wyniki pokażą teraz następujące dane wyjściowe.

Identyfikator Nazwa Numer samochodu
1 Buddy Baker 28
2 Dale Earnhardt Jr. 8
3 Ricky Rudd 88

Tory wyścigowe

Następnie dodajemy cztery tory wyścigowe i ich lokalizację.

  • Talladega Superspeedway – Lincoln, AL
  • Daytona International Speedway – Daytona Beach, Floryda
  • 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');

Nasze wyniki pokażą teraz następujące dane wyjściowe.

Identyfikator Nazwa Lokalizacja
1 Talladega Superspeedway Lincoln, AL
2 Daytona International Speedway Daytona Beach, Floryda
3 Indianapolis Motor Speedway Speedway, IN
4 Michigan International Speedway Brooklyn, MI

Wyścigi

Teraz wprowadzane są cztery wyścigi wraz z dystansem dla każdego.

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

Nasze wyniki pokażą teraz następujące dane wyjściowe.

Identyfikator Nazwa Śledź Odległość
1 Talladega 500 2 500
2 Daytona 500 1 500
3 Cegła 400 3 400
4 Michigan 400 4 400

Wyniki

Wreszcie utworzono tabele na początek sezonu.

W pierwszym wyścigu w Daytona 500:

  • Ricky Rudd kończy jako pierwszy
  • Dale Earnhardt Jr zajmuje drugie miejsce
  • Buddy Baker zajmuje trzecie miejsce.
insert into finishes (driver, race, position) values
  (1,1,3),
  (2,1,2),
  (3,1,1);

Skompilowane dane

Pierwsze wprowadzanie danych

Teraz są aktualne dane do zapytania. Jeśli uruchomimy zapytanie, aby przejrzeć wszystkie wyniki kierowców wraz z odpowiadającymi im trasami i wyścigami, jest to nieco skomplikowane, ponieważ istnieje kilka złączeń.

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;

Nasze wyniki pokazują teraz następujące dane wyjściowe.

Sterownik Wyścig Śledź Lokalizacja Pozycja
Buddy Baker Daytona 500 Daytona International Speedway Daytona Beach, Floryda 3
Dale Earnhardt Jr. Daytona 500 Daytona International Speedway Daytona Beach, Floryda 2
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, Floryda 1

Drugie wprowadzanie danych

Po dodaniu danych drugiego wyścigu, Talladega 500, zapytanie może zostać napisane ponownie, tak samo jak poprzednie. W tym wyścigu Dale Earnhardt jest na pierwszym miejscu, a Buddy Baker na drugim.

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

Wyniki powyższego zapytania będą wyglądać tak.

Sterownik Wyścig Śledź Lokalizacja Pozycja
Buddy Baker Daytona 500 Daytona International Speedway Daytona Beach, Floryda 3
Dale Earnhardt Jr. Daytona 500 Daytona International Speedway Daytona Beach, Floryda 2
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, Floryda 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

Utwórz widok

Teraz, gdy w bazie danych jest wiele wyścigów, pojawiły się nowe sposoby patrzenia na wyniki. Zapytania można pisać dla „Najlepsze zakończenie ” i „Najwięcej wygranych ”. Wszystkie te zapytania zaczynałyby się od tych samych podstawowych danych dotyczących tego, co kierowcy ukończyli na pozycji każdego wyścigu. Aby uprościć proces tworzenia tych zapytań, widok można utworzyć z klauzulą ​​„utwórz lub zamień widok jako”. Po tej klauzuli następuje kod SQL, który ma zostać zapisany. W tym przypadku jest on dodawany przed poprzednim zapytaniem, które pokazaliśmy powyżej.

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;

Rezultatem jest potężna funkcja SQL. Ten wynik jest teraz czymś, co wygląda jak tabela, ale zmieni się, gdy do dowolnej tabeli podstawowej zostaną dodane nowe informacje. Uruchommy to zapytanie.

select * from all_finishes;
Sterownik Wyścig Śledź Lokalizacja Pozycja
Buddy Baker Daytona 500 Daytona International Speedway Daytona Beach, Floryda 3
Dale Earnhardt Jr. Daytona 500 Daytona International Speedway Daytona Beach, Floryda 2
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, Floryda 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

Wyniki są identyczne jak przy ostatnim uruchomieniu tego zapytania:

Różnica polega na tym, że teraz widok można odpytywać jak tabelę. Zapytanie, które pokazuje zwycięzców każdego wyścigu.

select * from all_finishes where position = 1;

Zapytanie dostarcza te wyniki.

Sterownik Wyścig Śledź Lokalizacja Pozycja
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, Floryda 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

Można również napisać zapytanie, aby wyświetlić lidera na podstawie średniego ukończenia.

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

Co pokazuje, że Dale Earnhardt jak dotąd prowadzi w tym sezonie:

Zakończ Sterownik
1,5 Dale Earnhardt, Jr.
2.0 Ricky Rudd
2,5 Buddy Baker

Ponieważ widoki mogą odwoływać się do innych widoków, za pomocą tych zapytań można tworzyć bardziej rozbudowane widoki.

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

Wyniki powyższego zapytania będą wyglądać tak.

Zakończ Sterownik
1,5 Dale Earnhardt, Jr.
2.0 Ricky Rudd
2,5 Buddy Baker

Jak również:

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

Co daje nam te same wyniki.

Sterownik Wyścig Śledź Lokalizacja Pozycja
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, Floryda 1
Dale Earnhardt, Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1

Dodawanie danych

Najmocniejszą częścią poglądów jest to, że gdy dodamy więcej danych, takich jak zakończenie wyścigu, w którym Buddy Baker wygrywa Brickyard 400 i Michigan 400, możemy po prostu zapytać o nasze poglądy, aby uzyskać te same wyniki.

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

Teraz możemy zobaczyć wszystkie zakończenia z tym zapytaniem.

select * from all_finishes;\

Wyniki powyższego zapytania będą wyglądać tak.

Sterownik Wyścig Śledź Lokalizacja Pozycja
Buddy Baker Daytona 500 Daytona International Speedway Daytona Beach, Floryda 3
Dale Earnhardt Jr. Daytona 500 Daytona International Speedway Daytona Beach, Floryda 2
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, Floryda 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 Cegła 400 Indianapolis Motor Speedway Speedway, IN 1
Dale Earnhardt Jr. Cegła 400 Indianapolis Motor Speedway Speedway, IN 3
Ricky Rudd Cegła 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

Możemy również uruchomić:

select * from race_winners;

Co daje nam:

Sterownik Wyścig Śledź Lokalizacja Pozycja
Ricky Rudd Daytona 500 Daytona International Speedway Daytona Beach, Floryda 1
Dale Earnhardt Jr. Talladega 500 Talladega Superspeedway Lincoln, AL 1
Buddy Baker Cegła 400 Indianapolis Motor Speedway Speedway, IN 1
Buddy Baker Michigan 400 Michigan International Speedway Brooklyn, MI 1

Ponadto skutkuje to mistrzem serii:

select * from standings_leader;

Co skutkuje:

Zakończ Sterownik
2 Buddy Baker
2 Dale Earnhardt, Jr.
2 Ricky Rudd

Wniosek

Kiedy zapisujemy zapytanie na naszym serwerze bazy danych (dokładniej w katalogu bazy danych) i nadajemy mu nazwę, to nowo nazwane zapytanie nazywa się widokiem bazy danych lub, prościej, widokiem. Widoki MySQL to potężny sposób zapisywania ważnych i wielokrotnego użytku zapytań, które mogą pomóc nam przyspieszyć wyszukiwanie ważnych informacji. Ponieważ te widoki zapisu mogą odwoływać się do innych widoków, bardziej szczegółowe widoki można tworzyć za pomocą tych istotnych zapytań.

Oceń nas!

Jesteśmy dumni z tego, że jesteśmy najbardziej pomocnymi ludźmi w hostingu™!

Nasze zespoły pomocy technicznej są wypełnione doświadczonymi technikami Linuxa i utalentowanymi administratorami systemów, którzy posiadają gruntowną wiedzę na temat wielu technologii hostingowych, zwłaszcza tych omówionych w tym artykule.

Jeśli masz jakiekolwiek pytania dotyczące tych informacji, jesteśmy zawsze dostępni, aby odpowiedzieć na wszelkie pytania związane z tym artykułem, 24 godziny na dobę, 7 dni w tygodniu 365 dni w roku.

Jeśli jesteś w pełni zarządzanym serwerem VPS, serwerem dedykowanym w chmurze, prywatną chmurą VMWare, prywatnym serwerem nadrzędnym, zarządzanymi serwerami w chmurze lub właścicielem serwera dedykowanego i nie czujesz się komfortowo podczas wykonywania którejkolwiek z opisanych czynności, my można się z nim skontaktować telefonicznie @800.580.4985, czat lub zgłoszenie do pomocy technicznej, aby pomóc Ci w tym procesie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Słownik DevOps Database dla nowicjuszy MySQL

  2. Wstaw Mysql do 2 tabel

  3. Wysyłanie wszystkich błędów PHP do bazy danych, a nie error_log

  4. Mysql wstawia losową datę i godzinę w podanym zakresie dat

  5. Definicje schematów według DBMS