浏览目录
-
视图
-
触发器
-
存储过程
-
函数
-
事务
-
数据库锁
-
数据库备份
-
事件
一、视图
1、视图概念
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据.
2、视图特点
- 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系
- 视图是由基本表(实表)产生的表(虚表)
- 视图的建立和删除不影响基本表
- 对视图内容的更新(添加、删除和修改)直接影响基本表
- 当视图来自多个基本表时,不允许添加,修改和删除数据
3、视图的本质
视图是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用“视图名称”即可获取结果集,可以将该结果集当做表来使用.
4、创建视图
|
1
|
create view 视图名称 as SQL语句;
|
5、使用视图
|
1
|
select * from 视图名称;
|
6、更新视图
|
1
|
alter view 视图名称 AS SQL语句; |
7、删除视图
|
1
|
drop view 视图名称; |
二、触发器
1、触发器概念
监视某种情况,并触发某种操作。
2、触发器创建语法四要素
- 监视地点(table)
- 监视事件(insert/update/delete)
- 触发时间(after/before)
- 触发事件(insert/update/delete)
3、创建语法
|
1
2
3
4
5
6
7
8
|
create trigger triggerName after/before insert/update/delete
on 表名 for each row #这句话是固定的
begin #需要执行的sql语句
end注意1:after/before只能选一个 ,after 表示后置触发, before 表示前置触发
注意2:insert/update/delete只能选一个
特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行 |
4、触发器的使用
触发器无法由用户直接调用,而知由于对表的insert/update/delete操作被动引发的。
5、删除触发器
|
1
|
drop trigger 触发器名称; |
三、存储过程
1、存储过程概念
类似于函数(方法),简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集合,
该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。
2、查看现有的存储过程
|
1
|
show procedure status; |
3、删除存储过程
|
1
|
drop procedure 存储过程名称; |
4、调用存储过程
|
1
|
call 存储过程名称(参数入/出类型 参数名 数据类型);
|
5、创建存储过程
-
封装
|
1
2
3
4
|
create procedure p1 () begin
select * from account;
end
|
-
参数
|
1
2
3
4
5
6
7
8
9
10
11
|
create procedure p2(in i int,out n varchar(50))
begin select name into n from account where id = i;
end-- 调用
set @name =null;
CALL p2(1,@name);
select @name;注意:mysql中有三种出入参数类型,分别为:1、in 入参类型 2、out 出参类型 3、inout 出入参类型
注意:into关键字可以将前面字段的查询结果执行给into后面的变量. |
-
控制
|
1
2
3
4
5
6
7
8
|
create procedure p3(in x int,in c char(1))
begin if c ='d' then
select * from account where money >x;
else
select * from account where money <x;
end if;
end |
-
循环:
例-计算1-100累加的和,并且返回计算结果
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
create procedure p4(inout n int)
begin DECLARE sum int default 0; -- 设置总和变量,并且指定初始值0
declare i int; -- 声明变量
set i = 0; -- 通过set为变量设置值
while i<=n DO -- 开始循环
set sum = sum +i;
set i = i+1;
end while; -- 结束循环
select sum; -- 提供结果
set n = sum;--将计算结果提供给 输出变量 n;
end;-- 调用:
set @n = 100;
call p4(@n);select @n; |
6、存储过程优点
- 存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;
- 减少网络流量,降低了网络负载。存储过程在服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行
- 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译。一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
7、存储过程缺点
- 扩展功能不方便
- 不便于系统后期维护
四、函数
1、MySQL提供的内建函数
1 一、数学函数 2 ROUND(x,y) 3 返回参数x的四舍五入的有y位小数的值 4 5 RAND() 6 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。 7 8 二、聚合函数(常用于GROUP BY从句的SELECT查询中) 9 AVG(col)返回指定列的平均值 10 COUNT(col)返回指定列中非NULL值的个数 11 MIN(col)返回指定列的最小值 12 MAX(col)返回指定列的最大值 13 SUM(col)返回指定列的所有值之和 14 GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果 15 16 三、字符串函数 17 18 CHAR_LENGTH(str) 19 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。 20 CONCAT(str1,str2,...) 21 字符串拼接 22 如有任何一个参数为NULL ,则返回值为 NULL。 23 CONCAT_WS(separator,str1,str2,...) 24 字符串拼接(自定义连接符) 25 CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。 26 27 FORMAT(X,D) 28 将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。 29 例如: 30 SELECT FORMAT(12332.1,4); 结果为: '12,332.1000' 31 32 INSERT(str,pos,len,newstr) 33 在str的指定位置插入字符串 34 pos:要替换位置其实位置 35 len:替换的长度 36 newstr:新字符串 37 例如: 38 SELECT INSERT('abcd',1,2,'tt'); 结果为: 'ttcd' 39 SELECT INSERT('abcd',1,4,'tt'); 结果为: 'tt' 40 特别的: 41 如果pos超过原字符串长度,则返回原字符串 42 如果len超过原字符串长度,则由新字符串完全替换 43 44 INSTR(str,substr) 45 返回字符串 str 中子字符串的第一个出现位置。 46 47 LEFT(str,len) 48 返回字符串str 从开始的len位置的子序列字符。 49 例如: 50 SELECT INSTR('abc','c'); 结果为: 3 51 SELECT INSTR('abc','d'); 结果为: 0 52 53 LOWER(str) 54 变小写 55 56 UPPER(str) 57 变大写 58 59 REVERSE(str) 60 返回字符串 str ,顺序和字符顺序相反。 61 例如: 62 SELECT REVERSE('1234567') 结果为:7654321 63 64 SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len) 65 不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。 66 67 mysql> SELECT SUBSTRING('Quadratically',5); -- 从第5位开始截取 68 -> 'ratically' 69 70 mysql> SELECT SUBSTRING('foobarbar' FROM 4); -- 从第4位开始截取 71 -> 'barbar' 72 73 mysql> SELECT SUBSTRING('Quadratically',5,6); --从第5位开始截取,截取6个长度 74 -> 'ratica' 75 76 mysql> SELECT SUBSTRING('Sakila', -3); -- 从倒数第3位开始截取 77 -> 'ila' 78 79 mysql> SELECT SUBSTRING('Sakila', -5, 3); -- 从倒数第5位开始截取,截取3个长度 80 -> 'aki' 81 82 四、日期和时间函数 83 CURDATE()或CURRENT_DATE() 返回当前的日期 84 CURTIME()或CURRENT_TIME() 返回当前的时间 85 DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7) 86 DAYOFMONTH(date) 返回date是一个月的第几天(1~31) 87 DAYOFYEAR(date) 返回date是一年的第几天(1~366) 88 DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE); 89 FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts 90 HOUR(time) 返回time的小时值(0~23) 91 MINUTE(time) 返回time的分钟值(0~59) 92 MONTH(date) 返回date的月份值(1~12) 93 MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE); 94 NOW() 返回当前的日期和时间 95 QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE); 96 WEEK(date) 返回日期date为一年中第几周(0~53) 97 YEAR(date) 返回日期date的年份(1000~9999) 98 99 重点: 100 DATE_FORMAT(date,format) 根据format字符串格式化date值 101 102 mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); 103 -> 'Sunday October 2009' 104 mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); 105 -> '22:23:00' 106 mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', 107 -> '%D %y %a %d %m %b %j'); 108 -> '4th 00 Thu 04 10 Oct 277' 109 mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', 110 -> '%H %k %I %r %T %S %w'); 111 -> '22 22 10 10:23:00 PM 22:23:00 00 6' 112 mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); 113 -> '1998 52' 114 mysql> SELECT DATE_FORMAT('2006-06-00', '%d'); 115 -> '00' 116 117 五、加密函数 118 MD5() 119 计算字符串str的MD5校验和 120 例如: 121 SELECT MD5('1234') 结果为:81dc9bdb52d04dc20036dbd8313ed055 122 PASSWORD(str) 123 返回字符串str的加密版本,这个加密过程是不可逆转的 124 例如: 125 SELECT PASSWORD('1234') 结果为:*A4B6157319038724E3560894F7F932C8886EBFCF 126 127 六、控制流函数 128 CASE WHEN[test1] THEN [result1]...ELSE [default] END 129 如果testN是真,则返回resultN,否则返回default 130 CASE [test] WHEN[val1] THEN [result]...ELSE [default]END 131 如果test和valN相等,则返回resultN,否则返回default 132 133 IF(test,t,f) 134 如果test是真,返回t;否则返回f 135 136 IFNULL(arg1,arg2) 137 如果arg1不是空,返回arg1,否则返回arg2 138 例如: 139 SELECT IFNULL('bbb','abc'); 结果为: bbb 140 SELECT IFNULL(null,'abc'); 结果为: abc 141 142 NULLIF(arg1,arg2) 143 如果arg1=arg2返回NULL;否则返回arg1 144 例如: 145 SELECT NULLIF('bbb','bbb');结果为: null 146 SELECT NULLIF('aaa','bbb');结果为: aaa
2、自定义函数