1 DQL操作单表
排序
通过order by子句,可以将查询出来的结果进行排序,注意排序只是显示效果,不会影响真实数据,排序的语法格式是:
select 字段名 from 表名 [ where 字段 = 值] order by 字段名 [asc / desc] --asc表示升序(默认),desc表示降序
只按照一个字段排序就是单列排序,具体例子如下:
select * from emp order by salary;
同时对多个字段进行排序,如果第一个字段相同,就按照第二个字段进行排序,以此类推,实例如下:
select * from emp order by salsry desc,eid desc ;
聚合函数
之前的查询都是横向查询,他们是根据条件一行一行的进行判断,而是使用聚合函数查询则是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值,需要注意的是聚合函数会忽略null值。
使用聚合函数的语法格式是:
select 聚合函数(字段名) from 表名;
常用的聚合函数介绍:
函数 | 说明 |
---|---|
count(字段) | 统计指定列不为null的记录行数 |
sum(字段) | 计算指定列的数值之和 |
max(字段) | 计算指定列的最大值 |
min(字段) | 计算指定列的最小值 |
avg(字段) | 计算指定列的平均值 |
使用实例:
select count(dept_name) from emp ;
select sum(salsry) as '薪资总和',max(salsry) as '最高薪资' ,min(salsry) as '最低薪资',avg(salsry) as '平均薪资'from emp ;
分组
分组查询使用group by语句,对查询的信息进行分组,相同数据为一组,具体语法格式是:
select 分组字段/聚合函数 from 表名 group by 分组字段 [ having 条件]
注意:分组的目的一般是为了统计信息,所以常和聚合函数搭配使用,单独使用没有任何意义。
使用实例:
select dept_name as '部门名称' from emp group by dept_name;
select dept_name,avg(salsry) from emp where dept_name is not null group by dept_name;
当需要在分组后对数据进行过滤时,需要使用having关键字,having子句用在分组后过滤出满足条件的信息,作用类似于where,实例:
select dept_name,avg(salsry) from emp where dept_name is not null group by dept_name having avg(salsry)>6000;
where和having之间的区别:
- where是在进行分组之前对数据进行过滤,并且where后面不能使用聚合函数
- having是在分组之后进行数据过滤,并且是可以使用聚合函数
limit关键字
limit关键字用于限制返回结果的行数,简单来说就是可以通过limit指定查询多少行的数据,主要用来完成分页操作,具体语法结构是:
select 字段1,字段2... from 表名 limit offset,length --offset是起始行数,从0开始,如果省略,则默认为0,length表示返回的行数
使用实例:
select dept_name from emp limit 3;
select dept_name from emp limit 1,2;
2 SQL约束
约束的作用:主要对表中的数据进行限制,保证数据的正确性、有效性和完整性,只要是违反约束的数据就无法插入到表中。
常见的约束有:
约束 | 约束关键字 |
---|---|
主键 | primary key |
唯一 | unique |
非空 | not null |
外键 | foreign key |
主键约束
主键约束:用来表示数据库中的每一条记录,特点是不可以重复,也不能为空
添加主键约束的语法格式:
字段名 字段类型 primary key;
创建带有主键约束的表,有三种方式,使用实例如下:
--方式一
create table student(
id int primary key ,
name varchar(20),
sex char(1)
);
--方式二
create table student(
id int ,
name varchar(20),
sex char(1),
primary key (id)
);
--方式三
create table student(
id int ,
name varchar(20),
sex char(1)
);
alter table student add primary key (id);
除了可以添加主键约束外,还可以删除,删除主键约束的语法格式是:
alter table 表名 drop primary key;
主键自增:我们在每次插入更新数据时,主键会自动的进行递增,生成对应的主键字段值,这样可以很好地防止主键发生重复的问题。
使用主键自增,需要使用关键字 auto_increment表示自动增长(字段类型必须是整型)
创建主键自增的表:
create table student(
id int primary key auto_increment,
name varchar(20),
sex char(1)
);
主键自增的起始值是可以自己指定的,默认的其实值是1,如果想指定自增的起始值,可以这样做:
create table student(
id int primary key auto_increment,
name varchar(20),
sex char(1)
)auto_increment=65; 这句话指定自增起始值从65开始--
当我们执行delete和truncate操作对主键的自增长的影响:
- delete只是删除表中的所有数据,对自增不存在任何影响
- truncate是将整个表删除掉,在创建一个新的表,且该表的自增主键会重新从1开始
非空约束
非空约束:声明的该列数据都不能为空,具体的语法格式是
字段名 字段类型 not null
使用实例:
create table student(
id int primary key auto_increment,
name varchar(20),
sex char(1) not null
);
唯一约束
唯一约束:表中声明的该列的值是不允许重复的,注意对null不做唯一判断,具体的语法格式
字段名 字段类型 unique
添加唯一约束的实例:
create table student(
id int primary key auto_increment,
name varchar(20) unique ,
sex char(1) not null
);
主键约束与唯一约束的区别:
- 主键约束不能为空,且要唯一
- 唯一约束是可以为空,且要唯一
- 一个表中只能有一个主键,但是可以有多个唯一约束
外键约束
外键约束 foreign key,在多表中将详细介绍。
默认值
默认值约束:用来指定某列的默认值,具体语法格式
字段民 字段类型 default 默认值
添加默认值实例:
create table student(
id int primary key auto_increment,
name varchar(20) unique ,
sex char(1) default '女'
);
3 数据库事务
事务是一个整体,有一条或者多条sql语句组成,这些语句要么都执行成功,要么都执行失败,只要有一条语句出现错误,则整个操作都会回滚,整个业务操作失败。
其中回滚是指:事务运行过程中出现错误,事务就不能继续向下执行了,系统将会将对事务中的数据库所有已经完成的操作全部撤销,滚回事务开始时的状态。
MySQL事务操作有两种方式:
- 手动提交事务
- 自动提交事务
手动提交事务的语法格式是:
start transaction 或者 begin --开启事务
commit --提交事务
rollback --回滚事务
start transaction显示的标记一个事务的起始点
commit 表示提交事务,也就是提交事务的所有操作,详细来说就是将事务中所有对数据库的更新都写入到磁盘上的物理数据库中,事务正常结束。
rollbakc 表示撤销事务,在事务运行过程中遇到了故障,事务无法继续向下执行,系统就会将事务对数据中所有已完成的操作进行撤销,使数据恢复到事务开始时的状态。
手动提交事务的流程:
- 执行成功的情况:开启事务 -> 执行多条SQL语句 -> 提交事务
- 执行失败的情况:开启事务 ->执行多条SQL语句 ->事务回滚
自动提交事务:MySQL默认的每一条DML语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕,自动提交事务,MySQL默认开始自动提交事务。
将MySQL默认自动提交事务改为手动提交事务:
登陆mysql,查看autocommit状态
show variables like 'autocommit'
on:自动提交
off:手动提交
把autocommit状态设为off
set @@autocommit=off;
4 事务的四大特性
特性 | 含义 |
---|---|
原子性 | 每个事务都是统一的整体,不可再拆分,事务中的所有SQL语句要么都都成功,要么都失败 |
一致性 | 事务在执行前数据库的状态与执行后数据库的状态保持一致 |
隔离性 | 事务与事务之间不应该相互影响,执行时保持隔离的状态 |
持久性 | 一旦事务执行成功,对数据库的修改是持久的。 |
MySQL事务隔离级别
当数据库被多个事务同时访问时,如果不采取隔离措施,就会导致各种问题,破坏数据的完整性。
并发访问数据库会造成:赃读、不可重复读、幻读等问题,其中赃读是指一个事务读取到另一个事务尚未提交的数据;不可重复读是指一个事务两次读取到的数据内容不一致,要求是在一个事务中多次读取时数据是一致的,造成不一致的原因是另一个事务提交了update操作;幻读是指一个事务中某一次的select操作得到的结果所表征的数据状态,无法支撑后续的业务操作。查询到的数据状态不准确,导致幻读。
解决上面三种问题的关键是设置事务隔离级别,事务隔离级别有四种,依次从低到高是:
级别 | 名字 | 隔离级别 | 赃读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|---|
1 | 读未提交 | read uncommitted | 不能解决 | 不能解决 | 不能解决 | |
2 | 读已提交 | read committed | 能解决 | 不能解决 | 不能解决 | Oracle和SQLServer |
3 | 可重复读 | repeatable read | 能解决 | 能解决 | 不能解决 | MySql |
4 | 串行化 | serializable | 能解决 | 能解决 | 能解决 |
5 隔离级别相关命令
查看隔离级别:
select @@tx_isolation;
设置隔离级别,需要退出MySql再重新登陆才能看到隔离级别的变化
set global transaction isolation level 级别名称;
read uncommitted 读未提交
read committed 读已提交
repeatable read 可重复读
Serializable 串行化
实例将隔离级别修改为读未提交:
set global transaction isolation level read uncommitted;
注意:隔离级别不是设置越高越好,虽然设置较高的隔离级别可以很好地解决并发访问数据库造成的众多问题,但是隔离级别越高,事务的执行效率就会越低,所以要根据实际情况选择合适的隔离级别。