在数据库查询中,经常会用到两个有关联的表进行查询,需要把两个表中的数据按照某些条件查出来,这时就可以使用连接查询
连接查询分为三种:内连接、外连接和交叉连接
1. 内连接
内连接inner join ,和join是一个东西,join是inner join的简写。 例如: select * from TestA a inner join TestB b on a.id = b.aId
内连接是返回被连接表(a表和b表)中所有的列,包括重复列
在实际使用中,可能连接查询会应用在a表与b表的数据关系是一对多(比如一个学生可以选择好多门课),b表对a表是一对一这样的关系查询中,此时,查询结果的行数是一对一那张表(b表)中符合查询条件的行数
2. 外连接
外连接分为: 左(外)连接、右(外)连接、全连接
左(外)连接 left (outer) join,左连接是以左边表为主表,右边表为辅表,返回左表中的所有行,如果左表中的行在右表中没有匹配行,那么结果中右表的列返回空值。如果左表和右表的数据关系是一对多的关系,那么查询结果中,左表可能会有重复数据。
右(外)连接 right (outer) join,右外连接和左外连接正好相反,右外连接是以右表为主表,左表为辅表,会返回右表中的所有行,如果右表中的行在左表中没有匹配行,那么结果中左表的列返回空值。如果右表与左表是一对多关系,那么查询结果中,右表可能有重复数据。
全连接 full join,全连接就是把左表和右表的数据全部都查询出来,如果左表的行在右表中没有匹配行,那么结果中右表的列返回空值,如果右表的行在左表中没有匹配行,那么结果中左表中的列返回空值。
3. 交叉连接
交叉连接 cross join,使用交叉连接时,如果不带where条件,那么查询结果返回的就是著名的笛卡尔积,也就是左表中的每一条数据都会逐条与右表中每一条数据进行匹配,查询结果返回的行数是左表行数与右表行数的乘积。
带where条件时,返回的就是符合条件的行数
总结:
左连接:以左表为主,左边表的数据肯定会完整展示(可能会有重复),右表没对应的就是null;
右连接:以右表为主,右表数据肯定会完整展示(可能会有重复),左表没对应的就是null;
全连接:两个表的数据都会完整展示(也可能会有重复数据);
交叉连接:不带where条件时查询结果就是笛卡尔积