计算机二级MySQL——简单应用题(事件&视图)

事件

从MySQL 5.1起,事件开始被支持。 它可以通过 MySQL 服务器中一个非常有特色的功能模块一一事件调度器 (Event Scheduler)进行监视,并判断其是否需要被调用。 事件调度器可以在指定的时刻执行某些特定的任务,并以此可取代原先只能由操作系统的计划任务来执行的工作。这种需要在指定的时刻才被执行的某些特定任务就是事件,这些特定任务通常是一些确定的 SQL 语句。目前,MySQL 的事件调度器可以精确到每秒钟执行一个任务,这对于一些对数据实时性要求较高的应用非常适合,如股票、赔率和比分等。

事件和触发器相似,都是在某些事情发生的时候启动,因此事件也可称为临时触发器(temporal trigger)。其中,事件是基于特定时间周期触发来执行某些任务,而触发器是基于某张表所产生的事件触发的,它们的区别也在于此。

在使用事件调度器功能之前,必须确保 MySQL 中 EVENT_SCHEDULER 已被开启。这可通过执行如下 MySQL 命令语句来查看当前是否已开启事件调度器:mysql> SHOW VARIABLES LIKE 'EVENT_SCHEDULER':

或者,查看系统变量:mysql> SELECT @ @ EVENT_SCHEDULER;

如若没有被开启,可通过执行如下 MySQL 命令语句来开启该功能。

sql 复制代码
mysql> SET CLOBAL EVENT_SCHEDULER = 1;

//或

mysql> SET CLOBAL EVENT_SCHEDULER = TRUE

再或者,可以在 MySQL 的配置文件 my.ini 中加上"EVENT_SCHEDULER=1" 或" SET GLOBAL EVENT SCHEDULER=ON" 来开启。

创建事件

在MySQL 5.5中,事件可以通过 CREATE EVENT 语句来创建,其语法格式为:

sql 复制代码
CREATE
	EVENT
	[ IF NOT EXISTS ]
	event_name
	ON SCHEDULE schedule
	[ ENABLE | DISABLE | DISABLE ON SLAVE ]
	DO event_body

其中,schedule 的语法格式为:

sql 复制代码
AT timestamp [ + INTERVAL interval ]...
| EVERY interva 
	[ STARTS timestamp [ + INTERVAL interval ] ... ]
	[ ENDS timestamp [ + INTERVAL interval ] ... ]

interval 的语法格式为:

sql 复制代码
quantity | YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND 
| YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND

主要语法说明如下:

  • event name:指定事件名,前面可以添加关键字 IF NOT EXISTS 来修饰。
  • schedule:时间调度,用于指定事件何时发生或者每隔多久发生一次,分别对应下面两条子句:
    ①AT子句:用于指定事件在某个时刻发生。其中,timestamp 表示一个具体的时间点,后面可以加上一个时间间隔,表示在这个时间间隔后事件发生;interval 表示这个时间间隔由一个数值和单位构成;quantity 是间隔时间的数值。
    ②EVERY子句:用于表示事件在指定时间区间内每间隔多长时间发生一次。其中,STARTS 子句用于指定开始时间,ENDS 子句用于指定结束时间。
  • event_body:Do 子句中的 event_body 部分用于指定事件启动时所要求执行的代码。如果包含多条语句,可以使用 BEGIN...END 复合结构。
  • ENABLE | DISABLE | DISABLE ON SLAVE:为可选项,表示事件的一种属性。其中,关键字 ENABLE 表示该事件是活动的,活动意味着调度器检查事件动作是否必须调用;关键字 DISABLE 表示该事件是关闭的,关闭意味着事件的声明存储到目录中,但是调度器不会检查它是否应该调用;关键字 DISABLE ON SLAVE 表示事件在从机中是关闭的。如果不指定这三个选项中的任何一个,则在一个事件创建之后,它立即变为活动的。

修改事件

