1. SQL 左连接
SQL 左连接(LEFT JOIN)是一种联结类型,它会返回被连接表中所有行和匹配连接表中的行。所以,即使没有匹配的行,左表中所有的行也会被返回。左连接是指以左边的表为主,以右边的表为辅,保留左表中的全部字段及右表中在左表中有对应键值的记录。
1.1 SQL 左连接语法
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name = table_name2.column_name;
在使用 SQL 左连接时,需要在主表(左表)之后添加 LEFT JOIN 关键字,然后指定连接表 (右表)。 连接条件是使用 ON 关键字指定的。
1.2 SQL 左连接示例
下面是一张名为“employees”的员工表和一张名为“orders”的订单表,通过 SQL 左连接查询他们的数据:
employees表:
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | Jack | 5000 |
| 2 | Rose | 6000 |
| 3 | Lucy | 5500 |
| 4 | Kevin | 7000 |
+----+-------+--------+
orders表:
+-----+------------+-------+
| oid | order_date | price |
+-----+------------+-------+
| 1 | 2019-01-01 | 800 |
| 2 | 2019-02-01 | 1200 |
| 3 | 2019-03-01 | 500 |
+-----+------------+-------+
查询语句如下:
SELECT *
FROM employees
LEFT JOIN orders
ON employees.id = orders.oid;
查询结果如下:
+----+-------+--------+------+------------+-------+
| id | name | salary | oid | order_date | price |
+----+-------+--------+------+------------+-------+
| 1 | Jack | 5000 | NULL | NULL | NULL |
| 2 | Rose | 6000 | 1 | 2019-01-01 | 800 |
| 3 | Lucy | 5500 | 2 | 2019-02-01 | 1200 |
| 4 | Kevin | 7000 | 3 | 2019-03-01 | 500 |
+----+-------+--------+------+------------+-------+
左连接保留左表中所有字段,而右表中有对应键值的记录连接上了,否则为空。例如,Jack 没有对应的订单记录,因此 oid、order_date 和 price 字段为空。
2. SQL 右连接
SQL 右连接(RIGHT JOIN)是一种联结类型,它会返回右表中的所有行和匹配连接表中的行。所以,即使没有匹配的行,右表中所有的行也会被返回。右连接是指以右边的表为主,以左边的表为辅,保留右表中的全部字段及左表中在右表中有对应键值的记录。
2.1 SQL 右连接语法
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name = table_name2.column_name;
在使用 SQL 右连接时,需要在主表(右表)之后添加 RIGHT JOIN 关键字,然后指定连接表 (左表)。 连接条件是使用 ON 关键字指定的。
2.2 SQL 右连接示例
下面是一张名为“employees”的员工表和一张名为“orders”的订单表,通过 SQL 右连接查询他们的数据:
employees表:
+----+-------+--------+
| id | name | salary |
+----+-------+--------+
| 1 | Jack | 5000 |
| 2 | Rose | 6000 |
| 3 | Lucy | 5500 |
| 4 | Kevin | 7000 |
+----+-------+--------+
orders表:
+-----+------------+-------+
| oid | order_date | price |
+-----+------------+-------+
| 1 | 2019-01-01 | 800 |
| 2 | 2019-02-01 | 1200 |
| 3 | 2019-03-01 | 500 |
| 4 | 2019-04-01 | 1500 |
+-----+------------+-------+
查询语句如下:
SELECT *
FROM employees
RIGHT JOIN orders
ON employees.id = orders.oid;
查询结果如下:
+------+-------+--------+-----+------------+-------+
| id | name | salary | oid | order_date | price |
+------+-------+--------+-----+------------+-------+
| 2 | Rose | 6000 | 1 | 2019-01-01 | 800 |
| 3 | Lucy | 5500 | 2 | 2019-02-01 | 1200 |
| 4 | Kevin | 7000 | 3 | 2019-03-01 | 500 |
| NULL | NULL | NULL | 4 | 2019-04-01 | 1500 |
+------+-------+--------+-----+------------+-------+
右连接保留右表中所有字段,而左表中有对应键值的记录连接上了,否则为空。例如,订单表中的第四条记录没有对应的员工记录,因此 id、name 和 salary 字段为空。
3. SQL 左连接与右连接的区别
SQL 左连接与右连接最主要的区别在于它们返回结果集的规则。左连接返回左表中的所有记录以及与之匹配的右表记录。如果没有匹配,右表中的字段会显示为 NULL。而右连接返回右表中的所有记录以及与之匹配的左表记录。如果没有匹配,左表中的字段会显示为 NULL。
总结:
左连接是以左表为主,以右表为辅。它返回左表中的所有行和右表中匹配的行。
右连接是以右表为主,以左表为辅。它返回右表中的所有行和左表中匹配的行。
因此,需要根据业务需求来选择使用左连接还是右连接。
参考链接: