SQL join(连接)- 左连接、右连接、内连接 &慢查询(Join、explain)

SQL join(连接): 用于把来自两个或多个表的行结合起来。

下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。

在这里插入图片描述

  • INNER JOIN:内连接,又叫等值连接,只返回两个表中连接字段相等的行。
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行,右边为空字段补null
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行,左边为空字段补null
  • FULL JOIN:外连接,返回两个表中的行:left join + right join。
  • CROSS JOIN : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

FULL OUTER JOIN 用法:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

得到的结果数
inner join <= min(left join, right join)
full join >= max(left join, right join)
当 inner join < min(left join, right join) 时, full join > max(left join, right join)

表连接的逻辑

首先,连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表

左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接

外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。

在使用 left join 时,on 和 where 条件的区别如下:

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

  1. on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
  2. where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

举例说明:
A表(a1,b1,c1)
B表(a2,b2)

在这里插入图片描述
在这里插入图片描述

左连接

SELECT A.\*,B.\* FROM A left outer join on (A.a1 = B.a2);

结果:
在这里插入图片描述

右连接

SELECT A.\*,B.\* FROM A right outer join B on (A.a1 = B.a2);** 

结果:
在这里插入图片描述

内连接

从多个表中返回满足 JOIN 条件的所有行。

SELECT A.\*,B.\* FROM A inner join B ON (A.a1 = B.a2);

自然连接

SELECT * FROM A,B WHERE A.a1 = B.a2;

结果:
在这里插入图片描述

union & union all

合并两个或多个SQL语句的结果集(重复或不重复)
在这里插入图片描述

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同

SQL union用法:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL union all用法:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

使用UNION命令时需要注意,只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序!绝对不能写两个ORDER BY命令。

另外,在使用ORDER BY排序时,注意两个结果的别名保持一致,使用别名排序很方便。当然也可以使用列数。

ORDER BY 除了可以对指定的字段进行排序,还可以使用函数进行排序:

order by abs(a);

ORDER BY 只能当前 SQL 查询结果进行排序,如要对 union all 出来的结果进行排序,需要先做集合。

select aa.* from 
(select country,name from websites where country = 'CN'
union all select country,app_name from apps where country='CN' ) aa
order by aa.name;

EXPLAIN

可以模拟优化器执行SQL查询语句,从而指导MySQL是如何处理你的SQL语句的。可用来分析查询语句或表结构的性能瓶颈。可以查看:

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 哪些索引可以使用
  4. 哪些索引被实际使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询

EXPLAIN用法

EXPLAIN SQL语句
例:EXPLAIN SELECT * FROM ‘Table’ LIMIT 3,5

  1. type:查询使用类型 system > const > eq_ref > ref > range > index > all
  2. possible_keys:查询涉及到的字段上若存在索引就会列出,但不一定会被用到
  3. key:实际查询中用到的索引
  4. rows:查询数据时扫描的行数,越少越好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章