SQL之JOIN连接的概念和优化

  • 目录
  • 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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章