works:programmer:db-mysql:create-view
Создать вьюшку
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }] [SQL SECURITY { DEFINER | INVOKER }] VIEW [IF NOT EXISTS] view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
Где ALGORITHM это алгоритм хранения вьюшки.
- Для MERGE текст оператора, который ссылается на представление, и определение представления объединяются таким образом, что части определения представления заменяют соответствующие части оператора.
- Для TEMPTABLE результаты представления извлекаются во временную таблицу, которая затем используется для выполнения инструкции.
- Для UNDEFINED MySQL выбирает, какой алгоритм использовать. Если возможно, он предпочитает MERGE вместо TEMPTABLE, потому что MERGE обычно более эффективен и потому что представление не может быть обновляемым, если используется временная таблица.
- Если предложение ALGORITHM отсутствует, алгоритм по умолчанию определяется значением флага derived_merge системной переменной optimizer_switch.
Где DEFINER определяет кто создал вьюшку
- Где user это имя пользователя
- Где CURRENT_USER текущий пользователь
- Где role это имя роли
- Где CURRENT_ROLE роль текущего пользователя
Где SQL SECURITY это доступ чтения вьюшки
- DEFINER читать от definer, позволяет читать вьюшку от имени того кто создал вьюшку, игнорируя права того кто делал SELECT
- INVOKER читать от запускающего, позволяет читать вьюшку с правами того пользователя который делает SELECT
column_list список колонок выводимых из вьюшки, необходим для лучшей оптимизации
WITH * CHECK OPTION, тип данных, так-же требуется для оптимизации.
CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY INVOKER VIEW `alchemy_by_days` (`date`,`earth`,`air`,`water`,`fire`,`life`,`shadow`) AS SELECT DATE(FROM_UNIXTIME(ep.`timestamp`)) AS `date`, SUM(IF(ep.type = "earth", ep.price, 0)) AS `earth`, SUM(IF(ep.type = "air", ep.price, 0)) AS `air`, SUM(IF(ep.type = "water", ep.price, 0)) AS `water`, SUM(IF(ep.type = "fire", ep.price, 0)) AS `fire`, SUM(IF(ep.type = "life", ep.price, 0)) AS `life`, SUM(IF(ep.type = "shadow", ep.price, 0)) AS `shadow` FROM `etheral-prices` ep GROUP BY ep.`timestamp` ORDER BY ep.`timestamp` DESC;
works/programmer/db-mysql/create-view.txt · Последнее изменение: 2022/10/07 10:04 — 127.0.0.1