什么是连接
连接(join)查询是基于多个表中的关联字段将数据行拼接到一起,可以同时返回多个表中的数据。
下面以两个表为例子,举例说明一下不同的连接。
SELECT * FROM products
id | name | price | detail | vender_id |
---|---|---|---|---|
1 | 苹果 | 3.5 | 花牛苹果 | 1 |
2 | 蜜桃 | 3.5 | 秦安蜜桃 | 1 |
3 | 香蕉 | 2.5 | 海南香蕉 | 2 |
4 | 椰子 | 4.5 | 海南椰子 | 2 |
5 | 火龙果 | 3.5 | 红心火龙果 | NULL |
6 | 柚子 | 红柚 | 3.5 | NULL |
SELECT * FROM vendors
id | name | phone | location |
---|---|---|---|
1 | 秦安水果王 | 666999 | 秦安县 |
2 | 海南水果 | 666888 | 海南岛 |
3 | 泰国进口水果 | 123456 | 泰国 |
4 | 菲律宾进口水果 | 321654 | 菲律宾 |
SQL连接类型
内连接(inner join)
用于返回两个表中满足连接条件的数据行。
SELECT
p.id, p.name, p.vender_id, v.id, v.name
FROM
products AS p
JOIN
vendors AS v ON p.vender_id = v.id
id | name | vender_id | id | name |
---|---|---|---|---|
1 | 苹果 | 1 | 1 | 秦安水果王 |
2 | 蜜桃 | 1 | 1 | 秦安水果王 |
3 | 香蕉 | 2 | 2 | 海南水果 |
4 | 椰子 | 2 | 2 | 海南水果 |
左外连接(left outer join)
返回左表中所有的数据行,对于右表中的数据,如果没有匹配的值,返回空值。
SELECT
p.id, p.name, p.vender_id, v.id, v.name
FROM
products AS p
LEFT JOIN
vendors AS v ON p.vender_id = v.id
id | name | vender_id | id | name |
---|---|---|---|---|
1 | 苹果 | 1 | 1 | 秦安水果王 |
2 | 蜜桃 | 1 | 1 | 秦安水果王 |
3 | 香蕉 | 2 | 2 | 海南水果 |
4 | 椰子 | 2 | 2 | 海南水果 |
5 | 火龙果 | NULL | NULL | NULL |
6 | 柚子 | NULL | NULL | NULL |
右外连接(right outer join)
返回右表中所有的数据行,对于左表中的数据,如果没有匹配的值,返回空值。
SELECT
p.id, p.name, p.vender_id, v.id, v.name
FROM
products AS p
RIGHT JOIN
vendors AS v ON p.vender_id = v.id
id | name | vender_id | id | name |
---|---|---|---|---|
1 | 苹果 | 1 | 1 | 秦安水果王 |
2 | 蜜桃 | 1 | 1 | 秦安水果王 |
3 | 香蕉 | 2 | 2 | 海南水果 |
4 | 椰子 | 2 | 2 | 海南水果 |
NULL | NULL | NULL | 3 | 泰国进口水果 |
NULL | NULL | NULL | 4 | 菲律宾进口水果 |
全外连接(full outer join)
等价于左外连接加上右外连接,返回左表和右表中所有的数据行,MySQL 不支持全外连接。
交叉连接(cross join)
交叉连接,也称为笛卡尔积,两个表的笛卡尔积相当于一个表的所有行和另一个表的所有行两两组合,结果的数量为两个表的行数相乘。
自连接(self join)
是指连接操作符的两边都是同一个表,没什么特别的,可以认为是把一个表复制一份后,和它原来的表进行各种连接操作。