SQL多表查询之隐式/显式内连接、左/右外连接、子查询

本篇大部分内容摘自:https://blog.csdn.net/plg17/article/details/78758593

多表查询前先根据目标厘清如下思路:
①确定表(从哪些表中查?);from 表1,表2
②确定连接条件:where/on
③确定筛选出哪些列:select 列

一、内连接
1)、隐式内连接
首先得澄清一个概念:笛卡尔积:有两个表,A和B,聚合这两个表的所有组成情况(比如A有4条数据,B有3条数据),也即构成了一个新的表(包含有4*3=12条数据)如下图所示; SQL多表查询之隐式/显式内连接、左/右外连接、子查询
SQL多表查询之隐式/显式内连接、左/右外连接、子查询

隐式内连接:就是使用where条件,消除不符合条件的无用数据(消除笛卡尔积的无用数据)。

select 列 1,列2 from 表1,表2 where 条件 ;

2)、显示内连接
关键字:inner join on

语句:select * from a_table a inner join b_table bon a.a_id = b.b_id;

执行结果:
SQL多表查询之隐式/显式内连接、左/右外连接、子查询
SQL多表查询之隐式/显式内连接、左/右外连接、子查询

说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

二、左连接(左外连接)
关键字:left join on / left outer join on

语句:select * from a_table a left join b_table bon a.a_id = b.b_id;

执行结果:
SQL多表查询之隐式/显式内连接、左/右外连接、子查询

说明:
SQL多表查询之隐式/显式内连接、左/右外连接、子查询
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。

左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

三、右连接(右外连接)
关键字:right join on / right outer join on

语句:select * from a_table a right outer join b_table b on a.a_id = b.b_id;

执行结果:
SQL多表查询之隐式/显式内连接、左/右外连接、子查询

说明:
SQL多表查询之隐式/显式内连接、左/右外连接、子查询

right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。

与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

四、全连接(全外连接)
MySQL目前不支持此种方式,可以用其他方式替代解决。

五、子查询

查询中嵌套查询,称嵌套的查询为子查询。

分三种情况:
子查询的结果是:
–单行单列:子查询作为作为一个值,可以用到外层查询语句中去;比如:“where 某字段 < 子查询 "
–多行单列:子查询结果作为一个单列集合,用到外层查询语句中,比如” where 某字段 IN(子查询) "
–多行多列:子查询结果作为一个表;可以将子查询整条语句当作一张表的表名来用(子查询用小括号()括住),,比如" select * from 表a,(子查询语句) where 条件;“
SQL多表查询之隐式/显式内连接、左/右外连接、子查询