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.