在select语句中,如果from子句引用了多个表源或试图,则可以用join关键字连接
内连接:inner join,从一张表中取出所有的记录去另外一张表中匹配,利用匹配条件
进行匹配。
基本语法:
表1[inner] join 表2 on 匹配条件
1、如果内连接没有条件(允许),那么就是交叉连接
2.使用匹配条件进行匹配
3、因为表的设计通常容易产生同名字段,尤其是ID,为了避免重名出现错误,通常
使用表名.字段名,确保唯一性.
select * from my_student inner join my_class on my_student.class_id=my_class
4、通常,如果条件中使用对应的表名,而表名通常比较长,所以可以通过表别名来简化
5、内连接匹配的时候,必须保证匹配到才保存
6、内连接可以在数据匹配完成后,使用where条件来限制,效果与on一样(推荐使用on).
是在连接查询中用来代替对应的on关键字的,进行条件匹配
1、在连接查询时,使用on的地方用using代替
2、使用using的前提是对应的两张表连接的字段是同名
3、如果using关键字,那么对应的同名字段,最终在结果中只会保留一个
基本语法:
表1[inner,left,right] join 表2 using (同名字段列表)//连接字段
select * from my_student a left join my_class b on a.class_id=b.class_id;
select * from my_student left join my_class using(class_id)
交叉连接:将两张表的数据与另外一张表彼此交叉。
基本语法:
表1 cross join 表2;
outer join,按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表
外连接分为两
种:左外连接(left join),右连接(right join)
左连接:左表是主表有连接:有表是主表
1、确定连接主表:左连接就是 left join 左边的表为主表;right join 就是右边为主表
2、拿主表的每一条记录,去匹配另外一张表的每一条记录
3、如果满足匹配条件:保留;不满足不保留。
4、如果主表记录在从表中一条都没有匹配成功,那么也要保留该记录,从表对应的字段值都为null;
基本语法:
左连接:主表 left join 从表 on 连接条件;
右连接: 主表 right join 从表 On 连接条件;
左连接对应的主表数据在左边;右连接对应的主表数据在右边;
事务就是有一组SQL语句组成的业务逻辑,这组语句要么全执行,要么全不执行,不存在部分执行的情况。
基本原理:Mysql 允许将事务 统一进行管理(存储引擎INNODB),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到用于确认结果之后再进行操作
事务在mysql中通常是自动提交,但是也可以使用手动提交
事务从start transaction 起到提交事务(commit 或者 rollback),要么所有操作都成功,要么就是所有操作都失败;
数据表中的数据修改,要么是所有操作一次性修改,要么都不修改
如果一个客户端使用事务操作一个数据时候,另外一个客户端不能对该数据进行操作
事务一旦提交,他对数据库中数据的改变是永久性的。
自动事务:autocommit,当客户端发送一条sql指令给服务器时候,服务器在执行之后需,不用等待用户反馈结果,会自动将结果同步到数据表
证明:利用两个客户端,一个客户端执行SQL指令,另外一个客户端查看执行结果。
自动事务:系统做了额外的步骤来帮助用户操作,系统是通过变量来控制的。
show variables like 'autocommit';
在默认情况下,如果开启了自动提交功能,则此时返回的结果为ON;
set autocommit = 0;
commit;
rollback;
手动事务:不管是开始还是过程还是结束都需要用户,手动的发送事务操作指令来实现。
start transaction;
将多个连续的但是是一个整体的sql指令,逐一执行。
确认提交:commit,数据写到数据表(清空事务日志)
回滚操作:rollback,所有数据无效并清空
回滚点:savepoint
增加回滚点:savepoint 回滚点名字//字母数字和下划线构成
回到回滚点:rollback to 回滚点名字
注意:在一个事务处理中,如果有很多个步骤,那么可以设置多个回滚点。
select * from my_stydent as s lefy join my_clas c on s.class_id =c.class_id;