DQL排序查询
select * from emp order by sal;
DQL聚合函数
作用:将一列数据作为一个整体,进行纵向的计算
语法格式: select 聚合函数(字段名) from 表名 [where 条件]
select avg ( sal) as '平均薪资' from emp where deptno = 20 ;
DQL分组查询
select deptno, avg ( sal)
from emp where deptno is not null group by deptno
having avg ( sal) > 2000 ;
limit关键字
通过limit关键字去指定要查询数据的条数,行数
select 字段 from 表名 limit offset,length;
`offset: 起始行数,默认从0开始计数
length: 返回的行数(要查寻几条数据)
约束
约束名
约束关键字
主键
primary key
唯一
unique
非空
not null
外键
foreign key
主键约束 primary key
特点
不可重复 唯一 非空
作用
用来表示数据库中的每一条记录
create table student (
sid int ( 4 ) primary key,
sname varchar ( 20 )
) ;
create table student (
sid int ( 4 ) ,
sname varchar ( 20 ) ,
primary key ( sid)
) ;
create table student (
sid int ( 4 ) ,
sname varchar ( 20 )
) ;
alter table student add primary key ( sid) ;
alter table student drop primary key;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
create table student (
sid int ( 4 ) primary key auto_increment,
sname varchar ( 20 )
) auto_increment= 100 ;
delete 和 truncate对自增长得影响
delete 删除表中的所有数据,将表中的数据逐条删除
truncate 删除表中的所有数据,是将整个表删除,然后在创建一个结构相同表
delete from student;
truncate table student;
非空约束 not null
create table student (
sid int ( 4 ) primary key auto_increment,
sname varchar ( 20 ) not null
) ;
唯一约束 unique
create table student (
sid int ( 4 ) primary key auto_increment,
sname varchar ( 20 ) unique
) ;
主键约束: 唯一并且不可以为null
唯一约束: 唯一但是可以为null
默认值:字段名 字段类型 default 默认值
MySQL事务操作
事务,是一个有一条或者多条sql语句组成的整体,事务中的操作,要么全部成功,要么全部失败。
手动提交事务
功能
语句
开启事务
start transaction; 或者begin
提交事务
commit
回滚事务
rollback
start transaction
这个语句显示的标记一个事务的起始点
commit
表示提交事务, 即提交事务的所有操作,具体的说,就是讲事务中所有对数据库的更新都写到磁盘上的物理数据库中,事务正常结束。
rollback
表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库所有已完成的操作全部撤销,回滚到事务开始时的状态。
事务的自动提交
show variables like 'autocommit' ;
set @@autocommit = off;
事务的四大特性
特性
含义
原子性
每个事务都是一个整体,不可以在拆分,事务中所有的SQL语句要么都执行成功,要么都失败。
一致性
事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前两人的总金额是10000, 转账后两人的总金额还是10000
隔离性
事务与事务之间不应该相互影响,执行时保持隔离的状态
持久性
一但事务执行成功,对数据库的修改是永久的 ,就算关机,数据也是要保存下来的
事务的隔离级别
并发访问的问题
说明
脏读
一个事务读取到了另一个事务中尚未提交的数据
不可重复读
一事务中两次读取的数据内容不一致,要求的是在一个事务中多次读取时数据是一致的。这一般是update操作时引发的问题
幻读
一个事务中,某一次的 select 操作所得到的结果所表征的数据状态,无法支撑后序的业务操作。查询得到的数据状态不准确,导致幻读
四种隔离级别
read uncommitted--------读未提交
可以防止哪些问题: 无
read committed--------读已提交(Oracle 默认隔离级别)
可以防止哪些问题: 脏读
repeatable read-------可重复读(MySQL 默认隔离级别)
可以防止哪些问题: 脏读,不可重复读
serializable ------- 串行化
可以防止哪些问题: 脏读,不可重复读,幻读
注意: 隔离级别从小到大,安全性是越来越高,但是效率是越来越低的,根据不同的情况来选择不同的隔离级别
隔离级别的相关命令
select @@tx_isolation ;
set global transaction isolation level 隔离级别
解决脏读的问题
脏读是非常危险的,比如张三向李四购买商品,张三开启事务后向李四转账500块钱,然后李四查询这个钱已经到账了就把货物交给了张三,张三收到货后回滚事务,李四再查时这500块钱没了。
- 解决方案:
一般来说,这应该是隔离级别较低,比如read uncommitted级别,这时将级
别提高到read committed及以上就好了
解决不可重复读的问题
不可重复读就相当于我第一次查询时手机上短信显示为1000元,然后我给卡里边充了500,然后在电脑屏幕端显示1500元,在我不知道已经充了钱的情况下我不知道该选择哪条短信。
- 解决方案:
和脏读差不多,将全局的隔离级别提高到repeatable read 及以上
就好了
解决幻读的问题
幻读还是一样,将隔离级别提到最高就好了,当然也可深入了解