cmd登陆MySQL
启动服务:net start mysql
终止服务:net stop mysql
登陆:mysql -h localhost -u root -p(服务器不再本地时将localhost转换为服务器所在的IP地址)
mysql -u root -p(服务器在本地时)
退出:\q exit quit
输入 help / /h 查看帮助文档
一 · 数据库
1.查看所有数据库
show databases;
2.查看某个数据库(可查看数据库的编码格式)
show create databases 数据库名;
show databases like '数据库的模糊名';("_":匹配当前位置的单个字符,例:'de_o';"%":匹配当前位置的多个字符,例:'d%')
3.创建数据库
create dababase 数据库名;
4.修改数据库的编码格式
alter database 数据库名 charset 字符格式;
alter database 数据库名 default character set 编码方式 collate 编码方式_bin;
5.修改数据库编码
#查看表的字符集
show create table 表名;
#修改表的字符集编码
alter table 表名 character set utf8;
#修改字段
alter table 表名 change 列名1 列名2 varchar(50) character set utf8;
6.删除数据库
drop database 数据库名;(删除后可使用 show databases; 或 show create database 已删除的数据库名; 查看,若不显示则表示删除成功)
二· 数据表的新建与增删
一 · 表
1.创建数据表
create table 数据表名(字段名1 数据类型(),字段名2 数据类型(),....,字段名n 数据类型());
create table 数据库名.数据表名(字段名1 数据类型(),字段名2 数据类型(),...,字段名n 数据类型());
2.复制已有表结构
create table 新表名 like (要复制的)表名;(要先选择一个数据库)
create table (新的)数据库名.新的表名 like (要复制的)数据库.数据表名;
3.查看所有数据表(当前数据库)
show tables;
4.模糊匹配数据表
show tables like '数据表名的一部分+%';
show tables like '数据表的一部分+_+数据表的一部分';
5.查看某个数据表的详细信息
desc 数据表名; / describe 数据表名; / show columns from 数据表名;、
注:
执行结果现实的内容解释:
Field:该字段的表名
Type:对应字段的数据类型
Null:对应字段是否可以储存Null值
Key:对应字段是否编制索引和约束
Defult:对应字段是否有默认值
Extra:获取到的与对应的段相关的附加信息
6.查看数据表创建语句
show create table 数据表名;
7.修改数据表名
alter table 旧表名 rename [to]新表名;
8.修改字段名和数据类型
alter table 表名 change 旧字段名 新字段名 新数据类型;
注:修改字段名时必须修改数据类型
9.修改字段的数据类型
alter table 表名 modify 字段名 新数据类型;
10.添加字段
alter table 表名 add 新字段名 数据类型() [first|after 已经存在的字段名](可选);
注:first表示添加在所有字段的最前面,after表示添加在已有的字段是后面(默认选项),after后加已存在的字段名表示添加在字段的后面
11.修改字段的位置
alter table 表名 modify 字段名1 新数据类型 first|after 字段名2;
例:alter table teacher modify workid TINYINT after age; 表示将字段名为workid的字段移动至字段名为age的后面
12.删除字段名
alter table 表名 drop 要删除的字段名;
注:删除后可通过 desc 表名;查看该字段是否存在
13.删除数据表
drop table 要删除的数据表名;
注:删除后可通过show tables;查看该表是否存在
二 · 约束条件
约束条件创建后可通过查看表结构 "desc 表名" 和查询创建语句 "show creatr table 表名" 进行查看
1.非空约束
Ⅰ· 创建表时添加非空约束
create table 表名(字段名1 数据类型 not null,...);
Ⅱ· 为已经存在的表添加非空约束
alter table 表名 modify 字段名 新数据类型 not null;
Ⅲ· 删除非空约束
alter table 表名 modify 字段名 数据类型;
2.默认值 (默认约束)
Ⅰ· 创建表时添加默认值
create table 表名(字段名1 数据类型 default 默认值,...);
Ⅱ· 为以存在的表添加默认值
alter table 表名 modify 字段名 新数据类型 default 默认值;
Ⅲ· 删除默认值
alter table 表名 modify 字段名 数据类型;
3.列描述 (comment | 给开发人员进行维护的注释说明)
Ⅰ· 创建表时添加列描述
create table 表名(字段名1 数据类型 comment 描述字段,...);
Ⅱ· 为已经存在的表添加列描述
alter table 表名 modify 字段名 新数据类型 comment 描述字段;
Ⅲ· 删除非列描述
alter table 表名 modify 字段名 数据类型;
Ⅳ· 查看列描述
通过创建语句查看 show create table 表名;
4.主键 (primary key | 一个数据表中只能存在一个主键)
主键:又称主码,由表中的一个或多个字段组成,能够唯一标示表中的一条记录
主键约束:1.当前字段对应的数据不能为空;
2.当前字段对应的数据不能有任何重复
逐渐的分类:业务主键:主键所在的字段,具有业务意义(学生ID,课程ID)
逻辑主键:自然增长的整型(应用广泛)
A· 单字段主键
Ⅰ· 创建表时指定主键
create table 表名(字段名 数据类型 primary key);
Ⅱ· 为已存在的表添加主键
alter table 表名 modify 字段名 新数据类型 primary key;
Ⅲ· 删除主键
alter table 表名 drop primary key;
B· 复合主键(由多个字段组成)
Ⅰ·创建表时指定复合主键
create trable 表名(字段名1 数据类型,字段名2 数据类型,字段名3 数据类型,...)
primary key(字段名1,字段名2,字段名3,...);
Ⅱ·为已存在的表添加复合主键
alter table 表名 add primary key(字段名1,字段名2,字段名3,...);
Ⅲ·删除复合主键
alter table 表名 drop primary key;
5.自动增长
auto_increment字段的初始值为1,一张表只能有一个字段使用auto_increment字段,且该字段必须为主键
auto_increment所在字段的数据类型可以是任何整数类型(tinyint,smallint,int,bigint)
Ⅰ· 创建表时指定字段值自动增加
create table 表名(字段名 数据类型 primary key auto_increment);
Ⅱ· 为已存在的表设置字段自动增加
alter table 表名 modfiy 字段名 新数据类型 auto_increment;
Ⅲ· 删除字段值的自动增加
alter table 表名 modify 字段名 数据类型;
6.唯一约束
Ⅰ·创建表时添加唯一约束
alter table 表名(字段名1 数据类型 unique,字段名2 数据类型);
Ⅱ· 为已存在的表添加唯一约束
alter table 表名 modify 字段名 新数据类型 unique;
Ⅲ· 删除唯一约束
alter table 表名drop index 字段名;
(字段名指添加有唯一约束的字段)
三·数据表的记录更新
1.记录的插入
Ⅰ· 一条记录
insert [into]表名[(字段名列表)] values ({defult|null|值});
注: 字段名列表可以省略,此时代表向所有的字段插入数据
defult: 某字段的默认值;
null: 某字段插入的值为空值;
值: 在某字段指定一个具有数据值的变量或表达式
向char varchar date类型字段插入数据时,字段值用英文半角的单引号'' 括起来!
例: insert into studentinfo(sno,sname,sgender,sbirth,sclass) values('10101001','张三','男','1993-8-1','数据XXX’);
或: insert into studentinfo values('10101001','张三','男','1993-8-1','数据XXX’);
Ⅱ · 多条记录
insert [into]表名[{字段名列表}] values (值列表),(值列表),...,(值列表);
例: insert into studentinfo values ('10101002','姓名','性别','出生日期','班级'),('10101003','姓名','性别','出生日期','班级');
注 :
- insert 语句成功执行后,可以通过查询语句查看数据是否添加成功;
- 在添加多条记录时,可以不指定字段名列表,只需要保证values语句后面的值是依照字段在表中定义的顺序排列的即可;
- 和添加单挑记录一样,如果不指定字段名,必须为所有字段添加数据,如果指定了字段名,只需为制指定的字段添加数据即可。
2.数据记录的修改
update 表名 set 字段名=value [,...] [where 条件表达式];
注: value: 为指定的字段赋予新值。新值可以是表达式或数据
where 条件表达式: 指定要修改记录的文件,可写可不写。不写将所有记录指定字段的值修改成新的值;写条件则值更改符合条件的记录的字段。
当有多个条件表达式时用 and/& 连接
例:update studentinfo set sclass='计算机';
update studentinfo set sbirth='1999-8-21' where sname='张宇';
3.数据记录的删除
delete [from] 表名 [where 条件表达式];
注: 当有多个条件时可使用 or 连接 (用 and 表示所有条件同时成立)
当没有条件时即删除整张表的所有记录
truncate [table] 表名;
注: 此命令为清空数据
二者的区别:
delete为dml语句,truncate为ddl语句
delete可以跟where子句,可以清除部分符合条件的记录,而truncate只能清空当前表
truncate执行后auto_invrement计数器会重置,delete不会
四·数据查询
select语句的基本语法
select [all|distinct] 要查询的内容
from 表名列表
[where 条件表达式]
[group by 字段名列表 [having 逻辑表达式]]
[order by 字段名[asc|desc]]
[limit [offset,] n];
1.基本查询
select [all|distinct] 要查询的内容
from 表名列名;
-----------------------------------------------------------------------------------------
all:默认值 distinct:除去重复的数据记录
要查询的内容:指定的数据字段名|指定全部字段名时可使用 * 代替
表名列名:可以是一张表也可以是多张表
2.使用where子句
select [all|distinct] 要查询的内容
from 表名列名
where 条件表达式;
-----------------------------------------------------------------------------------------
条件表达式的运算符(见下表)
运算符分类 | 运算符 | 说明 |
---|---|---|
比较运算符 | >,>=,=,<,<=,<>,!=,!>,!< | 比较字段值的大小 |
范围运算符 | between···and、not between···and | 判断字段值是否在指定范围内 |
列表运算符 | in、not in | 判断字段值是否在指定的列表中 |
模式匹配运算符 | like、not like | 判断字段值是否和指定的模式字符串匹配 |
空值判断运算符 | is null、is not null | 判断字段值是否为空 |
逻辑运算符 | and、or、not | 用于多个条件表达式的逻辑连接 |
模式匹配符的使用:
字段名[not] like '模式字符串';
字段名:指要进行匹配的字段,数据类型可以是字符串或日期和时间类型;
模式字符串:可以是一般的字符串,也可以是包含通配符的字符串,通配符的种类见下图
通配符 | 含义 |
---|---|
% | 匹配任意长度(0个或多个)的字符串 |
_ | 匹配任意单个字符串 |
3.使用order by 子句
select [all|distinct] 要查询的内容
from 表名列名
[where 条件表达式]
order by 字段名[asc|desc];
注:Ⅰ·可以规定数据进行升序(使用参数asc)或降序(使用参数desc),默认为asc;
Ⅱ·可以在order by子句中指定多个字段,查询结果首先按照第一个字段值排序,第一个字段相同时使用第二个字段,以此类推;
Ⅲ·order by子句要写在where子句后面。
4.使用group by 子句
select [all|distinct] 要查询的内容
from 表名列名
[where 条件表达式]
group by 字段名列表[having条件表达式];
注:使用 group by子句进行分组统计时,select子句要查询的字段名只能是以下两种情况
Ⅰ·字段集应用了集合函数;
Ⅱ·未应用集合函数的字段必须包含在group by 子句中。
Ⅲ·group by子句常合having子句配合使用。having子句用于对分组后的结果进行条件筛选,having子句只能出现在group by 字句后
where子句和having子句的区别:
a.where子句设置的查询筛选条件在group by子句之前产生作用,并且条件中不能使用集合函数;
b.having子句设置的查询条件筛选条件在group by子句之后发生作用,并且条件中允许使用集合函数
当一个语句中同时出现了where子句,group by 子句和having子句,执行顺序如下:
(1)执行where子句,从数据表中选取满足条件的数据行;
(2)有group by字句对选取的数据进行分组;
(3)执行集合函数;
(4)执行having子句,选区满足条件的分组。
5.limit子句
select [all|distinct] 要查询的内容
from 表名列名
[where 条件表达式]
order by 字段名[asc|desc]
limit [offset,] n;
注:limit字句接受一个或两个整数,其中offset代表从第几行记录开始检索,n代表检索多少行记录,其中offset可以省略不写,默认值为0,代表从第一行开始检索。
6.集合函数
集合函数 | 功能描述 |
---|---|
count([distinct|all]字段|*) | 计算指定字段中值的个数。count(*)满足条件的行数,包括含有空值的行,不能与distinct一起使用 |
sum([distinct|all]字段) | 计算指定字段中的数据总和(此字段为数值类型) |
avg([distinct|all]字段) | 计算指定字段中数据平均值(此字段为数值类型) |
max([distinct|all字段]) | 计算指定字段中数据的最大值 |
min([distinct|all字段]) | 计算指定字段中数据的最小值 |
多表查询
select [表名,] 目标字段表达式[as 别名],...
from 左表名 [as 别名] 连接类型 右表名 [as 别名]
on 连接条件
[where 条件表达式];
1.交叉连接
将两个表的所有行进行组合,连接后的结果集的行数等于两个表的行数乘积,字段个数等于两个表的字段个数和。
select 字段名列表
from 表名1 cross join 表名2;
2.内连接
select 字段名列表
from 表名1 [insert] join 表名2
on 表名1.字段名 比较运算符 表名2.字段名;
内连接包括三种类型:
Ⅰ·等值连接:再连接条件中使用等号(=)比较运算符来比较连接字段的值,其查询结果包含被连接表的所有字段,包含重复字段。在等值连接中,两个表的连接条件通常采用"表1.主键字段=表2.外键字段"的形式。
Ⅱ·非等值连接:在连接条件中使用了除等号之外的比较运算符(>,<,<=,>=,!=)来连接字段值的值。、
Ⅲ·自然连接:与等值连接相同,都是在连接条件中使用比较运算符,但结果集中不包括重复字段
3.外连接
select 字段名列表
from 表名1 left|right join 表名2
on 表名1.字段名 比较运算符 表名2.字段名;
外连接包括3中类型:
Ⅰ·左外连接:即左表为主表,连接关键字为 left join
Ⅱ·右连接:即右表为主表,连接关键字为right join
Ⅲ·全连接:连接关键字为full join
4.自连接
自连接就是一个表的两个副本之间的连接,即同一个表名在from子句中出现了两次,故为了区别,必须对表名指定不同的别名,字段名前也要加上表的别名进行限定。
select s2.sno,s2.sname
from student as s1 join student as s2
on s1.sclass = s2.sclass
where s1.sno = '10000' and s2.sno != '100001';
子查询
1.比较子查询
select 查询内容 from 表1
where 条件 in (select 查询内容 from 表2 where 条件);
2.IN子查询
select 查询内容 from 表1
where 条件 [not] in (select 查询内容 from 表2 where 条件);
批量子查询
1.使用ANY谓词
在子查询前面使用ANY谓词时,会使用指定的比较运算符将一个表达式的值或字段的值与每一个子查询返回值进行比较,只要有一次结果为TRUE,则整个表达式的值为TRUE,否则为FALSE
2.使用ALL谓词
在子查询前面使用ANY谓词时,会使用指定的比较运算符将一个表达式的值或字段的值与每一个子查询返回值进行比较,只有所有结果为TRUE,则整个表达式的值为TRUE,否则为FALSE
3…使用EXISTS谓词
在子查询前面使用ANY谓词时,会使用指定的比较运算符将一个表达式的值或字段的值与每一个子查询返回值进行比较,只要有满足条件的数据行结果为TRUE,则整个表达式的值为TRUE,否则为FALSE
在INSERT、UPDATE、DELETE语句中使用子查询
insert 表1[(字段名列表1)] select 字段名列表2、 from 表2 [where条件表达式]
update 表 set 字段名 = 新值 where条件表达式(子查询)
delete from 表 where条件表达式
合并结果集
(查询语句1) union (查询语句2) (limit条件)
注: 保持字段数量一致 数据类型一致即可
五.储存过程与事务
一 · 变量
系统变量
查看系统所有变量:
show variables;
查看变量的数值:
select @@变量名;
修改系统变量:
1.局部修改:只针对当前自己客户端当次连接有效
语法:set 变量名 = 新值;
2.全局修改:针对所有客户端,"所有时刻" 都有效(全局修改只针对新客户端生效(正在连着的无效))
语法:set global 变量名 = 新值;||set @@global.变量名 = 值;
注意:如果想要本次连接对应的变量修改有效,那么不能使用全局修改,只能使用会话级别修改(set 变量名 = 值);
会话变量:
会话变量也称之为用户变量,会话变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
定义用户变量: set @变量名 = 值;
赋值:set @变量名 := 值;
赋值且查看赋值过程:select @变量1 := 字段1,@变量2 := 字段2 from 数据表 where 条件;
只赋值,不看过程:select 字段1,字段2… from 数据源 where条件 into @变量1,@变量2…
查看变量:select @变量名;
局部变量:
作用范围在begin到end语句块之间。在该语句块里设置的变量,declare语句专门用于定义局部变量
1、 局部变量是使用declare关键字声明
2、 局部变量declare语句出现的位置一定是在begin和end之间(beginend是在大型语句块中使用:函数/存储过程/触发器)
3、 声明语法:declare 变量名 数据类型 [属性];
二 · 流程结构
if语句
1、 用在select查询当中,当做一种条件来进行判断
基本语法:
if(条件,为真结果,为假结果)
2、用在复杂的语句块中(函数/存储过程/触发器)
基本语法:
If 条件表达式 then
满足条件要执行的语句;
End if;
复合语法:
代码的判断存在两面性,两面都有对应的代码执行
基本语法:
If 条件表达式 then
满足条件要执行的语句;
Else
不满足条件要执行的语句;
//如果还有其他分支(细分),可以在里面再使用if
If 条件表达式 then
//满足要执行的语句
End if;
End if;
While循环
循环体都是需要在大型代码块中使用
基本语法:
While 条件 do
要循环执行的代码;
End while;
结构标识符
为某些特定的结构进行命名,然后为的是在某些地方使用名字
基本语法
标识名字:
While 条件 do
循环体
End while [标识名字];
标识符的存在主要是为了循环体中使用循环控制。在mysql中没有continue和break,有自己的关键字替代:
Iterate:迭代,就是以下的代码不执行,重新开始循环(continue)
Leave:离开,整个循环终止(break)
标识名字:
While 条件 do
If 条件判断 then
循环控制;
Iterate/leave 标识名字;
End if;
循环体
End while [标识名字];
三 · 函数
函数分为两类:系统函数(内置函数)和自定义函数
字符串函数:
Char_length():判断字符串的字符数
Length():判断字符串的字节数(与字符集)
Concat():连接字符串
Instr():判断字符在目标字符串中是否存在,存在返回其位置,不存在返回0
Lcase():全部小写
Left():从左侧开始截取,直到指定位置(位置如果超过长度,截取所有)
Ltrim():消除左边对应的空格
Mid():从中间指定位置开始截取,如果不指定截取长度,直接到最后
时间函数
Now():返回当前时间,日期 时间
Curdate():返回当前日期
Curtime():返回当前时间
Datediff():判断两个日期之间的天数差距,参数日期必须使用字符串格式(用引号)
Date_add(日期,interval 时间数字 type):进行时间的增加
Type:day/hour/minute/second
Unix_timestamp():获取时间戳
From_unixtime():将指定时间戳转换成对应的日期时间格式
数学函数
Abs():绝对值
Ceiling():向上取整
Floor():向下取整
Pow():求指数,谁的多少次方
Rand():获取一个随机数(0-1之间)
Round():四舍五入函数
*其他函数
其他函数
Md5():对数据进行md5加密(mysql中的md5与其他任何地方的md5加密出来的内容是完全相同的)
Version():获取版本号
Databse():显示当前所在数据库
UUID():生成一个唯一标识符(自增长):自增长是单表唯一,UUID是整库(数据唯一同时空间唯一)
自定义函数
1、函数内部的每条指令都是一个独立的个体:需要符合语句定义规范:需要语句结束符分号;
2、 函数是一个整体,而且函数是在调用的时候才会被执行,那么当设计函数的时候,意味着整体不能被中断;
3、Mysql一旦见到语句结束符分号,就会自动开始执行
解决方案:在定义函数之前,尝试修改临时的语句结束符
基本语法:
delimiter //($$)
create function 函数名(参数列表) returns 返回值类型
begin
函数体
return 返回值数据;
end
//($$)
delimiter ;
若不能正常输入SQL语句 使用 -\c 回车即可
函数的查看
查看函数:show function status\G | show function status [like ‘pattern’];
查看创建语句: show create function 函数名;
调用
select 函数名(参数列表);
删除
drop function 函数名;
注意:
1、自定义函数是属于用户级别的:只有当前客户端对应的数据库中可以使用
2、可以在不同的数据库下看到对应的函数,但是不可以调用
3、自定义函数:通常是为了将多行代码集合到一起解决一个重复性的问题
4、函数因为必须规范返回值:那么在函数内部不能使用select指令:select一旦执行就会得到一个结果(result set):select 字段 into @变量;(唯一可用)
四 · 储存过程
一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译(效率比较高),用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它
存储过程:简称过程
与函数的区别
相同点
1、 存储过程和函数目的都是为了可重复地执行操作数据库的sql语句的集合。
2、 存储过程函数都是一次编译,后续执行
不同点
1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。
2、函数中有返回值,且必须返回,而过程没有返回值。
3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。
4、函数可以在select语句中直接使用,而过程不能:函数是使用select调用,过程不是。
创建过程
delimiter //($$)
create procedure 过程名字([参数列表])
Begin
过程体
End
//($$)
delimiter ;
查看过程
查看全部存储过程:show procedure status [like ‘pattern’];
show procedure status\G
查看创建语句
show create procedure 过程名;
调用过程
call 过程名([实参列表]);
删除过程
drop prcedure 过程名;
储存过程的形参类型
in:表示参数从外部传入到里面使用(过程内部使用):可以是直接数据也可以是保存数据的变量
out:表示参数是从过程里面把数据保存到变量中,交给外部使用:传入的必须是变量
如果说传入的out变量本身在外部有数据,那么在进入过程之后,第一件事就是被清空,设为NULL
inout:数据可以从外部传入到过程内部使用,同时内部操作之后,又会将数据返还给外部
参数使用级别语法(形参)
过程类型 变量名 数据类型;
五 · 事务
事务系统默认状态: 开启,即自动提交
autocommit = on;
更改事务状态:
set autocommit = off | on;
事务处理语句
启动: start transaction;
提交: commit;
增加回滚点:savepoint 名字;
rollback to 名字;
回滚: rollback;
特性
原子性:要么全部执行,要么全部不执行
一致性:执行前后处于一致状态
隔离性:多个事务并发执行时,各个事务不互相干扰
持久性:事务完成后,数据库中的改变永久保存
六 · 索引
分类
1.普通索引:由key | index 定义的
2.唯一索引: 由unique定义的
3.全文索引:由fulltext定义的
4.空间索引:由spatial定义的
设计原则
1.索引并非越多越好
2.避免对经常更新的表建立过多的索引
3.数据量小的表最好不要使用索引
4.在不同值较少的字段上不要建立索引
5.为经常需要进行排序、分组和连接查询的字段建立索引
创建索引
1.创建表时添加:
create .....
[unique|fulltext|spatital] index |key [别名](字段名(长度) [asc|desc])
2.为以存在的表添加
create [unique]|[fulltext]|[spaitial] index索引名 on 表名(字段名[长度]) [asc|desc][....];
alter table 表名 add [unique]|[fulltext]|[spaitial] index(索引名 [asc|desc])
查看
show index from 表名\G
删除
1.drop index 索引名 on 表名;
2.alter table 表名 drop index 索引名;
七 · 视图
定义
create [or replace] [algorithm = {undefiend|merge|temptable}]
view 视图名[(字段名列表)] as
select 语句
[with [cascaded | local] check option]
查看
desc 视图名;
show table status like '视图名';
查看创建语句
show create view 视图名;
修改视图
create [or replace] [algorithm = {undefiend|merge|temptable}]
view 视图名[(字段名列表)] as
select 语句
[with [cascaded | local] check option]
alter [or replace] [algorithm = {undefiend|merge|temptable}]
view 视图名[(字段名列表)] as
select 语句
[with [cascaded | local] check option]
插入
insert into 视图名 values(内容1,....);
update 视图名 set 更改项 = 值 where条件表达式;
删除
drop view if exists 视图名1,...;
删除视图的数据
delete from 视图名 where条件表达式;
八 · 触发器
**概念:**触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。
作用:
1、可在写入数据表前,强制检验或转换数据。(保证数据安全)
2、触发器发生错误时,异动的结果会被撤销。(如果触发器执行错误,那么前面用户已经执行成功的操作也会被撤销:事务安全)
3、部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
4、可依照特定的情况,替换异动的指令 (INSTEAD OF)。(mysql不支持)
优点:
1、 触发器可通过数据库中的相关表实现级联更改。(如果某张表的数据改变,可以利用触发器来实现其他表的无痕操作[用户不知道])
2、 保证数据安全:进行安全校验
缺点
1、 对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。
2、 造成数据在程序层面不可控。(PHP层)
创建触发器
delimiter //
Create trigger 触发器名字 触发时机 触发事件 on 表 for each row
Begin
sql语句;触发程序
End
//
delimiter ;
触发时机:
before 改变前
after 改变后
触发事件:
Insert:插入操作
Update:更新操作
Delete:删除操作
一张表中,每一个触发时机绑定的触发事件对应的触发器类型只能有一个;一张表中只能有一个对应after insert触发器
因此,一张表中最多的触发器只能有6个:before insert,before update,before delete,after insert,after update,after delete
查看触发器
show triggers\G
查看创建语句
show create trigger 触发器名;
删除触发器
drop trigger 触发器名;
六.数据库的安全 用户
一 · 安全
备份
此命令在cmd窗口中进行
mysqldump -u 用户名 -h 主机地址 -p 备份数据库的名称1 [数据表....],... > 备份文件地址(包含文件名.sql)
恢复
cmd:mysql -u username -p 恢复的数据库名 < 备份文件路径
MySQL内:source 备份的文件地址;
二 · 用户
创建用户:
create user '用户名'@'主机地址(本地:'%')' identified by '密码';
(在mysql库中的user表中添加一条记录);
删除用户:
drop user 用户名;
delete from mysql.user where host = '主机地址' and user = '用户名';
修改用户
用户名:
rename user 旧用户名 to 新用户名;
密码:
1.mysqladmin -u 用户名 -p [-h hostname] 旧密码 newpwd;
2.update mysql.user set Password = password('新密码') where User = '用户名' and Host = '主机名';
3.set password for 用户名 = password('新密码');
用户名的形式: 'user'@'主机名'
用户查询
select * from mysql.user\G
权限管理
查看指定用户的权限信息
show grants for '用户名'@'主机名';
权限授予
grant 权限列表 on 数据库.表名 to '用户名'@'主机名' identified by 'password';
授予整库为 库名.*
注意: 授予多个权限是用逗号隔开
all privileges表示所有权限
授予权限时要么授予整库的权限,如果要授予多张单独的表则需要一张一张的授予
权限收回
revoke 权限列表 on 表或库 from '用户名';
收回所有权限:
revoke all privileges,grant option from '用户名'@'主机地址'