在MySQL 5.5中,事件被创建之后可以通过使用 ALTER EVENT 语句来修改其定义和相关属性,其语法格式为:

sql 复制代码
ALTER
EVENT event_name T
[ ON SCHEDULE schedule ] 
[ RENAME TO new_event_name ] 
[ ENABLE | DISABLE | DISABLE ON SLAVE ] 
[ DO event_body ]

ALTER EVENT 语句与 CREATE EVENT 语句使用的语法相似。用户可以使用一条 ALTER EVENT 语句让一个事件关闭或再次让其活动。需要注意的是,一个事件最后一次被调用后,它是无法被修改的,因为此时它已不存在了。

删除事件

在MySQL 5.5中,可以使用 DROP EVENT 语句删除已创建的事件,其语法格式为:DROP EVENT [ IF EXISTS ] event_name

例1:

sql 复制代码
DELIMITER $$
CREATE EVENT ev_book ON SCHEDULE EVERY 1 DAY
STARTS '2017-01-01 01:00:00'
DO
BEGIN
   UPDATE tb_booking
   SET flag = 4
   	WHERE pdate = CURDATE() - 1 and flag = 1;
END$$
DELIMITER ;

空处:

①第二行:EVENT

②第二行:DAY

③第八行:1(flag = 1)

④第九行:$$

例2:

sql 复制代码
DELIMITER $$   //临时改变结束符(结束符设置为$$)
CREATE EVENT ev_group ON SCHEDULE EVERY 1 MONTH   //创建名为ev_group的事件,时间调度为每月一次
//CREATE EVENT [ IF NOT EXISTS ] event_name ON SCHEDULE schedule
STARTS CURDATE() + INTERVAL 1 MONTH
DO
BEGIN
   SELECT sno, sname FROM tb_student WHERE sno NOT IN  ( SELECT sno FROM tb_gs ) INTO OUTFILE 'c:/tmp.txt' FIELDS TERMINATED BY ',';   
	//SELECT...INTO OUTFILE 'file_name' TERMINATED BY 'string'
END $$   //触发器体结束,并用 $$ 表示整个定义结束
DELIMITER ;   //恢复结束符为 ;

空处:

①第二行:SCHEDULE

②第三行:STARTS

③第六行:NOT IN

④第六行:sno(sno FROM tb_gs)

⑤第六行:INTO

导出备份语句 SELECT INTO...OUTFILE 的语法格式为:SELECT * INTO OUTFILE 'file_name' [ CHARACTER SET charset_name ] export_options | INTO DUMPFILE 'file_name

例3:

sql 复制代码
DELIMITER $$   //临时改变结束符(结束符设置为$$)
CREATE EVENT ev_bak ON SCHEDULE EVERY 1 DAY   //创建名为ev_bak的事件,时间调度为每日
//CREATE EVENT [ IF NOT EXISTS ] event_name ON SCHEDULE schedule
DO
BEGIN
    SELECT * FROM tb_student INTO OUTFILE 'bakfile.txt' FIELDS TERMINATED BY ',';   //指定字段值之间的符号为,
END $$   //触发器体结束,并用 $$ 表示整个定义结束
DELIMITER ;   //恢复结束符为 ;

空处:

①第二行:EVENT

②第二行:EVERY

③第五行:tb_student

视图

视图是从一张或多张表或者视图中导出的表,它也包含一系列带有名称的数据列和若干条数据行。然而,视图不同于数据库中真实存在的表,其区别在于:

  • 视图不是数据库中真实的表,而是一 张虚拟表,其结构和数据是建立在对数据库中真实表的查询基础上的。
  • 视图的内容是由存储在数据库中进行查询操作的 SQL 语句来定义的,它的列数据与行数据均来自定义视图的查询所引用的真实表(也称基础表、基表或源表)或者是基于真实表的计算值,并且这些数据是在引用视图时动态生成的。
  • 视图不是以数据集的形式存储在数据库中。它所对应的数据实际上是存储在视图所引用的真实表( 基础表)中。
  • 视图是用来查看存储在别处的数据的一种设施,其自身并不存储数据。

