mysql数据库基本操作(基本操作总结、视图、触发器、函数、存储过程、事件调度器)
视图,存储过程、触发器,https://www.cnblogs.com/clschao/articles/10034539.html
- 数据库的常用sql语句可以大致分为三部分:
DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
数据引擎简介
数据库中,文件是以表的形式进行存储的,而文件的类型不是单一的,而类型不同的数据引擎满足了不同文件类型的存储和使用需要。
单表操作
增删改查
多表查询操作
简单多表查询
利用select和限制条件,实现多表查询。注意在使用过程中,一定要找到两个表中相互关联的字段,并且作为限制条件。
基本语法:
- SELECT 表1.字段1名,表1.字段2名,表2.字段1名,表2.字段2名…… FROM 表1,表2 … WHERE 表1.字段 = 表2.字段 AND 其它查询条件
- select 表1别名.字段1名,表2别名.字段1名……from 表1 as 表1别名,表2 as 表2别名 … where 表1别名.字段 = 表2别名.字段 and 其它查询条件 (当表名较复杂时,可用简写代替,中间as 可以省略)
联合查询(子查询,包括单表多表)
union对象的数据结构必须是一致的
基本语法:
连表查询
基本语法:
SELECT 字段1、字段2、字段3……
FROM 表1 JOIN类型 表2 ON 表1.字段 = 表2.字段; (join类型包括 inner join 、left join 、right join )
inner join,只显示符合条件的信息,执行效果类似于简单多表查询
left join, 它是以左侧的表为基准故称左连接,左侧表中所有信息将被全部输出,而右侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL
right join,它是以右侧的表为基准故称右连接,右侧表中所有信息将被全部输出,而左侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL
事件调度器
- 简介
-
自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得 一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精 确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合,也可以实现定时清空数据库,或截断数据库。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。
-
- 事件调度器基本操作
- 查看事件调度器状态
- 方式一,show variables like ‘event_scheduler’;
- 方式二,select @@event_scheduler;
- 方式三,show processlist;
- 开启事件调度器
- set global event_scheduler = 1; 或者 set global event_scheduler = on;
- 关闭事件调度器
- set global event_scheduler = 0;或者 set global event_scheduler = off;
- 也可以使用配置文件,直接配置默认开启,或默认关闭
- 在MySQL的配置文件my.ini(Windows系统)/my.cnf(Linux系统)中,找对[mysqld],然后在下面添加以下代码开启事件。添加,event_scheduler = 1; 或默认关闭*** = 0;
- 查看事件调度器状态
- 事件的基本操作
- 创建事件
-
CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT 'comment'] DO sql_statement; 参数说明 DEFINER 可选,用于定义事件执行时检查权限的用户 IF NOT EXISTS 可选项,用于判断要创建的事件是否存在 EVENT event_name 必选,用于指定事件名,event_name的最大长度为64个字符,如果为指定event_name,则默认为当前的MySQL用户名(不区分大小写) ON SCHEDULE schedule 必选,用于定义执行的时间和时间间隔 ON COMPLETION [NOT] PRESERVE 可选,用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,即 NOT PRESERVE ENABLE | DISABLE | DISABLE ON SLAVE 可选项,用于指定事件的一种属性。其中,关键字ENABLE表示该事件是活动的,也就是调度器检查事件是否必选调用;关键字DISABLE表示该事件是关闭的,也就是事件的声明存储到目录中,但是调度器不会检查它是否应该调用;关键字DISABLE ON SLAVE表示事件在从机中是关闭的。如果不指定这三个选择中的任意一个,则在一个事件创建之后,它立即变为活动的。 COMMENT 'comment' 可选,用于定义事件的注释 DO event_body 必选,用于指定事件启动时所要执行的代码。可以是任何有效的SQL语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用BEGIN...END复合结构
schedule: AT TIMESTAMP [+ INTERVAL INTERVAL] | EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP] 1)timestamp:表示一个具体的时间点,后面加上一个时间间隔,表示在这个时间间隔后事件发生。 (2)EVERY子句:用于表示事件在指定时间区间内每隔多长时间发生一次,其中 SELECT子句用于指定开始时间;ENDS子句用于指定结束时间。 (3)interval:表示一个从现在开始的时间,其值由一个数值和单位构成。例如,使用“4 WEEK”表示4周;使用“‘1:10’ HOUR_MINUTE”表示1小时10分钟。间隔的距离用DATE_ADD()函数来支配。
INTERVAL: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
- 示例
-
1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表 USE test; CREATE TABLE aaa (timeline TIMESTAMP); CREATE EVENT e_test_insert ON SCHEDULE EVERY 1 SECOND DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP); 2) 5天后清空test表: CREATE EVENT e_test ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa; 3) 2007年7月20日12点整清空test表: CREATE EVENT e_test ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00' DO TRUNCATE TABLE test.aaa; 4) 每天定时清空test表: CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY DO TRUNCATE TABLE test.aaa; 5) 5天后开启每天定时清空test表: CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa; 6) 每天定时清空test表,5天后停止执行: CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY DO TRUNCATE TABLE test.aaa; 7) 5天后开启每天定时清空test表,一个月后停止执行: CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH DO TRUNCATE TABLE test.aaa; [ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。 8) 每天定时清空test表(只执行一次,任务完成后就终止该事件): CREATE EVENT e_test ON SCHEDULE EVERY 1 DAY ON COMPLETION NOT PRESERVE DO TRUNCATE TABLE test.aaa; [ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。 [COMMENT 'comment']可以给该事件加上注释。
-
-
- `修改事件
-
ALTER EVENT event_name [ON SCHEDULE schedule] [RENAME TO new_event_name] [ON COMPLETION [NOT] PRESERVE] [COMMENT 'comment'] [ENABLE | DISABLE] [DO sql_statement]
- 示例
-
1) 临时关闭事件 ALTER EVENT e_test DISABLE; 2) 开启事件 ALTER EVENT e_test ENABLE; 3) 将每天清空test表改为5天清空一次: ALTER EVENT e_test ON SCHEDULE EVERY 5 DAY;
-
-
- 删除事件
- Drop基本语法
-
DROP EVENT [IF EXISTS] event_name
-
- 示例
-
DROP EVENT e_test; 当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS DROP EVENT IF EXISTS e_test;
-
- Drop基本语法
- 创建事件