mysql之时区、创建使用视图

时区和创建使用视图
一、MySQL时区
查看OS时区:
cat /etc/sysconfig/clock
cat /usr/share/zoneinfo/Asia/Shanghai
mysql系统时区:system_time_zone
加载时区:
mysql_tzinfo_to_sql /usr/share/zoneinfo/ |mysql -p123 mysql
查看是否加载成功:
select count(*) from mysql.time_zone_name;
设置time_zone为亚洲上海:
set global time_zone=‘Asia/Shanghai’;
修改配置文件:
default-time-zone
timestamp列:时区+时间,会转换成0时区对应的时间存储
取时间时会将存储的0时区的对应的时间转换成会话时区的时间
MySQL时区要设置正确,会话的时区要能正确反映会话的正确时区
set session time_zone=’+8:00’;
二、创建视图
视图就相当于为select语句的别名,查询视图就相当于执行相应的select语句。

mysql之时区、创建使用视图_第1张图片
在这里插入图片描述

2.1、创建视图
语法:
CREATE [OR REPLACE] VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
OR REPLACE:如果视图已经存在则替换它
视图是一个逻辑表,它本身并不包含数据。通过它,可以展现基表的部分数据。用来创建视图的表叫做基表BASE TABLE。视图是作为一个SELECT语句保存在数据字典中的。
例1:创建一个视图,它包含了具有联盟会员号码的所有球员的编号和联盟会员号码
CREATE VIEW cplayers
AS SELECT playerno,leagueno
FROM players
WHERE leagueno IS NOT NULL;
视图一旦创建完毕,就可以像一个普通表那样使用。视图主要用来查询
查看视图cplayers的结构:可见,如果创建视图时不明确指定视图的列名,那么它的列名就和定义视图的select子句中的列名完全相同
DESC cplayers;
在这里插入图片描述
2.2、查询视图cplayers:
SELECT * FROM cplayers;
例2:从视图中cplayers中删除联盟会员号码为6524的球员
DELETE FROM cplayers
WHERE leagueno=‘6524’;
因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中。以上语句导致基表players中leagueno='6524’的行被删除

mysql之时区、创建使用视图_第2张图片
创建视图时,可以显式的指定视图的列名
例3:创建视图,包含了居住在stratford(斯特拉福德)的球员的编号、姓名、首字母和出生日期
CREATE VIEW stratforders(playerno,NAME,init,born)
AS SELECT playerno,NAME,initials,birth_date
FROM players
WHERE town=‘Stratford’;
注意:该语法要求视图名后面的列的数量必须匹配select子句中的列的数量
MySQL允许视图的列名是一个函数或表达式。引用这些特殊的列名时必须用反引号括起来(不推荐)
例4:
CREATE VIEW residents
AS SELECT town,count(*)
FROM players
GROUP BY town;

SELECT town,count(*) FROM residents;
2.3、视图的DML操作(通过视图对表进行DML操作,基本不用)
不是所有的视图都可以做DML操作。有下列内容之一,视图不能做DML操作
1)select子句中包含distinct
2)select子句中包含组函数
3)select语句中包含group by子句
4)select语句中包含order by子句
5)select语句中包含union 、union all等集合运算符
6)where子句中包含相关子查询
7)from子句中包含多个表
此外,对于update,还有:
8)如果视图中有计算列,则不能更新
此外,对于insert,还有:
9)如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
注意:
1、建议对表进行查询时通过视图,对表进行修改时还是对表操作。
2、视图保护表中其他数据不被insert、delete、update。
3、限制用户对表数据的访问范围。
4、通过视图对表进行操作,最常使用的一个视图结构:create view v_t as select * from t where id<100;
5、使用视图删除或者修改表内容时,如果要删除或者修改的内容视图中没有,不会报错,也不会删除或者修改表中相应的数据。
6、向视图中插入数据时,如果要插入的数据不满足视图的where条件会报错,无法插入。

什么时候通过视图修改表呢?
假设一个表有1000万行,现需要对表进行增删改,建立一个视图,视图有where条件,可以对表的1000行进行访问,希望对表的1000进行修改时可以通过视图修改表
三、使用WITH CHECK OPTION约束
对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束。该约束的作用是:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制,也就是只能对视图显示出来的数据进行操作,对表中其他的数据不能进行操作。
例5:创建视图,包含1960年之前出生的所有球员(老兵)
CREATE OR REPLACE VIEW veterans
AS SELECT *
FROM players
WHERE birth_date < ‘1960-01-01’
WITH CHECK OPTION;

SELECT * FROM veterans;
UPDATE veterans
SET birth_date = ‘1970-09-01’
WHERE playerno = 39;
该语句的操作结果违反了视图中的WHERE birth_date < '1960-01-01’子句。因此,抛出异常:
错误代码: 1369
CHECK OPTION failed ‘tennis.veterans’

