- 目录
- 1. 前言
- 2. JOIN的类型
- 2.1 内连接INNER
- 2.2 全外连接FULL OUTER
- 2.3 左外连接 LEFT OUTER
- 2.4 右外连接 RIGHT OUTER
- 2.5 交叉连接 CROSS
- 3. 使用join案例
- 3.1 使用join更新多张表
- 3.2 使用join优化子查询
- 3.3 使用join优化聚合子查询
- 4.总结
1.前言
使用join是SQL查询里较为常用的命令,因此熟练掌握和理解是我们很有必要的。
2.JOIN的类型
JOIN有五种类型,分别是内连接INNER、全外连接FULL OUTER、左外连接 LEFT OUTER、右外连接 RIGHT OUTER、交叉连接 CROSS这五种类型
2.1 内连接INNER
内连接就是基于连接谓词将两张表的列组合起来产生新的结果表,结果集是两张表的公共部分,如下图所示:
2.2 全外连接FULL OUTER
全连接的意思是查询A表和B表的全部数据或者无交集的数据,如下图所示:
注意:mysql不支持全外连接,我们需要使用union all联合查询代替
我们可以根据左外连接和右外连接的隐藏交集的属性特征,进行无交集数据查询,如上图右图,sql语句示例如下:
SELECT a.’name’,a.’over’,b.’over’ FROM user1 a LEFT JOIN user2 b ON a.’name’=b.’name’ UNION ALL SELECT b.’name’,b.’over’,a.’over’ FROM user1 a RIGHT JOIN user2 b ON a.’name’=b.’name’
2.3 左外连接 LEFT OUTER
左外连接就是以A为主要表基于连接谓词将A表和B表有交集的部分显示或者隐藏掉,如下图所示:
2.4 右外连接 RIGHT OUTER
右外连接就是以B为主要表基于连接谓词将A表和B表有交集的部分显示或者隐藏掉,如下图所示:
2.5 交叉连接 CROSS
交叉连接又称为笛卡尔连接或者叉乘,如果A和B是两个集合,他们的交叉连接就是AxB,sql语句如下:
SELECT a.’name’,a.’over’,b.’name’,b.’over’ FROM user1 a CROSS JOIN user2 b
注意:在具体项目中避免使用笛卡尔积查询
3.使用join案例
3.1 使用join更新多张表
一次性更新包含自身表和另一张表的同一字段
UPDATE user1 a JION ( SELECT b.`user_name` FROM user1 a INNER JOIN user2 b ON a.`user_name`=b.`user_name` ) b ON a.user_name=b.user_name SET a.over=’xxx’;
3.2 使用join优化子查询
优化前:
SELECT a.user_name,a.`over`,( SELECT over FROM user2 b WHERE a.user_name=b.`user_name`) AS over2 FROM user1 a;
优化后:
SELECT a.`user_name`,a.`over`,b.`over` AS over2 FROM user1 a LEFT JOIN user2 ON a.`user_name`=b.`user.name`;
以上两条查询结果相同,但是查询时间有差异
3.3 使用join优化聚合子查询
比如上表,我们要查出所有用户中打怪最多的日期,怎么查询?
优化前:
SELECT a.user_name,b.timestr,b.kills FROM user1 a JOIN user_kills b ON a.id= b.user_id WHERE b.kills=( SELECT MAX(c.kills) FROM user_kills c WHERE c.user_id=b.user_id)
优化后:
SELECT a.user_name,b.timestr,b.kills FROM user1 a JOIN user_kills b ON a.id =b.user_id JOIN user_likks c ON c.user_id =b.user_id GROUP BY a.user_name,b.timestr,b.kills HAVING b.kills=MAX(c.kills);
4.总结
JOIN命令是我们掌握SQL的高级命令之一,重要的是掌握优化思想,把一些效率低的SQL转变成使用高级命令查询的SQL。