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=’隔离级别名称;’