数据库:DataBase,是存储和管理数据的仓库
启动连接类命令
启动mysql服务:net start mysql
停止mysql服务:net stop mysql
修改默认账户密码:mysqladmin -u root password 123456
这里的123456就是默认管理员(root用户)的密码
登录mysql:mysql -uroot -p123456
登录用户为root,密码为123456
SQL语句以分号结束
SQL语句的分类:
分类 | 全称 | 说明 |
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库、表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
DDL(数据定义语言):
1.查询数据库:show databases;
查看创建数据库语句:show create database 数据库名称;
2.创建数据库:create database [if not exists] mydb [库选项];
创建一个名为mydb的数据库
[库选项]:
- 字符集:charset
- 校对集:collate
pl:create database if not exists db01 charset=utf8;
3.使用数据库:use 数据库名称;
4.查看当前正在操作的数据库:select database();
5.删除数据库:drop database [if exists] 数据库名称;
6.修改数据库:alter database 数据库名字 charset = 字符集;
7.创建表结构:create table 表名(字段1 字段类型 [约束] 字段1注释,字段2... ) [表选项] [comment 表注释];
表选项:
- engine:存储引擎,mysql提供的具体存储数据的方式innodb
- charset:字符集
- collate:校对集
约束:作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确性、有效性和完整性
约束 | 描述 | 关键字 |
非空约束 | 限制该字段值不能为null | not null |
唯一约束 | 保证字段的所有数据都是唯一、不重复的 | unique |
主键约束 | 主键是一行数据的唯一标识,要求非控股且唯一 | primary key |
默认约束 | 保存数据时,如果未指定该字段值,则采用默认值 | default |
外键约束 | 让两张表的数据建立连接,保证数据的一致性和完整性 | foreign key |
数据类型:
类型 | 说明及种类 |
整型 | tinyint,smallint,mediumint,int,bigint |
浮点型 | float,double,decimal(M,D) |
日期与时间类型 | year,date,time,datetime,timestamp |
字符串 | char,varchar(length),text,enum |
二进制类型 | binary,varbinary,blob,set,bit |
8.复制已有表结构:create table 表名1 like 表名2;
9.显示数据表:show tables;
或show tables like "匹配模式";
10.显示表结构:显示表中所包含的字段信息describe 表名;
或desc 表名;
或show colomns from 表名;
11.显示表创建语句:查看创建数据表时的语句show create table 表名;
12.设置表属性:engine、charset、collatealter table 表名 表选项 值
pl:alter table users charset utf8;
13.修改表结构:
修改表名:rename table 旧表名 to 新表名;
新增字段:alter table 表名 add [column] 新字段名 字段类型 [first/after 字段名];
pl:alter table student add address varchar(100) after name;
修改字段名:alter table 表名 change 旧字段名 新字段名 字段类型 [列属性] 新位置;
pl:alter table student change stu_age age int after name;
修改字段类型:alter table 表名 modify 字段名 新类型 [新属性] [新位置];
pl:alter table student modify name varchar(100) before age;
删除字段:alter table 表名 drop 字段名;
14.删除表结构:drop table 表名1,表名2...;
数据库基础操作
插入数据:insert into 表名 values(字段1,字段2...),(字段1,字段2...);
pl:insert into student values('tom',22),('jack',23);
查询操作:
查询表中全部数据:select * from 表名;
查询表中部分字段:select 字段列表 from 表名;
简单条件查询数据:select 字段列表/* from 表名 where 字段名=值;
删除操作:delete from 表名 where 字段名=值;
修改操作:update 表名 set 字段名 = 值 where 字段名 = 旧值;
数据类型
1.整型:tinyint,int
zerofill:从左侧开始填充0(左侧不会改变数值大小),负数的时候不能使用zerofillalter table student add id tinyint zerofill first;
2.浮点型:float,decimal
float(M,D) :表示一共存储M个有效数字,其中小数部分占D位
3.日期时间类型
Date:日期类型,YYYY-mm-dd 从1000-01-01到9999-12-12
time:时间类型,能够表示某个指定的时间,对应格式为:HH:ii:ss
datetime:日期时间类型,格式为YYYY-mm-dd HH:ii:ss
timestamp:时间戳类型,mysql中的时间戳只是表示从格林威治时间开始,但其格式仍是YYYY-mm-dd HH:ii:ss
Year:年类型,能表示1900~2155
4.字符串类型:char,varchar,text,enum
text:文本类型,本质上mysql提供了两种文本类型
- Text:存储普通的字符文本
- Blob:存储二进制文本,一般都不会使用blob来存储文件本身,通常是用一个链接来指向对应的文件本身
tinytext:系统用一个字节来保存
text:使用两个字节
mediumtext:使用3个字节保存
longtext:使用4个字节
Enum枚举类型:在数据插入前,先设定几个项,这几个项就是可能最终出现的数据结果。如果确定某个字段的数据只有那么几个值,如性别:男,女,保密。系统就可以在设定字段的时候规定当前字段只能存放固定的几个值,一般用在单选框对应的值。
基本语法:enum(数据值1,数据值2…)
Set集合:是一种将多个数据选项可以同时保存的类型,本质是将指定的项按照对应的二进制位来进行控制:1表示该选项被选中,0表示该选项没有被选中
基本语法:set(值1,值2…)
系统为set提供了多个字节进行保存,但是系统会自动计算来选择存储单元
pl:create table my_hobby(id int primarykey,hobby set('篮球','足球','排球')) charset utf8;
insert into my_hobby values(1,('篮球,足球'));
列属性
字段属性:
在mysql中一共有6个属性:null,默认值,列描述,唯一键和自动增长
null:在设计表的时候,尽量不要让数据为空
默认值:default:当字段被设计的时候,如果允许默认条件下用户不进行数据的插入,那么就可以使用实现准备好的数据来填充:通常填充的是null
列描述:comment,是专门用于给开发人员进行维护的一个注释说明
基本语法:comment “字段描述”
主键:primary key,在一张表中,有且只有一个字段,里面的值具有唯一性主键一定不为空。
创建主键:
- 随表创建:
1.直接在需要作为主键的字段后面添加primary key即可
2.在所有字段后面增加一个primary key选项:primary key(字段信息)
pl1:create table mytable(id int primary key,name varchar(100),age int);
pl2:create table mytable(id int,name varchar(100),age int,primary key(id));
- 创建之后添加主键:
alter table 表名 add primary key(字段名);
查看主键:desc 表名;
或 show create table 表名;
删除主键:alter table 表名 drop primary key;
复合主键:create table my_score(stu_id int,course_id int,score tinyint not null,primary key(stu_id,course_id));
其主键由stu_id和course_id复合而成
主键一旦增加,那么对应的字段有数据要求
- 当前字段对应的数据不能为空
- 当前字段对应数据不能有任何重复
自动增长
auto_increment,当给定某个字段该属性之后,该列的数据在没有提供确定数据的时候,系统会根据之前已经存在的数据进行自动增加后,填充数据
通常自动增长用于逻辑主键,自动增长只适用于数值
使用自动增长:基本语法:在字段之后增加一个属性auto_increment
pl:create table mytable(id int primary key auto_increment...);
修改自动增长:alter table 表名 auto_increment = 值;
删除自增长:就是在修改字段之后不再保留auto_incrementalter table 表名 modify id int;
添加自动增长:alter table 表名 modify 字段 int auto_increment;
初始设置,在系统中,有一组变量用来维护自增长的初始值和步长show variables like 'auto_increment%';
唯一键:unique key,用来保证对应的字段中的数据唯一的。主键也可以用来保证字段数据唯一性,但一张表中只有一个主键,唯一键一张表中可以有多个,允许字段数据出现多个null
创建唯一键:
- 直接在表字段之后增加唯一键标识符:unique
- 在所有的字段之后,使用unique key(字段列表);
- 在创建完表之后也可以增加唯一键
alter table 表名 add unique key(字段列表);
删除唯一键:alter table 表名 drop index 唯一键名字;
复合唯一键:唯一键和主键一样可以使用多个字段来共同保证唯一性
一般主键都是单一字段(逻辑主键)而其他需要唯一性的内容都是由唯一键来处理
外键:foreign key,一张表中有一个字段,保存的值指向另一张表(主表)的主键
增加外键:
- 在创建表时增加外键
基本语法:[constraint ~外键名~] foreign key(外键字段) references 主表(主键);
- 创建表后增加外键
alter table 从表 add [constraint ~外键名~] foreign key(外键字段) references 主表(主键);
修改、删除外键:外键不允许修改,只能先删除后增加
基本语法:alter table 从表 drop foreign key 外键名字;
外键基本要求:
- 外键字段需要保证与关联的主表的主键字段类型完全一致
- 基本属性也要相同
- 如果是在表后增加外键,对数据还有一定的要求(从表数据与主表的关联关系),外键只能使用innodb存储引擎
外键约束:通过建立外键关系之后,对主表和从表都会有一定的约束效率
- 当一个外键产生时,外键所在的表(从表)会受制于主表数据的存在从而导致数据不能进行某些不符合规范的操作(不能插入主表不存在的数据)
- 如果一张表被其他表外键引入,那么该表的数据插入就不能随意:必须保证从表数据的有效性(不能随便删除一个被从表引入的记录)
基本语法:alter table 表名 add foreign key(外键字段) reference 主表(主键) on 约束模式;
约束模式有三种:
- distinct:严格模式,默认的,不允许操作
- cascade:级联模式,一起操作,主表变化,从表数据也变化
- set null:置空模式,主表变化(删除),从表对应记录设置为空(外键字段允许为空)
外键约束主要约束的对象是主表操作:从表就是不能插入主表不存在的数据
通常在进行约束的时候,需要指定操作:update和delete
常用的约束模式:on update cascade(更新级联),on delete set null(删除置空)
索引:
创建索引:create index 索引名 on 表名 (索引字段名...) ;
查看索引:show index from 表名;
删除索引:drop index 索引名 from 表名;
表关系
一对一:一张表中的一条记录与另外一张表中最多有一条明确的关系,通常此设计方案保证两张表中使用同样的主键即可
一对多:通常也叫多对一的关系,通常一对多的关系设计的方案,在多关系的表中去维护一个字段,这个字段是“一”表关系的主键
多对多:一张表中的一条记录在另一张表中可以匹配到多条记录,反过来也一样。多对多的关系如果按照多对一的关系维护,就会出现一个字段有多个其他表的主键,在访问的时候就会带来不便,通过第三张表来解决。
DML(数据操作语言)
新增数据:
多数据插入:只要写一次insert指令,但是可以直接插入多条记录
基本语法:insert into 表名 (字段列表) values(值列表1),(值列表2);
主键冲突:在有的表中,使用的是业务主键(字段有业务含义),但是往往在进行数据插入的时候又不确定数据表中是否已经存在对应的主键
主键冲突解决方案:
- 主键冲突更新:类似插入数据语法,如果插入的过程中主键冲突,那么采用更新语法
insert into 表名 vaslues(值列表) on duplicate key update 字段 = 新值;
- 主键冲突替换:主键冲突之后,删掉原来的数据,重新插入进去
replace into 表名 values(值列表);
蠕虫复制:一分为二,成倍的增加。从已有的数据中获取数据,并且及那个获取到的数据插入到数据表中
基本语法:insert into 表名 select */字段列表 from 表名;
注意:蠕虫复制的通常是重复数据,没有太大业务意义,可以在短期内快速增加表的数据量,从而可以测试表的压力,还可以通过大量数据来测试表的效率,但要注意主键冲突
更新数据
1.在更新数据的时候,特别要注意,通常一定是要跟随条件更新update 表名 set 字段名=新值 where 判断条件;
如果没有条件,是全表更新数据,但是可以用limit来限制更新的数量update 表名 set 字段名=新值 [where 判断条件] limit 数量;
删除数据
1.删除数据的时候尽量不要全部删除,应该使用where进行判定
2.删除数据的时候可以使用limit限制删除的数量
delete删除数据的时候无法重置auto_increment
mysql中有一个能够重置表选项中的自增长的方法:truncate 表名;
等价于 drop---->create
DQL(数据查询语言)
查询数据:
完整的查询指令:select select选项 字段列表 from 数据源 where 条件 group by having 条件 order by 排序方式 limit 限制;
1.查询选项
1.select选项:系统该如何对待查询得到的结果
all:默认的,表示保存所有的记录
distinct:去重,去除重复的记录,只保留一条(所有的字段都相同)
pl:select all * from user;
select distinct * from user;
2.字段列表:有的时候需要从多张表获取数据,在获取数据的时候,可能存在不同表中有同名的字段,需要将同名的字段命名成不同名的
别名:alias
基本语法:字段名 [as] 别名
pl:select distinct name as name1 ,name name2 from user;
3.数据源:from是为前面的查询提供数据,数据源只要是一个符合二维表结构的数据即可
单表数据:from 表名
多表数据:from 表1,表2…
结果是几张表的记录数相乘,字段数拼接(笛卡尔集)没有其他意义
动态数据:from后的不是一个实体表,而是一个从表中查询出来得到的二维结果表(子查询);
基本语法:from (select 字段列表 from 表) as 别名
4.where子句:用来从数据表获取数据的时候,然后进行筛选
数据获取原理:针对表去对应的磁盘处获取所有的记录(一条条)
where 的作用就是在拿到一条结果就开始进行判断,判断是否符合条件,如果符合就保存下来,否则直接舍弃
5.group by子句:根据指定的字段,将数据进行分组:分组的目的是为了统计
分组统计:基本语法:group by 字段名;
group by是为了分组后进行数据统计的,如果只是想看数据显示,那么group by没有任何含义;group by将数据按照指定的字段分组之后,只会保留每组的第一条记录
聚合函数 | 说明 |
count() | 统计每组的数量,如果统计目标是字段,那么不统计为空NULL字段,如果为*,那么代表统计记录 |
avg() | 求平均值 |
sum() | 求和 |
max() | 求最大值 |
min() | 求最小值 |
group_concat() | 将分组中指定的字段进行合并 |
pl:select class_id,count(*),max(stu_age),min(stu_height),avg(stu_age) from students group by class;
多分组:将数据按照某个字段进行分组之后,对已经分组的数据进行再次分组
基本语法:group by 字段1,字段2 先按照字段1进行排序,之后将结果再按照字段2进行排序
分组排序:mysql中分组默认有排序的功能:按照分组字段进行排序,默认是升序
基本语法:group by 字段1 [asc/desc],字段2[asc/desc]…;
回溯统计:当分组进行多分组之后,往上统计的过程中,需要进行层层上报,将这种层层上报统计的过程称为回溯统计,每一次分组向上统计的过程都会产生一次新的统计数据,而且当前数据对应的分组字段为NULL
基本语法:group by 字段[asc/desc] with rollup;
pl:select class_id,count(*) from student group by class_id with rollup;
6.having子句:和where一样,用来进行数据筛选
having是在group by子句之后,可以针对分组数据进行统计筛选,但是where不行,where不能使用聚合函数select name,count(*) as count from user group by name having count>=2;
查询名字相同人数在2个以上的名字
7.order by子句:排序,根据校对规则对数据进行排序
基本语法:order by字段[asc/desc];
order by也可以进行多字段排序:先按照第一个字段进行排序,然后再按照第二个字段进行排序
order by 字段1 [asc/desc],字段2 [asc/desc]…;
8.limit子句:用来限制记录数量获取
通常在查询的时候,如果限定为一条记录的时候,使用的比较多:有时候获取多条记录并不能解决业务问题,但是会增加服务器的压力
分页:利用limit来限制获取指定区间的数据
基本语法:limit offset,length
offset:偏移量
length:具体的获取多少条记录
mysql中记录的数量从0开始
limit 0,2 表示获取前2条数据
2.查询运算符
算术运算符:+,-,*,/,%,基本算术运算,通常不在条件中使用,而是用于结果运算(select 字段中)
比较运算符:>,>=,<,<=,=,<>,通常是用来在条件中进行限定结果,<=>用在语句中判断相等
在mysql中,没有bool值,1代表true,0代表false
在条件判断中,还有相应的比较运算符:
计算区间:between 条件1 and 条件2
逻辑运算符:and(逻辑与),or(逻辑或),not(逻辑非)
in运算符:在…里面,用来替代=,当结果不是一个值而是一个结果集的时候,基本语法:in(结果1,结果2…),只要当前条件在结果集中出现过,那么就成立
is运算符:专门判断字段是否为NULL的运算符
基本语法:is null 或 is not null
like运算符:用来进行模糊匹配的
基本语法:like ‘匹配模式’
匹配模式中有两种占位符:%:匹配多个字符,_:匹配对应位置单个字符
3.联合查询
可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用union或union all,将多个查询的结果合并到一起(纵向合并):字段数不变,多个查询的记录数合并。
应用场景:
- 将同一张表中不同的结果合并到一起展示数据
- 最常见:在数据量大的情况下,会对表进行分表操作,需要对每张表进行部分数据统计,使用联合查询来将数据存放到一起显示
pl:QQ1表获取在线数据,QQ2表获取在线数据=>将所有在线数据显示
基本语法:select 语句 union [union选项] select 语句;
[union选项]:distinct,all
order by的使用:
- 在联合查询中,如果要使用order by,那么对应的select语句必须用括号括起来
- order by在联合查询若要生效,必须配合使用limit,而limit后面必须跟对应的限制数量(通常可以使用一个较大的值,大于对应表的记录数)
4.连接查询
将多张表连到一起进行查询(会导致记录数行和字段数列发生改变)
意义:在关系型数据库设计过程中,实体(表)与实体之间是存在很多联系的。一般遵循:一对一,一对多,多对多,通常在实际操作的过程中,需要利用这层关系来保证数据的完整性
4.1 交叉连接:cross join
将一张表的数据与另外一张表彼此交叉
基本语法:表1 cross join 表2
pl:select * from 表1 cross join 表2;
本质与 from 表1, 表2; 相似
4.2 内连接:inner join
从一张表中取出所有的记录区另一张表中匹配:利用匹配条件进行匹配,成功了则保留,失败了则放弃
语法:表1 [inner] join 表2 on 匹配条件
pl:`select * from student inner join class on class_id = id;
因为表的设计通常容易产生同名字段,尤其是id,通常使用表名.字段名,来确保其唯一性
通常,如果条件中使用到对应的表名,而表名通常比较长,所以可以通过别名来简化
应用:内连接通常是在对数据有精确要求的地方使用:必须保证两种表中都能进行数据匹配
4.3 外连接:outer join
按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据
外连接分为:左外连接(left join),右外连接(right join)
左连接:左表是主表,右连接:右表是主表
基本语法:
左连接:主表 left join 从表 on 连接条件;
右连接:从表 right join 主表 on 连接条件;
pl:select * from student left join class on class.id = student.class_id;
应用:非常常用的一种获取数据的方式:作为数据获取对应主表以及其他数据
4.4 using关键字
是在连接查询中用来替代对应的on关键字的,进行条件匹配
原理:
1.在连接查询时,使用on的地方用using替代
2.使用using的前提是对应的两张表连接的字段是同名(类似自然连接自动匹配)
3.如果使用using关键字,那么对应的同名字段最终在结果集中只会保留一个
语法:表1 inner/left/right jion 表2 using(同名字段列表);
5.子查询:sub query
当一个查询是另一个查询的条件时,称之为子查询
在一条select语句中,嵌入了另外一条select语句,那么被嵌入的select语句称之为子查询语句
主查询:主要的查询对象,第一条select语句,确定了用户所要获取的数据目标,以及要具体得到的字段信息
标量子查询:子查询得到结果是一个数据(一行一列)
语法:select * from 数据源 where 条件判断 =/<> (select 字段名 from 数据源 where 条件判断);
例如:知道一个学生的名字:张三,想知道他在哪个班级
1.通过学生表获取他所在班级id
2.通过班级id获取班级名字
实现:select * from class where class.id = (select class_id from student where stu_name='张三');
列子查询:子查询得到的结果是一列数据(一列多行)
基本语法:主查询 where 条件 in (列子查询)
例如:想获取已经有学生在班的所有班级名字
1.找出学生表中所有班级的id
2.找出班级表中对应的名字select name from class where class_id in (select class_id from student);
行子查询:子查询返回的结果是一行多列
基本语法:主查询 where 条件 = (行子查询)
例如:获取班级上年龄最大,且身高最高的学生
1.求出班级年龄最大的值
2.求出班级身高最高值
3.求出对应的学生select * from student where (stu_age,stu_height)=(select max(stu_age),max(stu_height) from student);
表子查询:子查询返回的结果是多行多列,与行子查询非常相似
行子查询是用于where条件判断:where条件判断
表子查询适用于from 数据源:from 子查询
基本语法:select 字段列表 from (表子查询 [where] [group by]...);
例如:获取每个班身高最高的学生(一个)select * from ( select * from student order by stu_height desc) group by class_id;
Exist子查询:查询返回的结果只有0或1,1代表成立,0代表不成立
基本语法:where exists(查询语句); // exists就是根据查询得到的结果进行判断:如果已经存在返回1,否则返回0
例如:求出有学生在的所有班级select * from class as c where exists(select stu_id from student as s where s.class_id =c.class_id);
特定关键字
in:主查询 where 条件 in (列子查询);
any:任意一个
语法 = any(列子查询):条件在对应的查询结果中有任意一个匹配即可等价于in
some:与any完全一样
1=any(1,2,3) // 返回true
1<>any(1,2,3) // 返回true
all:
语法: = all(列子查询):等于里边所有
<>all(列子查询):不等于其中所有
数据库备份与还原
数据备份:
也叫sql数据备份,备份的结果都是sql指令
在mysql中提供了一个专门用于备份sql的客户端:mysqldump.exe
sql备份不只是备份数据,还备份对应的sql指令(表结构):即使数据库被删,利用sql备份依然可以实现数据还原
sql备份因为需要备份结构,因此产生的备份文件特别大,因此不适合特大型数据备份,也不适合数据交换频繁型数据库备份
应用方案:sql备份用的的是专门的客户端,因此还没与数据库服务器连接
基本语法:mysqldump/mysqldump.exe -hPub 数据库名字 [表1,表2...] > 备份文件地址;
三种备份方式:
- 整库备份:只需要提供数据库名字
- 单表备份:数据库名字跟一张表
- 多表备份:数据库名字后跟多张表
pl:mysqldump.exe -hlocalhost -P3306 -uroot -p123456 db02 > C:/server/temp/mydatabase.sql
数据还原:
1.利用mysql.exe客户端:没有登录之前可以直接使用该客户端进行数据还原mysql.exe -hPub 数据库<文件位置
2.在sql指令,提供了一种导入sql指令的方式source sql 文件位置;
// 必须先进入到指定数据库
DCL(数据控制语言)
用户权限管理:在不同的项目中给不同的角色(开发者)不同的操作权限,用来保证数据库数据的安全
用户管理:mysql需要客户端进行连接认证才能进行服务器操作,需要用户信息。mysql中所有的用户信息都是保存在mysql数据库下的user表中
安装mysql时,默认有一个root用户,在mysql中,对应的用户管理是由对应的Host和User共同组成主键来区分用户
User:代表用户的用户名
Host:代表本质是允许访问的客户端(IP或者主机地址)。如果host使用*,代表所有用户都可以访问
创建用户:
- 直接使用root用户在mysql.user表中插入记录(不推荐)
- 专门创建用户的sql指令
基本语法:create user 用户名 identified by '明文密码';
1.用户:用户名@主机地址
2.主机地址:‘’/‘%’
pl:create user 'user1'@'%' identified by '123456';
删除用户:mysql中user是带着host本身的(具有唯一性)
基本语法:drop user 用户名@host;
修改用户密码:
mysql中提供了多种修改密码的方式,基本上都必须使用对应提供的一个系统函数:password() ,需要靠该函数对密码进行加密处理
- 使用专门的修改密码的指令
基本语法:set password for 用户 = password('新密码');
- 使用更新语句update来修改表
基本语法:update mysql.user set password = password('新密码') where user = ' ' and host = ' ';
用户权限管理:
在mysql中将权限管理分为三类:
- 数据权限:增删改查
- 结构操作:create/drop
- 管理权限:权限管理(create user/ grant)
grant:授予权限,将权限分配给指定的用户
基本语法:grant 权限列表 on [数据库/*].[表名 /*] to 用户;
pl:grant select on mydb.student to 'user1'@'%';
取消权限:revoke,将权限从用户手中收回
基本语法:revoke 权限列表/all privileges on 数据库/*.表名/* from 用户;
pl:revoke all privileges on database_name.* FROM 'user_name'@'host';
撤销用户对某个数据库的全部权限
刷新权限:flush privileges;
视图基本操作
视图本质是sql指令
创建视图:
基本语法:create view 视图名字 as select 指令;
可以是单表数据,也可以是连接查询,联合查询或子查询
使用视图:视图是一种虚拟表,可以直接当成表使用,主要用于查询操作
基本语法:select * from 视图名字 [子句];
修改视图:本质是修改视图对应的查询语句
基本语法:alter view 视图名字 as 新select指令;
删除视图:drop view 视图名字;
事务:事务是访问并可能更新数据库中各种数据项的一个程序执行单元。
事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成
事务基本原理:mysql允许将事务统一进行管理,存储引擎(innodb)将用户所做的操作暂时保存起来,不直接放到数据表等到用于确认结果之后,再进行操作
自动事务:autocommit,当客户端发送一条sql指令(写操作:增删改)给服务器的时候,服务器在执行后,不用等待用户反馈结果,会自动将结果同步到数据表
一旦自动事务关闭,那么需要用户提供是否同步的命令
commit:提交(同步到数据表)
rollback:回滚(清空之前的操作)
手动事务:不管是开始还是过程还是结束都需要用户手动的发送事务操作指令来实现
开启事务:start transaction;
执行事务:将多个连续的但是是一个整体的sql指令,逐一执行
提交事务:commit/rollback
回滚点:savepoint,当有一系列事务操作时,而其中的步骤如果成功了,没有必要重新来过,可以在某个点(成功),设置一个记号(回滚点),然后如果后面有失败,那么可以回到这个记号位置
增加回滚点:savepoint 回滚点名字; //字母,数字
回到回滚点:rollback to 回滚点名字;
变量:mysql中很多的属性控制都是通过mysql中固有的变量来实现
系统变量:系统变量针对所有用户(mysql客户端)有效
查看系统变量:show variables [like 'pattern'];
mysql允许使用select查询变量的数据值(系统变量)
基本语法:select @@ 变量名;
修改系统变量:分为两种修改方式
- 局部修改:只针对当前自己客户端当次连接有效
基本语法:set 变量名=新值;
- 全局修改:针对所有的客户端,”所有时刻“都有效
基本语法:set global 变量名=值;
或set @@global.变量名=值;
全局修改之后:所有连接的客户端并没有发现改变,全局修改只针对新客户端(正在连接着的无效)
会话变量:也称为用户变量
定义用户变量:set @变量名 = 值;
在mysql中因为没有==号,所以使用=代替比较符号:有时候在赋值的时候会报错,mysql为了避免系统分不清是赋值还是比较,增加了一个变量的赋值符号 :=
set @变量命 := 值;
允许将数据从表中取出存储到变量中:查询得到的数据必须只能是一行数据:mysql没有数组
1.赋值且查看赋值过程:select @变量1:= 字段1,@变量2:=字段2 ... from 数据表 where 条件;
2.只赋值,不看过程:select 字段1,字段2... from 数据源 where 条件 into @变量1,@变量2...;
查看变量:select @变量名;
局部变量:作用在begin和end语句之间,在该语句块里设置的变量,declare语句专门用于定义局部变量
1.局部变量是使用declare关键字声明
2.declare语句出现的位置一定是在begin和end之间
3.声明语法:declare 变量名 数据类型 [属性];
流程控制:
if 分支:
基本语法:
- 用在select查询当中,当作一种条件进行判断
if(条件,条件为真结果,条件为假结果)
pl:select * if(stu_age >18,'成年','未成年') as judge from student;
- 用在复杂的语句块中(函数,存储过程,触发器)
if 条件表达式 then
满足条件要执行的语句;
end if;
复合语法:
if 条件表达式 then
满足条件要执行的语句
else
不满足条件要执行的语句
end if;
while循环:
基本语法:
while 条件 do
要循环执行的代码;
end while;
结构标识符:为某些特定的结构进行命名,然后为的是在某些地方使用名字
基本语法:
标识名字:while 条件 do
循环体
end while
标识符存在主要是为了循环体中使用循环控制,mysql有自己的关键字替代
iterate:迭代,就是下面的代码不执行,重新开始循环,类似continue
leave:离开,整个循环终止(break)
函数:mysql中,函数分为两类,系统函数和自定义函数
不管是内置函数还是自定义函数,都是使用select 函数名(参数列表);
内置函数:
函数名 | 功能说明 |
char_length() | 判断字符串 |
length() | 判断字符串的字节数(与字符集有关) |
concat() | 连接字符串 |
instr() | 判断字符在目标字符串中是否存在,存在返回其位置,不存在返回0 |
Lcase() | 全部小写 |
Left() | 从左侧开始截取字符串,到指定位置 |
Ltrim() | 消除左边对应的空格 |
mid() | 从中间指定位置开始截取,如果不指定截取长度,直接到最后 |
时间函数
函数名 | 功能说明 |
now() | 返回当前时间和日期 |
curdate() | 返回当前日期 |
curtime() | 返回当前时间 |
datediff() | 判断两个日期之间的天数差距,参数日期必须使用字符串格式(用引号) |
date_add(日期 interval 时间数字 type) | 进行时间的叠加 |
unix_timestamp() | 获取时间戳 |
from_unixtime() | 将指定的时间戳转换成对应的日期时间格式 |
数学函数
函数名 | 说明 |
abs() | 绝对值 |
ceiling() | 向上取整 |
floor() | 向下取整 |
pow() | 求指数 |
rand() | 获取一个伪随机数(0~1之间) |
round() | 四舍五入整数 |
其他函数
函数名 | 说明 |
md5() | 对数据进行md5加密 |
version() | 获取版本号 |
database() | 显示当前所在数据库 |
uuid() | 生成一个唯一标识符,自增长是单表唯一,uuid是整库唯一 |
自定义函数:
delimiter 符号,使用该符号作为结束符
创建函数:包含几个要素:function关键字,函数名,函数体,参数确认函数返回值类型,函数值,返回值
基本语法:
create function 函数名(形参) returns 返回值类型
begin
//函数体
return 返回值数据;
end
语句结束符
并不是所有的函数都需要begin和end:如果函数体本身只有一条指令,那么可以省略begin和end
查看函数:可以通过查看function状态,查看所有的函数show function status [like 'pattern'];
调用函数:select 函数名(实参列表);
删除函数:drop function 函数名;
1.自定义函数属于用户级别,只有当前客户端对应的数据库中使用
2.可以在不同的数据库下看到对应的函数,但是不可以调用
存储过程:在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字,并给出参数来执行
创建存储过程:
create procedure 过程名字(参数)
begin
过程体
end
结束符
查看过程:show procedure status [like pattern];
show create procedure 过程名字;
调用过程:call 过程名(参数);
删除过程:drop procedure 过程名字;
存储过程的形参类型:存储的参数需要指定其类型
存储过程对参数还有额外的要求:自己的参数分类:
In:参数从外部传入里面使用可以是数据,也可以是变量
Out:参数从过程里面把数据保存到变量中,交给外部使用过,传入的必须是变量
inout:数据可以从外部传入到过程内部使用,同时内部操作之后,又会将数据返还给外部
基本使用:过程类型 变量名 数据类型;
触发器:一种特殊类型的存储过程,主要通过事件进行触发而执行
作用:
1.可在数据表前,强制检验或转换数据
2.触发器发生错误时,异动的结果会被撤销
3.部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器
优点:触发器可通过数据库中的相关表实现级联更改(如果某张表的数据改变,可利用触发器来实现其他表的无痕操作)
缺点:
1.对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度
2.造成数据在程序层面不可控
创建触发器:
create trigger 触发器名字 触发时机 触发事件 on 表 for each row
begin
...
end
触发对象:on 表 for each row,触发器绑定实质是表中的所有行,因此每一行发生指定的改变的时候,就会触发触发器
触发时机:每张表中对应的行都会有不同的状态,当sql指令发生的时候,都会令行中数据发生改变,每一行总会有两种状态:数据操作前和操作后
before:表中数据发生改变前的状态
after:表中数据改变后的状态
触发事件:mysql中触发器针对的目标是数据发生改变,对应的操作只有写操作
insert:插入操作
update:更新操作
delete:删除操作
查看触发器:show triggers [like 'pattern'];
show create trigger 触发器名字;
删除触发器:drop trigger 触发器名字;
触发器应用:记录关键字old,new
在触发器中,可以通过old和new来获取绑定表中对应的记录数据:
基本语法:关键字.字段名
old和new并不是所有触发器都有
insert:插入前全为空,没有old
delete:清空数据,没有new