首页MySQL连接查询 JOIN Clause
Created At : 2021-11-13
Last Updated: 2022-02-10

MySQL连接查询 JOIN Clause

连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。

TIP

联结的英文是 join

join on 基本解释

(使)与某物相连, (使)与某人联合;加在…之上

简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。

为什么要使用联结?

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。

如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?答案是使用联结。

简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。

使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

创建联结

联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。

 -- FROM 子句列出了两个表,用逗号隔开,即SELECT语句联结的两个表
 -- 通过WHERE 子句正确联结,指定匹配关系
 SELECT prod_name,prod_price,vend_name 
 FROM vendors,products 
 WHERE vendors.vend_id = products.vend_id 
 ORDER BY vend_name;
 
 -- output
 prod_name     |prod_price|vend_name  |
--------------+----------+-----------+
Detonator     |     13.00|ACME       |
Bird seed     |     10.00|ACME       |
Carrots       |      2.50|ACME       |
Safe          |     50.00|ACME       |
Sling         |      4.49|ACME       |
TNT (1 stick) |      2.50|ACME       |
TNT (5 sticks)|     10.00|ACME       |
.5 ton anvil  |      5.99|Anvils R Us|
1 ton anvil   |      9.99|Anvils R Us|
2 ton anvil   |     14.99|Anvils R Us|
JetPack 1000  |     35.00|Jet Set    |
JetPack 2000  |     55.00|Jet Set    |
Fuses         |      3.42|LT Supplies|
Oil can       |      8.99|LT Supplies|

WHERE子句的重要性?

请记住,在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。

FROM要做的是将第一个表中的每一行与第二个表中的每一行配对。

而WHERE子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。

WARNING

笛卡尔积:如果没有给定联结条件,则两个表进行匹配时,返回的数据的行的数目将是第一个表中的行数乘以第二个表中的行数。即笛卡尔积。

笛卡尔积并不是我们想要的结果,因此不要忘记了where子句。

内部联结/等值联结

上述联结是基于两个表之间的相等测试,称为等值联结(equijoin)。

等值联结也称为内部联结,并可以使用稍微不同的语法来明确指定联结的类型。

-- 使用INNER JOIN-- ON 语法
SELECT prod_name,prod_price,vend_name FROM vendors 
INNER JOIN products ON vendors.vend_id = products.vend_id 
ORDER BY vend_name
-- 输出结果相同
prod_name     |prod_price|vend_name  |
--------------+----------+-----------+
Detonator     |     13.00|ACME       |
Bird seed     |     10.00|ACME       |
Carrots       |      2.50|ACME       |
Safe          |     50.00|ACME       |
Sling         |      4.49|ACME       |
TNT (1 stick) |      2.50|ACME       |
TNT (5 sticks)|     10.00|ACME       |
.5 ton anvil  |      5.99|Anvils R Us|
1 ton anvil   |      9.99|Anvils R Us|
2 ton anvil   |     14.99|Anvils R Us|
JetPack 1000  |     35.00|Jet Set    |
JetPack 2000  |     55.00|Jet Set    |
Fuses         |      3.42|LT Supplies|
Oil can       |      8.99|LT Supplies|

推荐使用INNER JOIN-- ON,明确联结语法的意义,并不会忘记联结条件

⚡ 等值连接可以联结多个表,并不限于两个表**,但是通常联结的表越多,性能下降的越厉害。**

-- join multiple tables 多个表的等值联结
SELECT prod_name, vend_name, prod_price, quantity
  FROM orderitems, products, vendors
  WHERE products.vend_id = vendors.vend_id
    AND orderitems.prod_id = products.prod_id
    AND order_num = 20005;
    
-- 或者
SELECT prod_name, vend_name, prod_price, quantity
  from products p inner join vendors v on p.vend_id = v.vend_id
  inner join orderitems o on p.prod_id = o.prod_id 
  and o.order_num = 20005;
    
-- +----------------+-------------+------------+----------+
-- | prod_name      | vend_name   | prod_price | quantity |
-- +----------------+-------------+------------+----------+
-- | .5 ton anvil   | Anvils R Us |       5.99 |       10 |
-- | 1 ton anvil    | Anvils R Us |       9.99 |        3 |
-- | TNT (5 sticks) | ACME        |      10.00 |        5 |
-- | Bird seed      | ACME        |      10.00 |        1 |
-- +----------------+-------------+------------+----------+


--  多表inner join  on 的语法如下
-- 两表
SELECT * FROM1 INNER JOIN2 ON1.字段号=2.字段号
-- 三表
SELECT * FROM (1 INNER JOIN2 ON1.字段号=2.字段号) INNER JOIN3 ON1.字段号=3.字段号
-- 四表
SELECT * FROM ((1 INNER JOIN2 ON1.字段号=2.字段号) INNER JOIN3 ON1.字段号=3.字段号) 
INNER JOIN4 ON Member.字段号=4.字段号