浅析Mysql Join语法以及性能优化

mysql中using的用法为:

一.Join语法概述

using()用于两张表的join查询,要求using()指定的列在两个表中均存在,并使用之用于join的条件。

join 用于多表中字段之间的联系,语法如下:

示例:

复制代码 代码如下:

复制代码 代码如下: select a.*, b.* from
a left join b using(colA);

… FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona

等同于:

table1:左表;table2:右表。

复制代码 代码如下: select a.*, b.* from
a left join b on a.colA = b.colA;

JOIN 按照功能大致分为如下三类:

以上所述就是本文的全部内容,希望大家能够喜欢。

INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。

LEFT
JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。

RIGHT JOIN(右连接):与 LEFT JOIN
相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。

注意:mysql不支持Full join,不过可以通过UNION 关键字来合并 LEFT JOIN 与
RIGHT JOIN来模拟FULL join.

接下来给出一个列子用于解释下面几种分类。如下两个表(A,B)

复制代码 代码如下:

mysql> select A.id,A.name,B.name from A,B where A.id=B.id;
+—-+———–+————-+
| id | name       | name             |
+—-+———–+————-+
|  1 | Pirate       | Rutabaga      |
|  2 | Monkey    | Pirate            |
|  3 | Ninja         | Darth Vader |
|  4 | Spaghetti  | Ninja             |
+—-+———–+————-+
4 rows in set (0.00 sec)

二.Inner join

内连接,也叫等值连接,inner join产生同时符合A和B的一组数据。

复制代码 代码如下:

mysql> select * from A inner join B on A.name = B.name;
浅析Mysql Join语法以及性能优化。+—-+——–+—-+——–+
| id | name   | id | name   |
+—-+——–+—-+——–+
|  1 | Pirate |  2 | Pirate |
|  3 | Ninja  |  4 | Ninja  |
+—-+——–+—-+——–+

图片 1

三.Left join

复制代码 代码如下:

mysql> select * from A left join B on A.name = B.name;
#或者:select * from A left outer join B on A.name = B.name;

+—-+———–+——+——–+
| id | name      | id   | name   |
+—-+———–+——+——–+
|  1 | Pirate    |    2 | Pirate |
|  2 | Monkey    | NULL | NULL   |
|  3 | Ninja     |    4 | Ninja  |
|  4 | Spaghetti | NULL | NULL   |
+—-+———–+——+——–+
4 rows in set (0.00 sec)

left join,(或left outer join:在Mysql中两者等价,推荐使用left
join.)左连接从左表(A)产生一套完整的记录,与匹配的记录(右表(B))
.如果没有匹配,右侧将包含null。

图片 2

如果想只从左表(A)中产生一套记录,但不包含右表(B)的记录,可以通过设置where语句来执行,如下:

复制代码 代码如下:

mysql> select * from A left join B on A.name=B.name where A.id is
null or B.id is null;
+—-+———–+——+——+
| id | name      | id   | name |
+—-+———–+——+——+
|  2 | Monkey    | NULL | NULL |
|  4 | Spaghetti | NULL | NULL |
+—-+———–+——+——+
2 rows in set (0.00 sec)

图片 3

同理,还可以模拟inner join. 如下:

复制代码 代码如下:

mysql> select * from A left join B on A.name=B.name where A.id is
not null and B.id is not null;
+—-+——–+——+——–+
| id | name   | id   | name   |
+—-+——–+——+——–+
|  1 | Pirate |    2 | Pirate |
|  3 | Ninja  |    4 | Ninja  |
+—-+——–+——+——–+
2 rows in set (0.00 sec)

求差集:

根据上面的例子可以求差集,如下:

复制代码 代码如下:

SELECT * FROM A LEFT JOIN B ON A.name = B.name
WHERE B.id IS NULL
union
SELECT * FROM A right JOIN B ON A.name = B.name
WHERE A.id IS NULL;
# 结果
    +——+———–+——+————-+
| id   | name      | id   | name        |
+——+———–+——+————-+
|    2 | Monkey    | NULL | NULL        |
|    4 | Spaghetti | NULL | NULL        |
| NULL | NULL      |    1 | Rutabaga    |
| NULL | NULL      |    3 | Darth Vader |
+——+———–+——+————-+

图片 4

四.Right join

复制代码 代码如下:

mysql> select * from A right join B on A.name = B.name;
+——+——–+—-+————-+
| id   | name   | id | name        |
+——+——–+—-+————-+
| NULL | NULL   |  1 | Rutabaga    |
|    1 | Pirate |  2 | Pirate      |
| NULL | NULL   |  3 | Darth Vader |
|    3 | Ninja  |  4 | Ninja       |
+——+——–+—-+————-+
4 rows in set (0.00 sec)

同left join。

五.Cross join

cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积

笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),
(b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。

复制代码 代码如下:

mysql> select * from A cross join B;
+—-+———–+—-+————-+
| id | name      | id | name        |
+—-+———–+—-+————-+
|  1 | Pirate    |  1 | Rutabaga    |
|  2 | Monkey    |  1 | Rutabaga    |
|  3 | Ninja     |  1 | Rutabaga    |
|  4 | Spaghetti |  1 | Rutabaga    |
|  1 | Pirate    |  2 | Pirate      |
|  2 | Monkey    |  2 | Pirate      |
|  3 | Ninja     |  2 | Pirate      |
|  4 | Spaghetti |  2 | Pirate      |
|  1 | Pirate    |  3 | Darth Vader |
|  2 | Monkey    |  3 | Darth Vader |
|  3 | Ninja     |  3 | Darth Vader |
|  4 | Spaghetti |  3 | Darth Vader |
|  1 | Pirate    |  4 | Ninja       |
|  2 | Monkey    |  4 | Ninja       |
|  3 | Ninja     |  4 | Ninja       |
|  4 | Spaghetti |  4 | Ninja       |
+—-+———–+—-+————-+
16 rows in set (0.00 sec)

发表评论

电子邮件地址不会被公开。 必填项已用*标注