视图可以定义在另一个视图的上面,称为嵌套视图。
例6:CREATE VIEW several
AS SELECT *
FROM cplayers
WHERE playerno BETWEEN 6 AND 27;
使用WITH CHECK OPTION约束时,可以使用CASCADED或者 LOCAL选项指定检查的程度:
WITH CASCADED CHECK OPTION:检查所有的视图(例如,嵌套视图及其底层的视图)
WITH LOCAL CHECK OPTION:只检查将要更新的视图本身(对嵌套视图不检查其底层的视图)
不指定选项则默认是CASCADED
四、定义视图时的其它选项
语法:
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
DEFINER选项:指出谁是视图的创建者或定义者。如果不指定该选项,则创建视图的用户就是定义者。指定关键字CURRENT_USER和不指定该选项效果相同
SQL SECURITY选项:要查询一个视图,首先必须要具有对视图的select权限。但是,如果同一个用户对于视图所访问的表没有select权限,那会怎么样?SQL SECURITY选项决定执行的结果:
1)SQL SECURITY DEFINER:创建视图的用户必须对视图所访问的表具有select权限
2)SQL SECURITY INVOKER:访问视图的用户必须对视图所访问的表具有select权限
不写SQL SECURITY选项等同于SQL SECURITY DEFINER

示例1:以用户newroot执行:
CREATE USER ‘demo’@’%’
IDENTIFIED BY ‘demo’;
创建视图,视图的定义者是demo
CREATE OR REPLACE
DEFINER=‘demo’@’%’
SQL SECURITY DEFINER
VIEW cplayers
AS SELECT playerno,leagueno
FROM players
WHERE leagueno IS NOT NULL;
把视图的select权限授给demo
GRANT SELECT ON tennis.cplayers TO ‘demo’@’%’ ;

再以用户demo执行:
SELECT * FROM cplayers;
抛出异常:demo没有访问players表的权限
错误代码: 1356
View ‘tennis.cplayers’ references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
例2:以用户newroot执行:
视图的定义者是newroot
CREATE OR REPLACE
SQL SECURITY INVOKER
VIEW cplayers
AS SELECT playerno,leagueno
FROM players
WHERE leagueno IS NOT NULL;

再以用户demo执行:
SELECT * FROM cplayers;
抛出异常:demo没有访问players表的权限
错误代码: 1356
View ‘tennis.cplayers’ references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
例3:以用户newroot执行:
CREATE OR REPLACE
SQL SECURITY DEFINER
VIEW cplayers
AS SELECT playerno,leagueno
FROM players
WHERE leagueno IS NOT NULL;

再以用户demo执行:
demo不需要访问players表的权限
SELECT * FROM cplayers;
可以看到了。
五、视图查询语句的处理
1、替代方法:
把select语句中的视图名使用定义视图的select语句来替代,再处理所得到的select语句
例:创建视图,包含所有有罚款的球员的信息
CREATE VIEW cost_raisers
AS SELECT *
FROM players
WHERE playerno IN (
SELECT playerno
FROM penalties);
查询视图:
Select playerno
From cost_raisers
Where town=’Stratford’;
替代方法把以上查询变为:
SELECT playerno
FROM (SELECT *
FROM players
WHERE playerno IN (
SELECT playerno
FROM penalties)) AS viewformula
WHERE town=‘Stratford‘;
2、具体化方法:
先处理定义视图的select语句,这会生成一个中间的结果。然后,再在中间结果上执行select查询
例如:对于上面的查询语句:
Select playerno
From cost_raisers
Where town=’Stratford’;
首先执行视图cost_raisers的定义语句
SELECT *
FROM players
WHERE playerno IN (
SELECT playerno
FROM penalties);
MySQL在内存中保存该查询产生的中间结果集,然后执行查询:
Select playerno
From <中间结果集>
Where town=’Stratford’;

具体采用哪种方法,由MySQL自行决定。用户也可以在视图定义中使用 [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]选项来指定MySQL采用哪种方法
例如:
CREATE OR REPLACE
ALGORITHM=TEMPTABLE
VIEW expensive_players
AS SELECT *
FROM players
WHERE playerno IN (
SELECT playerno
FROM penalties);
通过关键字temptable,表示在处理定义视图的select语句时,必须创建一个临时表,即必须执行一个具体化;如果使用关键字merge,则表示采用替代方法处理视图。使用关键字undifined,表示由MySQL自行决定采取的方法
视图和数据字典
有关视图的信息记录在information_schema数据库中的views表中
查询tennis数据库中所有视图的名字
SELECT table_name
FROM information_schema.views
WHERE table_schema=‘tennis’;
删除视图:
DROP VIEW [IF EXISTS] view_name [, view_name] …
如果视图不存在,则抛出异常。使用IF EXISTS选项使得删除不存在的视图时不抛出异常
DROP VIEW cplayers;
视图权限

注意:1.视图基本上命名为:v_或者view_
2.视图取决于基表

你可能感兴趣的:(MySQL,数据库,mysql数据库)