尽管视图与数据库中的表存在着本质上的不同,但视图一经定义后,可以如同使用表一样,对视图进行查询以及受限的修改、删除和更新等操作。并且,使用视图具有如下一些优点:

①集中分散数据。当用户所需的数据分散在数据库的多张表中时,通过定义视图可以将这些数据集中在一起,以方便用户对分散数据的集中查询与处理。

②简化查询语句。定义视图可为用户屏蔽数据库的复杂性,使其不必详细了解数据库中复杂的表结构和表连接,因而能简化用户对数据库的查询语句。例如,即便是底层数据库表发生了更改,也不会影响上层用户对数据库的正常使用,只需数据库编程人员重新定义视图的内容即可。这也正是使用外模式,以及模式和外模式之间映射的目的。实际上,视图的查询定义就是模式和外模式之间的映射关系。这样一来,依据数据外模式编写的应用程序就不用修改,从而保证了数据与程序的逻辑独立性。

③重用 SQL 语句。视图提供的是一种对查询操作的封装,它本身不包含数据,其所呈现的数据是根据视图的定义从基础表中检索出来的,若基础表中的数据被新增或更改,视图所呈现的则是更新后的数据。因此,通过定义视图,编写完所需查询后,可以方便地重用该视图,而不了解它的具体查询细节。

④保护数据安全。通过只授予用户使用视图的权限,而不具体指定使用表的权限,来保护基础数据的安全性。 因为,通过视图用户只能查询和修改他们所能见到的数据,数据库中的其他数据则既看不见也取不到。 数据库授权命令可以使每位用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库的特定行上。 通过视图,用户可以被限制在数据库的不同子集上。使用权可被限制在基表的行的子集上。

⑤共享所需数据。 通过视图,每位用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,从而同样的数据只需存储一次。

⑥更改数据格式。 通过视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中去。

创建视图

在 MySQL 5.5 中,可以使用 CREATE VIEW 语句来创建视图,其语法格式为:

sql 复制代码
CREATE [ OR REPLACE ]
	VIEW view_name[(column_list)] 
	AS SELECT_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

主要语法说明如下:

  • OR REPLACE:可选项,用于指定 OR REPLACE 子句。该语句用于替换数据库中已有的同名视图,但需要在该视图上具有 DROP 权限。
  • view_name:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
  • column_list:这条可选子句可以为视图中的每个列指定明确的名称。其中,列名的数目必须等于 SELECT 语句检索出的结果数据集的列数,并且每个列名间用逗号分隔。如若省略 coIumn_list 子句,则新建视图使用与基础表或源视图中相同的列名。
  • SELECT_statement:用于指定创建视图的 SELECT 语句。这条 SELECT 语句给出了视图的定义;它可用于查询多张基础表或源视图。对于 SELECT 语句的指定,存在以下一些限制:
    ①定义视图的用户除了要求被授于 CREATE VIEW 的权限外,还必须被授予可以操作视图所涉及的基础表或其他视图的相关权限。
    ②SELECT 语句不能包含 FROM 子句中的子查询。
    ③SELECT语句不能引用系统变量或用户变量。
    ④SELECT 语句不能引用预处理语句参数。
    ⑤在 SELECT 语句中引用的表或视图必须存在。但是,创建完视图后,可以删除视图定义中所引用的基础表或源视图。若想检查视图定义是否存在这类问题,可使用 CHECK TABLE 语句。
    ⑥如若 SELECT 语句中所引用的不是当前数据库的基础表或源视图时,需要在该表或视图前加上数据库的名称作为限定前缀。
    ⑦在由 SELECT 语句构造的视图定义中,允许使用 ORDER BY 子句。但是,如果从特定视图进行了选择,而该视图使用了自己的 ORDER BY 语句,则视图定义中的 ORDER BY 子句将被忽略。
    ⑧对于 SELECT 语句中的其他选项或子句,若所创建的视图中也包含了这些选项,则语句执行效果未定义。例如,如果在视图定义中包含了 LIMIT 子句,而 SELECT 语句也使用了自己的 LIMIT 子句,那么 MySQL 对使用哪一条 LIMIT 语句未做定义。
    • WITH CHECK OPTION:这条可选子句用于指定在可更新视图上所进行的修改都需要符合 select_statement 中所指定的限制条件,这样可以确保数据修改后仍可以通过视图看到修改后的数据。当视图是根据另一个视图定义时,WITH CHECK OPTION 给出两个参数,即 CASCADED 和 LOCAL,它们决定检查测试的范围。其中,关键字 CASCADED 为选项默认值,它会对所有视图进行检查,而关键字 LOCAL 则使 CHECK OPTION 只对定义的视图进行检查。

