Към съдържанието
wannacode

Изгледи

Накратко: Изгледът (VIEW) е заявка, запомнена под име, която се ползва като таблица, но не пази свои данни.

Проблем

Една и съща сметка навсякъде

Колко струва една поръчка? В orders няма сума. Тя се смята от редовете на поръчката:

SQLбаза: магазин

Тази сметка трябва на отчета за деня, на справката за клиента, на списъка с неплатени поръчки. Всеки път се пише наново. Ако един ден се добави доставка или отстъпка, трябва да се поправи на десет места. И на едно от тях ще се забрави.

Идеята

CREATE VIEW

CREATE VIEW име AS SELECT … запомня заявка под име. Това е изглед (view). После изгледът се чете като таблица:

SQLбаза: магазин

Сметката е написана веднъж, в изгледа. Отчетите само казват FROM order_totals.

Идеята

Като таблица

В SELECT изгледът се ползва като всяка таблица: с WHERE, ORDER BY, JOIN. В това поле order_totals вече е направен. Ето новите поръчки, с клиента и стойността:

SQLбаза: магазин

Заявката е по-кратка и по-ясна: „поръчката, клиентът, стойността“. Как се смята стойността е скрито в изгледа.

Пробвай

Големите поръчки

Изгледът order_totals е готов. Кои поръчки са над 100 €? Покажи номера и стойността.

SQLбаза: магазин

Виж го

Изгледът не пази данни

Клиентът на поръчка 1 се обажда: иска 5 сирена, а не 4. Пусни заявката и виж и двата резултата:

SQLбаза: магазин

Преди е 31,60 €, после е 39,50 €. Никой не е пипал изгледа. Изгледът не пази стойностите, а само заявката. Всяко четене я пуска наново върху таблиците, затова изгледът не може да остарее.

Затова в изглед и не може да се пише:

SQLбаза: магазин

Данните се променят в таблиците, от които изгледът чете.

По-точно, за любопитните

PostgreSQL има и CREATE MATERIALIZED VIEW: изглед, който пази резултата като таблица. Чете се бързо, но остарява и се опреснява с REFRESH MATERIALIZED VIEW. Ползва се за тежки отчети, които не трябва да са точни до секундата. SQLite няма такъв изглед.

Пробвай

Продажбите по продукт

Направи изглед product_sales: за всеки продукт (product_id) колко броя са поръчани (sold), без редовете от отказаните поръчки.

SQLбаза: магазин

Идеята

DROP VIEW

Изгледът се маха с DROP VIEW. DROP TABLE не става:

SQLбаза: магазин
SQLбаза: магазин

Таблиците, от които изгледът чете, не се пипат. Махаш само запомнената заявка.

По-точно, за любопитните

За да смениш изглед в SQLite, го махаш с DROP VIEW и го правиш наново с CREATE VIEW. PostgreSQL и MySQL имат CREATE OR REPLACE VIEW, а SQLite не:

SQLбаза: магазин

Има и обратната връзка: колона, която изглед ползва, не може да се махне с DROP COLUMN (за това стана дума в предния урок).

Упражнение

Два отчета

1. Собственичката иска да изпрати благодарствени картички на тримата клиенти, които са поръчали за най-много пари.

С изгледа order_totals покажи името на клиента и колко е поръчал общо (spent), без отказаните поръчки. Само първите трима, от най-много към по-малко.

SQLбаза: магазин

2. Складът сутрин гледа кои поръчки чакат.

Направи изглед open_orders с номера на поръчката, името на клиента и стойността ѝ, само за новите и платените поръчки (new, paid). Ползвай order_totals.

SQLбаза: магазин

Тест

Провери се

1. Какво пази изгледът order_totals?
2. Как се маха изгледът order_totals?
3. Количеството в ред от поръчка 1 се промени с UPDATE. Какво трябва да направиш, за да е вярна стойността в order_totals?
4. Можеш ли да напишеш JOIN между изглед и таблица?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·