Какво е MySQL View?
Изгледът на MySQL е просто обикновен обект на база данни, който може да спести на авторите на SQL заявки много време, когато се използва правилно. Изгледът е съхранена заявка, която потребителят може да препраща точно като таблица. Много пъти потребителите ще използват една и съща основна заявка отново и отново, за да решат множество проблеми. Изгледите са начин за бързо запазване на тази заявка и препращане към нея по-късно.
Какви са предимствата на използването на изгледи?
Изгледите имат няколко предимства. Първо, изгледите се появяват на потребителя на MySQL точно като таблица. Клаузата SELECT може да препраща към изглед точно като таблица. Друго предимство е, че когато се променят основните таблици, към които се отнася изгледът, резултатите на изгледа също се променят. Трето предимство е, че изгледът заема много малко място на сървъра. SQL резултатите на изгледа се изчисляват всеки път, когато се осъществи достъп до него, така че те не се съхраняват на сървъра, докато не бъдат достъпни.
Таблици за това упражнение
За тази статия ще бъде създадена база данни, съдържаща информация за измислен автомобилен състезателен сезон, включващ трима пилоти, четири писти и едно състезание на всяка писта. В тази база данни има четири таблици.
- Драйвери
- Писти
- Състезания
- Завършва
Структурата на таблиците е както е посочено по-долу.
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)
);
Драйвери
Сега, в следващата ни стъпка, ще вмъкнем трима шофьори и техните номера на автомобили в таблица.
- Бъди Бейкър 28
- Дейл Ърнхард младши 8
- Рики Ръд 88
insert into drivers (name,car_number) values
('Buddy Baker',28),
('Dale Earnhardt Jr.',8),
('Ricky Rudd',88);
Нашите резултати вече ще покажат следния изход.
ID | Име | Номер на автомобил |
1 | Бъди Бейкър | 28 |
2 | Дейл Ърнхард младши | 8 |
3 | Рики Ръд | 88 |
Състезателни писти
След това добавяме четири състезателни писти и тяхното местоположение.
- Talladega Superspeedway – Линкълн, Алабама
- Международна писта в Дейтона – Дейтона Бийч, Флорида
- Моторна писта в Индианаполис – Speedway, IN
- Международна скоростна писта Мичиган – Бруклин, Мичиган
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');
Нашите резултати вече ще покажат следния изход.
ID | Име | Местоположение |
1 | Talladega Superspeedway | Линкълн, Алабама |
2 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида |
3 | Моторна писта в Индианаполис | Speedway, IN |
4 | Международна скоростна писта в Мичиган | Бруклин, Мичиган |
Състезания
Сега се въвеждат четири състезания, заедно с разстоянието за всяко.
- Daytona 500 ,2500
- Talladega 500,1,500
- Тухларна 400,3, 400
- Мичиган 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');
Нашите резултати вече ще покажат следния изход.
ID | Име | Проследяване | Разстояние |
1 | Talladega 500 | 2 | 500 |
2 | Daytona 500 | 1 | 500 |
3 | Кухларна 400 | 3 | 400 |
4 | Мичиган 400 | 4 | 400 |
Резултати
Накрая вече са създадени таблиците за началото на сезона.
В първото състезание на Daytona 500:
- Рики Ръд завършва първи
- Дейл Ърнхард младши завършва втори
- Бъди Бейкър завършва трети.
insert into finishes (driver, race, position) values
(1,1,3),
(2,1,2),
(3,1,1);
Компилирани данни
Първо въвеждане на данни
Сега има действителни данни за запитване. Ако изпълним заявка, за да разгледаме всички резултати от пилотите със съответните им писти и състезания, това е малко сложно, тъй като има няколко обединявания.
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;
Нашите резултати вече показват следния изход.
Драйвер | Състезание | Проследяване | Местоположение | Позиция |
Бъди Бейкър | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 3 |
Дейл Ърнхард младши | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 2 |
Рики Ръд | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 1 |
Второ въвеждане на данни
Тъй като второто състезание, Talladega 500, се добавят данни, заявката може да бъде написана отново, същото като по-ранната заявка. В това състезание Дейл Ърнхард е първи, а Бъди Бейкър е втори.
insert into finishes (driver, race, position) values
(1,2,2),
(2,2,1),
(3,2,3);
Резултатите от горната заявка биха изглеждали така.
Драйвер | Състезание | Проследяване | Местоположение | Позиция |
Бъди Бейкър | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 3 |
Дейл Ърнхард младши | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 2 |
Рики Ръд | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 1 |
Бъди Бейкър | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 2 |
Дейл Ърнхард, младши | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 1 |
Рики Ръд | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 3 |
Създаване на изглед
Сега, когато в базата данни има множество състезания, има нови начини за разглеждане на резултатите. Заявките могат да бъдат написани за „Най-добър завършек ” и „Най-много победи ” Всички тези заявки биха започнали с едни и същи основни данни за това какви пилоти са завършили на позицията на всяко състезание. За да се опрости процеса на разработване на тези заявки, може да се създаде изглед с клауза „създай или замени изглед като“. Тази клауза е последвана от SQL, който трябва да бъде запазен. В този случай той се добавя преди предишната заявка, която показахме по-горе.
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;
Резултатът е мощна функция на SQL. Този резултат вече е нещо, което изглежда като таблица, но ще се промени, когато се добави нова информация към която и да е основна таблица. Нека изпълним тази заявка.
select * from all_finishes;
Драйвер | Състезание | Проследяване | Местоположение | Позиция |
Бъди Бейкър | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 3 |
Дейл Ърнхард младши | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 2 |
Рики Ръд | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 1 |
Бъди Бейкър | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 2 |
Дейл Ърнхард, младши | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 1 |
Рики Ръд | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 3 |
Резултатите са идентични с последния път, когато изпълнихме тази заявка:
Разликата е, че сега изгледът може да бъде запитан като таблица. Заявка, която показва победителите във всяко състезание.
select * from all_finishes where position = 1;
Заявката предоставя тези резултати.
Драйвер | Състезание | Проследяване | Местоположение | Позиция |
Рики Ръд | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 1 |
Дейл Ърнхард, младши | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 1 |
Може също да се напише заявка за показване на лидера въз основа на средно завършване.
select avg(position) as finish,
driver
from all_finishes
group by driver
order by finish;
Което показва, че Дейл Ърнхард е начело досега за сезона:
Край | Драйвер |
1.5 | Дейл Ърнхард, младши |
2.0 | Рики Ръд |
2.5 | Бъди Бейкър |
Тъй като изгледите могат да препращат към други изгледи, с тези заявки могат да се създават по-обширни изгледи.
create view standings_leader as
select avg(position) as finish,
driver
from all_finishes
group by driver
order by finish;
Резултатите от горната заявка биха изглеждали така.
Край | Драйвер |
1.5 | Дейл Ърнхард, младши |
2.0 | Рики Ръд |
2.5 | Бъди Бейкър |
Както и:
create view race_winners as
select * from all_finishes where position = 1;
Което ни дава същите резултати.
Драйвер | Състезание | Проследяване | Местоположение | Позиция |
Рики Ръд | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 1 |
Дейл Ърнхард, младши | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 1 |
Добавяне на данни
Най-мощната част от изгледите е, че когато добавим повече данни като тези завършвания на състезанието, където Бъди Бейкър печели Тухла 400 и Мичиган 400, можем просто да запитаме изгледите си, за да получим същите резултати.
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);
Сега можем да видим всички завършвания с тази заявка.
select * from all_finishes;\
Резултатите от горната заявка биха изглеждали така.
Драйвер | Състезание | Проследяване | Местоположение | Позиция |
Бъди Бейкър | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 3 |
Дейл Ърнхард младши | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 2 |
Рики Ръд | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 1 |
Бъди Бейкър | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 2 |
Дейл Ърнхард младши | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 1 |
Рики Ръд | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 3 |
Бъди Бейкър | Кухларна 400 | Моторна писта в Индианаполис | Speedway, IN | 1 |
Дейл Ърнхард младши | Кухларна 400 | Моторна писта в Индианаполис | Speedway, IN | 3 |
Рики Ръд | Кухларна 400 | Моторна писта в Индианаполис | Speedway, IN | 2 |
Бъди Бейкър | Мичиган 400 | Международна скоростна писта в Мичиган | Бруклин, Мичиган | 1 |
Дейл Ърнхард младши | Мичиган 400 | Международна скоростна писта в Мичиган | Бруклин, Мичиган | 2 |
Рики Ръд | Мичиган 400 | Международна скоростна писта в Мичиган | Бруклин, Мичиган | 3 |
Можем също да изпълним:
select * from race_winners;
Което ни дава:
Драйвер | Състезание | Проследяване | Местоположение | Позиция |
Рики Ръд | Daytona 500 | Международна скоростна писта в Дейтона | Дейтона Бийч, Флорида | 1 |
Дейл Ърнхард младши | Talladega 500 | Talladega Superspeedway | Линкълн, Алабама | 1 |
Бъди Бейкър | Кухларна 400 | Моторна писта в Индианаполис | Speedway, IN | 1 |
Бъди Бейкър | Мичиган 400 | Международна скоростна писта в Мичиган | Бруклин, Мичиган | 1 |
Също така, това води до шампион на поредицата:
select * from standings_leader;
Което води до:
Край | Драйвер |
2 | Бъди Бейкър |
2 | Дейл Ърнхард, младши |
2 | Рики Ръд |
Заключение
Когато запишем заявка в нашия сървър на база данни (по-точно в каталога на базата данни) и й дадем име, тази новоназована заявка се нарича изглед на база данни или, по-просто, изглед. MySQL Views са мощен начин за запазване на жизненоважни и повторно използваеми заявки, които могат да ни помогнат да ускорим извличането на важна информация. Тъй като тези запазени изгледи могат да препращат към други изгледи, по-подробни изгледи могат да бъдат създадени с тези съществени заявки.
Оценете ни!
Гордеем се, че сме най-полезните хора в хостинг™!
Нашите екипи за поддръжка са пълни с опитни Linux техници и талантливи системни администратори, които имат задълбочени познания за множество технологии за уеб хостинг, особено тези, обсъдени в тази статия.
Ако имате въпроси относно тази информация, ние винаги сме на разположение, за да отговорим на всички въпроси, свързани с тази статия, 24 часа в денонощието, 7 дни в седмицата, 365 дни в годината.
Ако сте напълно управляван VPS сървър, Cloud Dedicated, VMWare Private Cloud, Private Parent Server, Managed Cloud Servers, или собственик на специален сървър и се чувствате неудобно да изпълнявате някоя от описаните стъпки, ние можете да се свържете чрез телефон @800.580.4985, чат или билет за поддръжка, за да ви помогнем с този процес.