* Виртуални таблици (view)
Публикувано на 07 април 2009 в раздел Бази от Данни.
Виртуалните таблици са още познати с директния си превод от английски език като "изгледи". На практика виртуалната таблица е съхранен SQL SELECT оператор, който си има собствено име в базата данни. Използва се когато често използваме едни и същи SELECT заявки.
Виртуалните таблици имат и редица други предимства:
- Различните потребители в системата могат да виждат едни и същи данни по различен начин;
- Удобни са за ограничаване се достъпа на потребителите до базовата таблица и така те могат да достъпват само данните, които извежда виртуалната таблица.
Виртуална таблица се създава чрез операторът CREATE VIEW:
CREATE VIEW <име>(<имена на колони>) AS SELECT <имена на колони> ... ;
Във вложения оператор SELECT не може да се използва ORDER BY и UNION. Важно е да има съответствие между върнатите колони от оператора SELECT и изброените след името на VIEW.
Пример: Създаване на виртуална таблица с данните на служителите на банка Bulbank:
CREATE VIEW bulbank_employees AS SELECT * FROM employees WHERE branch_id IN( SELECT id FROM branches WHERE bank_code IN( SELECT code FROM banks WHERE name = "Bulbank" ) );
Сега можем да го използваме също както обикновена таблица:
mysql> SELECT * FROM bulbank_employees; +----+-----------------+-----------+ | id | name | branch_id | +----+-----------------+-----------+ | 1 | Ivan Ivanov | 1 | | 3 | Mihail Zahariev | 1 | | 4 | Milen Stoilov | 2 | | 5 | Svilen Petrov | 2 | | 6 | Ilian Stoianov | 2 | | 7 | Petar Petrov | 2 | +----+-----------------+-----------+ 6 rows in set (0.00 sec)
Можем да изпълняваме и заявки от тип INSERT, UPDATE и DELETE - те ще бъдат трансформирани автоматично от системата за управление на бази данни върху базовата таблица.
Ако в операторът SELECT участва агрегатна функция или GROUP BY, то става напълно необновяемо. Изобщо използването на INSERT, UPDATE и DELETE при VIEW не се препоръчва. Най-често VIEW се използва "само за четене" и съответно потребителите се рестриктират да имат само права SELECT върху тези таблици.
За изтриването на VIEW става чрез оператора DROP VIEW:
DROP VIEW bulbank_employees CASCADE;
Ключовата дума CASCADE означава, че ако има производно на това VIEW (т.е. VIEW създадено чрез изтриваното VIEW), то също ще бъде изтрито. Алтернативата е с ключова дума RESTRICT, където ако има производно VIEW, то ще бъде върната грешка. По принцип не е добра идея да създавате производни една на друга виртуални таблици. Стойността по подразбиране на DROP VIEW e CASCADE.
Във CREATE VIEW заявката сте написали след името на виртуалната таблица в скоби , но по-надолу не виждам обяснение за какво се ползват тези колони. Може ли да поясните как участват те в заявката?
Задава изрично имената на колоните в резултатната таблица вместо да използва тези от SELECT заявката.
В една другия се споменава, че могат да се изпълняват заявки INSERT, DELETE, UPDATE на VIEW. При изпълняването на тези заявки върху VIEW те променят ли и информацията, от която е създадено това VIEW ( променя ли се оригинала или заявките влият само върху VIEW-то).
Променят се оригиналните данни.