修改视图定义

在 MySQL 5.5中,可以使用 ALTER VIEW 语句来对已有视图的定义(结构)进行修改,其语法格式为:

sql 复制代码
ALTER VIEW view_name [(column list)] 
	AS SELECT statement
	[ WITH [CASCADED | LOCAL] CHECK OPTION ]

ALTER VIEW 语句的语法与 CREATE VIEW 类似,但需要注意的是,对于 ALTER VIEW 语句的使用,需要用户具有针对视图的 CREATE VIEW 和 DROP 权限,以及由 SELECT 语句选择的每一列上的某些权限。

另外,修改视图的定义也可以通过先使用 DROP VIEW 语句,再使用 ALTER VIEW 语句的过程来实现,还可以直接使用 CREATE OR REPLACE VIEW 语句来实现。若使用 CREATE OR REPLACE VIEW 语句,则当要修改的视图不存在时,该语句会创建一个新的视图,而当要修改的视图存在时,该语句会替换原有视图,重新构造一个修改后的视图定义。

删除视图

在 MySQL 5.5中,可以使用 DROP VIEW 语句来删除视图,其语法格式为:DROP VIEW [ IF EXISTS ]view_name [,view_name]...

  • view_name:指定要被删除的视图名。 使用 DROP VIEW 语句可以 一次删除多个视图,但必须在每个视图上都拥有 DROP 权限。
  • • IF EXISTS:可选项,用于防止因删除不存在的视图而出错。 若在 DROP VIEW 语句中没有给出该关键字,则当指定的视图不存在时系统会发生错误。

例1:

sql 复制代码
USE JY;   //指定为当前数据库
CREATE VIEW v_student   //创建名为v_student的视图
AS
SELECT *
FROM student
WHERE student.stu_id IN (SELECT reading.stu_no FROM reading, book
                            WHERE reading.book_no = book.book_id 
                            AND book.book_name = '高等数学');

空处:

①第二行:VIEW

②第四行:*

③第六行:IN

④第六行:book

相关推荐
邪修king2 小时前
C++ 进阶终章:异常机制与智能指针全解 —— 从错误处理到 RAII 资源管理,打通现代 C++ 的核心命脉
android·数据结构·c++
三少爷的鞋2 小时前
LiveData 的缺陷:为什么我现在越来越少使用 LiveData?
android
AAA@峥3 小时前
系统化学习 MySQL:数据类型、库表管理、增删改查全解析
数据库·学习·mysql
雨白14 小时前
NDK 初探:基于 C++ 实现参数哈希与签名校验
android
程序员正茂14 小时前
Android studio中初步使用OpenCV库
android·opencv
二宝哥15 小时前
MySQL 修改密码策略详解:从基础到高级配置
mysql·密码学
紫_龙15 小时前
window 维护多版本Android studio
android·ide·android studio
马优晨15 小时前
DBeaver 连接 MySQL 完整排错教程
mysql·dbeaver连接mysql·dbeaver连mysql·dbeaver连接数据库·db连接mysql
一嘴一个橘子16 小时前
MysqL 索引的列 都是什么意思
mysql