一.多表查询
1.内连接
相当于查询两表交集部分的数据。
隐式内连接:
Select 字段列表 from 表1 , 表2 where 条件;
显示内连接:
Select 字段列表 from 表1 [inner] join 表2 on
连接条件;
2.外连接
左外连接:查询左表所有数据以及两张表交集部分的数据。
Select 字段列表 from 表1 left [outer] join 表2 on 条件;
右外连接:查询右表所有数据以及两张表交集部分的数据。
Select 字段列表 from 表1 right [outer] join 表2 on 条件;
3.自连接
当前表与自身的连接查询,必须使用表别名。可以是内连接查询,也可以是外连接查询。
Select 字段列表 from 表1 别名1 join 表2 别名2 on 条件;
4.联合查询 union-union all
把多次查询的结果合并起来,形成一个新的查询结果集。
Select 字段列表 from 表1…
union [all]
Select 字段列表 from 表2…;
联合查询的多张表的字段类型和列数必须保持一致;union all会将全部数据直接合并在一起,union则会对合并后的数据去重。
5.子查询
SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
Select * from t1 where test1 =(Select test1 from t2);
子查询外部的语句可以是insert或update或delete或select的其中一个。
①标量子查询
子查询返回的结果是单个值(数字,字符串,日期等),称为标量子查询。
常用操作符:> < =
②列子查询和行子查询
子查询的返回结果是一列(可以是多行),这种子查询称为列子查询。
子查询的返回结果是一行(可以是多列),这种子查询称为行子查询。
常用操作符:in,not in, any,some,all
in:在指定的集合范围内多选一
any:子查询返回列表中有任意一个满足即可
③表子查询
子查询返回结果是多行多列,称为表子查询。
常用操作符:in
二.事务
事务是一组操作的集合,把所有的操作作为一个整体,一起向系统提交或撤销操作请求。
默认MySQL的事务是自动提交的。
1.查看或设置事务提交方式:
Select @@autocommit;
Set @@autocommit=0;(改为手动)
开启事务:start transaction 或 begin;
提交事务:commit;
回滚事务:rollback;
2.事务四大特性(ACID):
原子性(atomicity):事物是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事物在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事物一旦提交或回滚,它对数据库中数据的改变就是永久的。
3.并发事务问题:
①脏读:一个事务读到另一个事务还没有提交的数据。
②不可重复读:一个事务先后读取同一条记录,但两次读取到的数据不同。
③幻读:一个事务按照条件查询数据时,没有对应的数据行,但在插入数据时,又发现这行数据已经存在。
4.事务隔离级别:
Read uncommitted:三种问题都可能出现
Read committed:可能出现脏读
Repeatable read:可能出现脏读、不可重复读
Serializable(串行化):三种问题都不会出现
查看事务隔离级别:
Select @@transaction_isolation;
设置事务隔离级别:
Set [session/global] transaction isolation level 隔离级别;
tips:事务隔离级别越高,数据越安全,但是性能越低。