Mysql多表查询
一、表连接查询
1.1 多表查询的分类
1.1.1 内连接查询
* 隐式内连接:使用where条件消除无用数据
* 语法:SELECT 字段列表 FROM 左表, 右表 WHERE 条件
小贴士:
* 笛卡尔积:
* 有两个集合A,B,取这两个集合的所有组成情况。
* 要完成多表查询,需要消除无用的数据
* 如何消除笛卡尔积现象的影响?
* 增加where条件进行筛选,过滤掉没有用的数据。
* 显示内连接:使用INNER JOIN ... ON语句,INNER可以省略
* 语法:SELECT 字段列表 FROM 左表 [INNER] JOIN 右表 ON 条件
* 迫切内连接:使用INNER JOIN FETCH ... ON语句,INNER可以省略
* 语法:SELECT 字段列表 FROM 左表 [INNER] JOIN FETCH 右表 ON 条件
注意:隐式内连接和显示内连接的区别
* 隐式内连接先查询数结果集(即先进行笛卡尔积运算,生成一个新的表格。),再根据where条件筛选数据。因为表的数据量大,效率低、耗内存。
* 显示内连接在查询数据时,会根据on后面的条件进行数据筛选,逐条匹配。不会产生笛卡尔积现象,效率高。
1.1.2 外连接查询
* 左外连接:使用LEFT OUTER JOIN ... ON,OUTER可以省略
* 语法:SELECT 字段列表 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
* 结果集:查询的是左表所有数据以及其交集部分,若交集部分没有数据,则显示NULL。
* 迫切左外连接:使用LEFT OUTER JOIN FETCH ... ON语句,OUTER可以省略
* 语法:SELECT 字段列表 FROM 左表 LEFT [OUTER] JOIN FETCH 右表 ON 条件
* 结果集:查询的是左表所有数据以及其交集部分,若交集部分没有数据,则显示NULL。
* 右外连接:使用RIGHT OUTER JOIN ... ON,OUTER可以省略
* 语法:SELECT 字段列表 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 条件
* 结果集:查询的是右表所有数据以及其交集部分,若交集部分没有数据,则显示NULL。
小贴士:
* 什么是迫切?
* 及时将两个关联对象进行相互引用
* 为什么没有迫切右外连接?
* 因为封装的时候是以左对象为主键,右对象保全。所以若左对象为null,将右对象赋值给null是不合理的。
1.1.3 查询关联表的所有数据(扩展)
使用Union 和 Union All 操作符进行表数据的合并,使用前提是表或者查询的字段数、列表名称/类型相同。
Union 和 Union All 的区别:
Union 在表链接后会对所产生的结果进行排序运算,删除重复的记录再返回合并结果。
Union All 只是简单的将两个结果合并后返回。因不需去重,所以效率高于union。
具体的介绍可参考:
https://www.w3school.com.cn/sql/sql_union.asp 或者 https://www.runoob.com/sql/sql-union.html
1.2 子查询
1.2.1 概述
查询中嵌套查询,即一个查询的结果作为另一个查询的条件,称嵌套查询为子查询。
1.2.2 子查询用法
子查询需用小括号括起来。
(此处省略一万字... ...)