• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

mysql 查询+事务

互联网 diligentman 6个月前 (11-26) 47次浏览

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 及以上
			就好了

解决幻读的问题
幻读还是一样,将隔离级别提到最高就好了,当然也可深入了解mysql 查询+事务


程序员灯塔
转载请注明原文链接:mysql 查询+事务
喜欢 (0)