MySQL学习(一)

sql语言分类

1)数据定义语言:简称【DDL】(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等

2)数据操作语言:简称【DML】(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等

3)数据控制语言:简称【DCL】(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;关键字:grant等

4)数据查询语言:简称【DQL】(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等

语法顺序

SELECT DISTINCT
< 查询列表>
FROM
< 表名 >
JOIN < 连接类型 > ON < 连接条件 >
WHERE
< 查询条件 >
GROUP BY
< 分组 字段>
HAVING
< 分组后的筛选条件 >
ORDER BY
< 排序条件 >
LIMIT < 指定条数 >

解析后语句执行顺序

1 FROM
2 ON
3 JOIN
4 WHERE
5 GROUP BY
6 HAVING
7 SELECT
8 DISTINCT
9 ORDER BY
10 LIMIT
通过一个栗子来探索一下,解析之旅
假设有语句

SELECT
   a.uid,
   count(b.oid) AS total
FROM
  table1 AS a
LEFT JOIN table2 AS b ON a.uid = b.uid
WHERE
  a. NAME = 'mike'
GROUP BY
  a.uid
HAVING
   count(b.oid) < 2
ORDER BY
  total DESC
LIMIT 1;

1、from
对from左边的表和右边的表计算笛卡儿积,产生虚表v1,相当于执行了

select * from table1,table2;

2、on 过滤
对虚表v1进行ON筛选,只有那些符合连接条件 的行才会被记录在虚表v2中,相当于执行了

 SELECT * FROM  table1,table2 WHERE table1.uid = table2.uid

**3、 join **
如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表V2中,产生虚拟表V3,相当于执行了

select * from  table1 a   left join  table2 b  on a.uid =b.uid

4、where
对虚拟表V3进行WHERE条件过滤,只有符合where条件的记录才会被插入到虚拟表V4中。
注意:此时因为分组,不能使用聚合运算,也不能使用SELECT中创建的别名,相当于执行了

SELECT *  FROM table1  AS a  
LEFT OUTER JOIN table2 AS b
ON a.uid = b.uid  
WHERE a. NAME = 'mike';

5、group by
根据group by子句中的列,对V4中的记录进行分组操作,产生虚拟表V5。
注意:其后处理过程的语句,如SELECT,HAVING,所用到的列必须包含在GROUP BY中。对于没有出现的,得用聚合函数;
因为,根据分组字段,将具有相同分组字段的记录归并成一条记录,因为每一个分组只能返回一条记录,除非是被过滤掉了,而不在分组字段里面的字段可能会有多个值,多个值是无法放进一条记录的,所以必须通过聚合函数将这些具有多值的列转换成单值。相当于执行了

SELECT *  FROM table1  AS a  
LEFT OUTER JOIN table2 AS b
ON a.uid = b.uid  
WHERE a. NAME = 'mike'
group by a.uid

6、having
对虚拟表V5应用having过滤,只有符合having后面跟的条件的记录才会被 插入到虚拟表V6中,相当于执行了

SELECT *  FROM table1  AS a  
LEFT OUTER JOIN table2 AS b
ON a.uid = b.uid  
WHERE a. NAME = 'mike'
group by a.uid
having count(b.oid) < 2;

7、select
选取具体列,并计算select中的表达式,

8、order by
从刚select操作的表中,根据ORDER BY 子句的条件对结果进行排序,生成V6表。

注意:唯一可使用SELECT中起别名的地方;
9、limit
LIMIT子句从上一步得到的VT6虚拟表中选出从指定位置开始的指定行数据。

常用聚合函数

sum():求某一列的和
avg():求某一列的平均值
max():求某一列的最大值
min():求某一列的最小值
count():求某一列的元素个数
使用分组时注意事项:
① select语句中的列(非聚合函数列),必须出现在group by子句中
② group by子句中的列,不一定要出现在select语句中
③ 聚合函数只能出现select语句中或者having语句中,一定不能出现在where语句中。

MySQL事务

事务是指逻辑上的一组操作,各个执行单元要么一起成功,要么一起失败。

事务特性

1、 Atomicity(原子性):构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。
2、Consistency(一致性):数据库在事务执行前后状态都必须是稳定的或者是一致的。
3、Isolation(隔离性):事务之间不会相互影响。
4、Durability(持久性):事务执行成功后必须全部写入磁盘。

事务并发问题

1、脏读:一个事务读取到另一个事务未提交的数据。
2、不可重复读:一个事务因读取到另一个事务已提交的update或者delete数据。导致对同一条记录读取两次以上的结果不一致。
3、幻读:一个事务因读取到另一个事务已提交的insert数据。导致对同一张表读取两次以上的结果不一致。

事务隔离级别

1、Read uncommitted (读未提交):最低级别,任何情况都无法保证。
2、Read committed (RC,读已提交):可避免脏读的发生。
3、Repeatable read (RR,可重复读):可避免脏读、不可重复读的发生。
(注意事项:InnoDB的RR还可以解决幻读,主要原因是Next-Key锁,只有RR才能使用Next-Key锁)
4、Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

查看和设置隔离级别

在MySQL数据库中查看当前事务的隔离级别:
select @@tx_isolation;

在MySQL数据库中设置事务的隔离级别:
set [glogal | session] transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称;’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值