七、关联查询和联合查询
上图展示了所有的关联可视化的结果。
关联的作用:从两张或者多张表中取出有关联的数据
关联查询一共有如下几种:
-
内连接:INNER JOIN, CROSS JOIN
-
外连接:左连接(LEFT JOIN) 右连接(RIGHT JOIN) 全连接(FULL OUTER JOIN)
-
自连接:当table1,table2本质上是同一张表,只是用取别名的方式虚拟成两张表代表不同的意义
说明
-
连接n个表,至少需要n-1个连接条件
-
当两个关联查询的表如果有字段名字相同,并且查询中涉及该关联字段,那么需要使用表名前缀加以区分
-
如果表名比较长时,可以给表取别名,简化SQL语句
三个关联条件
-
WHERE:适用于所有的关联查询
-
ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但是分开写可读性更好
-
USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等。
--------------------------------------------------------------------------------
内连接 INNER JOIN
分类
-
显式
SELECT 字段名 FROM 表1 INNER JOIN 表2 ON [关联条件] WHERE [其他筛选条件];
-
隐式
SELECT 字段名 FROM 表1,表2 where [筛选条件]
# 这种隐式的连接,由于缺少了on做表的联系,所以需要把on 的条件写进where中
-
交叉连接
SELECT 字段名 FROM 表1 CROSS JOIN 表2 ON [关联条件] WHERE [其他筛选条件];
这种交叉连接等价于上面的隐式连接,都会返回两个表的笛卡尔积
代码实例
--------------------------------------------------------------------------------
外连接之左连接 LEFT JOIN
第一种情况:
返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表的列值为NULL
第二种情况:
返回左表中行在右表中没有匹配行的记录
-----------------------------------------------------------------------------------------------------------------
外连接之右连接 RIGHT JOIN
右连接和左连接相似,这里不再赘述
------------------------------------------------------------------------------------------------------------------------------------------
外连接之全连接 FULL OUTER JOIN
注意:
由于mysql不支持FULL JOIN,但是可以用 left join union right join代替,也就是左连接 联合查询 右连接