首批通过分布式安全可靠测评,为关键业务系统打造
LEFT JOIN
更新时间:2026-06-30 18:51:37
左联接(LEFT JOIN)表示左外联接,该语句返回左表中的所有行,不包括右表中不匹配的行。
背景信息
外联接(OUTER JOIN)是使用比较运算符对两个表中的数据进行比较,联接结果不仅包含符合联接条件的行,同时也包含不符合条件的行。
外联接包括全联接(FULL JOIN)、左联接(LEFT JOIN)和右联接(RIGHT JOIN)。外联接返回满足联接条件的所有行,同时从一个表返回没有使用的行,在另一个表相应位置填充 NULL。
本文主要提供左联接的示例指导,全联接相关示例请参见 全联接,右联接相关示例请参见 右联接。
LEFT JOIN 语法
外联接语句中一般包括左表和右表,出现在 JOIN 子句最左边的为左表,出现在 JOIN 子句最右边的为右表。
LEFT JOIN 的语法格式如下:
SELECT select_list FROM table_name1 LEFT JOIN table_name2 ON join_condition
[ WHERE query_condition ]
[ ORDER BY column_list ];
其中,table_name1 为左表,table_name2 为右表。
示例
创建示例表并插入适当数据。
obclient [SYS]> CREATE TABLE tbl_a(id NUMBER NOT NULL PRIMARY KEY, name VARCHAR2(50));
Query OK, 0 rows affected
obclient [SYS]> CREATE TABLE tbl_b(num NUMBER NOT NULL PRIMARY KEY, value NUMBER);
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO tbl_a VALUES(1,'ab'),(2,'cd'),(3,'ef'),(4,'gh');
Query OK, 6 rows affected
Records: 6 Duplicates: 0 Warnings: 0
obclient [SYS]> INSERT INTO tbl_b VALUES(1,1001),(3,1003),(5,1005);
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0
简单左联接查询
当需要 JOIN 返回的数据除了符合联接条件和过滤条件的数据外,还包括左表里满足左表的过滤条件但不满足联接条件的数据时,就可以使用左联接。左联接返回的结果中属于右表的数据如果不存在,则该列返回 NULL。
示例 1:将表 tbl_a 和表 tbl_b 执行全联接查询,并获取返回结果。
obclient [SYS]> SELECT * FROM tbl_a;
+----+------+
| ID | NAME |
+----+------+
| 1 | ab |
| 2 | cd |
| 3 | ef |
| 4 | gh |
+----+------+
4 rows in set
obclient [SYS]> SELECT * FROM tbl_b;
+-----+-------+
| NUM | VALUE |
+-----+-------+
| 1 | 1001 |
| 3 | 1003 |
| 5 | 1005 |
+-----+-------+
3 rows in set
obclient [SYS]> SELECT tbl_a.id, tbl_a.name, tbl_b.num, tbl_b.value FROM tbl_a LEFT JOIN tbl_b on (tbl_a.id=tbl_b.num);
+------+------+--------+-------+
| ID | NAME | NUM | VALUE |
+------+------+--------+-------+
| 1 | ab | 1 | 1001 |
| 2 | cd | NULL | NULL |
| 3 | ef | 3 | 1003 |
| 4 | gh | NULL | NULL |
+------+------+--------+-------+
4 rows in set
左联接和 WHERE 子句联合使用
您可以使用左联接获取联接结果,再使用 WHERE 子句对联接结果进行过滤。
obclient [SYS]> SELECT * FROM tbl_a;
+----+------+
| ID | NAME |
+----+------+
| 1 | ab |
| 2 | cd |
| 3 | ef |
| 4 | gh |
+----+------+
4 rows in set
obclient [SYS]> SELECT * FROM tbl_b;
+-----+-------+
| NUM | VALUE |
+-----+-------+
| 1 | 1001 |
| 3 | 1003 |
| 5 | 1005 |
+-----+-------+
3 rows in set
obclient [SYS]> SELECT tbl_a.id, tbl_a.name, tbl_b.num, tbl_b.value FROM tbl_a LEFT JOIN tbl_b ON tbl_a.id=tbl_b.num WHERE tbl_b.num IS NOT NULL;
+----+------+-----+-------+
| ID | NAME | NUM | VALUE |
+----+------+-----+-------+
| 1 | ab | 1 | 1001 |
| 3 | ef | 3 | 1003 |
+----+------+-----+-------+
2 rows in set