因为每个实体是一张表,一个业务逻辑使用多个实体的数据。多张表应该在一起使用,将多个表的的记录连接起来。总体思路就是将所有的数据,按照某种条件连接起来,再进行筛选处理。

可以将连接查询分为:内连接,外连接,自然连接。

数据内部的连接,要求连接的每个数据都必须存在才能进行连接。

第一步:先连接

如上图:先让join_teacher表的第一条记录与join_teacher_class表的第一条记录进行连接,形成一条新的记录。

第二步:判断条件判断

如上图:有on判断条件进行判断,是否符合判断条件,并对符合判断条件的记录进行保留。

第三步:重新连接

如上图:第一步是join_teacher表的第一条记录与join_teacher_class表的第一条记录进行的连接,现在是join_teacher的第一条记录和后者表的第二条记录进行连接。然后再用条件判断。是否符合判断条件。符合保留,不符合弃掉。就这样一直进行下去。直到两个表的记录都连接过,最终得到的结果是判断后的结果,两个表中一个不存在都不会保留下来。

内连接在连接时如果省略掉连接条件,那就意味着所有的左表数据都要与右表做一个连接,那就是一个笛卡尔积,假如左表有M条记录,右表有N条记录,那么总共就有MxN条记录。这种连接就称为交叉连接,或者笛卡尔积。表示获取了最多的数据。此时可以用cross join关键字,相当于没有条件的内连接。

从内连接的执行过程来看只有两个数据都存在才能进行连接。

inner join ,   由于mysql是默认内连接因此直接写个join也行。on是连接条件语句。当没有判断条件时也可以写成交叉连接形式。也可以不用where的查询方式。

这种写法就是查询两个表,两个表中间由逗号隔开,最后查询的结果就是交叉查询的结果,或者笛卡尔积的简单形式。

on:条件判断是,两个表连接一条记录,就判断一次。

where:是等两个表的记录都连接完成后,相当于笛卡尔积后,再进行判断。

using:是一种高级的写法,Using要求负责连接的两个实体之间的字段名称一致。字段不一样连接不上。

上图where是内连接筛选后再进行判断。

注意:因为where做判断时,需要求出笛卡尔积,大量浪费了时间,因此在做连接查询时尽量不用where做条件,在数据过滤时再用where。

查询条件与外连接通用,但是外连接不能使用where作为连接查询条件。

此外对于别名问题,如果sql语句很长,可以给表设置别名:tbl_name as 别名;保证简介和清晰。

外连接分为左外连接,右外连接,全外连接(暂时不支持)。外连接的关键字有:left outer join,right outer join  其中outer可以不写

由于在连接时,如果出现左边表,数据连接不到右边表的情况,则左边表的数据被保留,而如果右边表的数据连接不到左边表,右边表的数据将会被遗弃。

同理,在连接时如果右边表连接不到左边表的情况,则右边表的数据被保留,而如果左边表的数据连接不到右边表,左边表的数据将被遗弃。

没有全连接的独自语句,但是可以通过union关键字将左外连接和右外连接联合到一块进行连接。如图所示:

全外连接是通过左连接表和右连接一块联合搞的。

其结果也是将两者的结果,并用distinct默认去重了。

1、外连接的判断条件不允许使用where判断条件,因此只能使用on,和using去判断。

2、using判断条件的使用必须是在两个实体表的字段相同的条件下才能使用。using会去掉结果中的重复字段并将连接字段放在列前。

3、外连接不支持没有条件的连接,如果没有条件,外连接将报错。

1、内连接和外连接都是进行多表查询的。

2、内连接连接时必须知道连接的表之间都有相同的连接字段数据,如果没有,将不会返回结果。

3、外连接不需要知道连接的表之间是否有相同字段的数据,如果没有就会设置为null.

4、using判断条件是,连接的表之间必须有相同的字段,注意这里说的是字段不是字段中的数据。我感觉还是最好使用其他条件。