DQL排序查询
/*
默认升序排序
desc -- 降序排序
asc -- 升序排序
*/
select * from emp order by sal;
DQL聚合函数
- 作用:将一列数据作为一个整体,进行纵向的计算
- 语法格式: select 聚合函数(字段名) from 表名 [where 条件]
/*
- count() 统计个数
- sum() 求和
- max() 求最大值
- min() 求最小值
- avg() 求平均数
*/
select avg(sal) as '平均薪资' from emp where deptno = 20;
DQL分组查询
/*
分组查询 使用group by 子句
语法格式: select 分组字段/聚合函数 from 表名 group by 分组字段
*/
//查询平局薪资大于2000的部门
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) //--指定sid为主键约束
);
//主键约束--第二种写法
create table student(
sid int(4),
sname varchar(20)
);
/*通过DDL语句添加主键约束*/
alter table student add primary key(sid);
/*通过DDL语句删除主键*/
alter table student drop primary key;
/**
* 主键自增
* 关键字: auto_increment 主键的自动增长 ,字段类型必须是整数类型
*/
create table student(
sid int(4) primary key auto_increment,
sname varchar(20)
) auto_increment=100; //自定义自增的起始位置,不写默认从1开始
delete 和 truncate对自增长得影响
- delete 删除表中的所有数据,将表中的数据逐条删除
- truncate 删除表中的所有数据,是将整个表删除,然后在创建一个结构相同表
/*delete 删除所有数据*/
delete from student; //删除对自增是没有影响的
/*truncate 删除所有数据*/
truncate table student;
非空约束 not null
/*添加非空约束*/
create table student(
sid int(4) primary key auto_increment,
sname varchar(20) not null //sname这列数据不可以为null
) ;
唯一约束 unique
/*表中的某一列不可以重复(对null值,不做唯一判断)*/
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
表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库所有已完成的操作全部撤销,回滚到事务开始时的状态。
事务的自动提交
/**
* 查看事务是否手动提交 (平常默认就是自动提交)
* 如果 autocommit 为on 则表示自动提交
*/
show variables like 'autocommit';
/*修改为手动提交*/
set @@autocommit = off;
事务的四大特性
特性 | 含义 |
原子性 | 每个事务都是一个整体,不可以在拆分,事务中所有的SQL语句要么都执行成功,要么都失败。 |
一致性 | 事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前两人的总金额是10000, 转账后两人的总金额还是10000 |
隔离性 | 事务与事务之间不应该相互影响,执行时保持隔离的状态 |
持久性 | 一但事务执行成功,对数据库的修改是永久的 ,就算关机,数据也是要保存下来的 |
事务的隔离级别
- 数据并发访问
一个数据库可能拥有多个访问客服端,这些客服端都可以并发方式访问数据库。数据库的相同事务可能被多个事务同时访问,如果不采取隔离措施,就会导致各种问题,破坏事务的完整性。 - 并发访问会产生的问题
事务在操作时的理想状态:所有事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据,可能引起并发访问的问题。
并发访问的问题 | 说明 |
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一事务中两次读取的数据内容不一致,要求的是在一个事务中多次读取时数据是一致的。这一般是update操作时引发的问题 |
幻读 | 一个事务中,某一次的 select 操作所得到的结果所表征的数据状态,无法支撑后序的业务操作。查询得到的数据状态不准确,导致幻读 |
四种隔离级别
- read uncommitted--------读未提交
可以防止哪些问题: 无 - read committed--------读已提交(Oracle 默认隔离级别)
可以防止哪些问题: 脏读 - repeatable read-------可重复读(MySQL 默认隔离级别)
可以防止哪些问题: 脏读,不可重复读 - serializable ------- 串行化
可以防止哪些问题: 脏读,不可重复读,幻读 注意: 隔离级别从小到大,安全性是越来越高,但是效率是越来越低的,根据不同的情况来选择不同的隔离级别
隔离级别的相关命令
/*
*查看隔离级别--mysql中默认显示为 repeatable-read
**/
select @@tx_isolation;
/*
*设置隔离级别--新开链接才能查看隔离级别成功设置
**/
set global transaction isolation level 隔离级别
解决脏读的问题
脏读是非常危险的,比如张三向李四购买商品,张三开启事务后向李四转账500块钱,然后李四查询这个钱已经到账了就把货物交给了张三,张三收到货后回滚事务,李四再查时这500块钱没了。
- 解决方案:
一般来说,这应该是隔离级别较低,比如read uncommitted级别,这时将级
别提高到read committed及以上就好了
解决不可重复读的问题
不可重复读就相当于我第一次查询时手机上短信显示为1000元,然后我给卡里边充了500,然后在电脑屏幕端显示1500元,在我不知道已经充了钱的情况下我不知道该选择哪条短信。
- 解决方案:
和脏读差不多,将全局的隔离级别提高到repeatable read 及以上
就好了
解决幻读的问题
幻读还是一样,将隔离级别提到最高就好了,当然也可深入了解