多表查询,顾名思义,即返回的结果涉及到不止一张表的信息,连接的信息在原表上既可能增加了行的数据,也可能是增加了列的数据,分别对应表的加法和表的联结。
表的加法
- union:表结构相同时,将两个表的数据按行合并,删除重复行
- Union all:与union相同,但不删除重复行
表的联结
- 交叉联结(cross join):也称为“笛卡尔积”,如下图所示,是R中的每个元素和S中每个元素的组合,cross join得到的行数是两个集合中元素数量的乘积。运算比较庞大,实际应用较少。
- 内联结(inner join):也可简写为join,查找同时存在于两张表的数据
- 左联结(left join):将左侧表作为主表,数据全部取出,右侧表只取出和左侧表匹配部分,不匹配部分返回空值,加上条件where 右表.共同字段=null,可以筛选出不匹配数据
- 右联结(right join):将右侧表作为主表,数据全部取出,左侧表只取出和右侧表匹配部分,不匹配部分返回空值
- 全联结(full join):返回左表和右表的所有行,左表和右表有匹配时进行合并,不匹配返回空值(mysql不支持)
- 注意事项
- 当场景需要取出其中一个表的全部数据时,用左连接或者有连接,其余全部用内连接
- 三表联结:连续用两次join
case表达式
- 判断是否符合条件并给出符合条件的结果,适用于分类、分段
- 汇总分类数据:case表达式+聚合函数,如sum(case when……then 1……)
多表查询练习题
练习网站:sqlzoo