多示例快速明白 SQL 连接查询

什么是连接

连接(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)

是指连接操作符的两边都是同一个表,没什么特别的,可以认为是把一个表复制一份后,和它原来的表进行各种连接操作。