如果要查询的数据需要从多个表中取时,需要在 SELECT 语句中 FROM 关键字后用 JOIN… ON 将多个表关联起来查询。通常这多个表在业务上是有联系的,如某些字段值的定义和数据相同,这个联系条件就是连接条件,会体现在 ON 后面的括号里,ON 里也可以包括过滤条件。SQL 语法格式如下:

  1. SELECT select_list FROM table_name1 [INNER] JOIN table_name2 ON ( join_condition )
  2. WHERE query_condition
  3. ORDER BY column_list

返回满足连接条件的多个表数据

默认 JOIN 返回的结果会满足 ON 后面的连接条件,这个又叫内连接(INNER JOIN),通常关键字 INNER 省略了就表示内连接。JOIN 前后的表分别称之为左表和右表,ON 里的条件描述的是左表和右表的连接条件和过滤条件。如果没有ON 子句,那 INNER JOIN 返回的就是左表和右表的全部数据,这个也称为笛卡儿积。

SQL 返回的结果会在 JOIN 结果上再经过 WHERE 后的查询条件过滤以及根据 ORDER BY 后的列排序。

示例:**使用**JOIN从多个表里查询数据

  1. obclient> create table t1(id number not null primary key, name varchar(50));
  2. Query OK, 0 rows affected (0.08 sec)
  3. obclient> create table t2(id number not null primary key, name varchar(50));
  4. Query OK, 0 rows affected (0.06 sec)
  5. obclient> insert into t1 values(1,'A1'),(2,'B1'),(4,'D1'),(6,'F1'),(8,'H1'),(10,'J1');
  6. Query OK, 6 rows affected (0.01 sec)
  7. Records: 6 Duplicates: 0 Warnings: 0
  8. obclient> insert into t2 values(1,'B2'),(3,'C2'),(6,'F2'),(9,'I2');
  9. Query OK, 4 rows affected (0.01 sec)
  10. Records: 4 Duplicates: 0 Warnings: 0
  11. obclient> select t1.id, t1.name, t2.id, t2.name from t1 join t2 on (t1.id=t2.id) ;
  12. +----+------+----+------+
  13. | ID | NAME | ID | NAME |
  14. +----+------+----+------+
  15. | 1 | A1 | 1 | B2 |
  16. | 6 | F1 | 6 | F2 |
  17. +----+------+----+------+
  18. 2 rows in set (0.01 sec)

返回包含不满足连续条件的多个表数据

当需要 JOIN 返回的数据除了符合连接条件和过滤条件的数据外,还包括左表里满足左表的过滤条件但不满足连接条件的数据时,就可以使用左外连接(LEFT OUTER JOIN),也可以简写为左连接(LEFT JOIN)。左连接返回的结果里属于右表的数据如果不存在,则该列返回 NULL。

反之,如果 JOIN 返回的数据除了符合连接条件和过滤条件的数据外,还包括右表里满足右表的过滤条件但不满足连接条件的数据时,就可以使用右外连接(RIGHT OUTER JOIN),或简写为右连接(RIGHT JOIN)。右连接返回的结果里属于左表的数据如果不存在,则该列返回 NULL。

示例:LEFT JOIN和RIGHT JOIN示例

  1. obclient> select t1.id, t1.name, t2.id, t2.name from t1 left join t2 on (t1.id=t2.id) ;
  2. +----+------+----+------+
  3. | ID | NAME | ID | NAME |
  4. +----+------+----+------+
  5. | 1 | A1 | 1 | B2 |
  6. | 2 | B1 | NULL | NULL |
  7. | 4 | D1 | NULL | NULL |
  8. | 6 | F1 | 6 | F2 |
  9. | 8 | H1 | NULL | NULL |
  10. | 10 | J1 | NULL | NULL |
  11. +----+------+----+------+
  12. 6 rows in set (0.01 sec)
  13. obclient> select t1.id, t1.name, t2.id, t2.name from t1 right join t2 on (t1.id=t2.id) ;
  14. +----+------+----+------+
  15. | ID | NAME | ID | NAME |
  16. +----+------+----+------+
  17. | 1 | A1 | 1 | B2 |
  18. | NULL | NULL | 3 | C2 |
  19. | 6 | F1 | 6 | F2 |
  20. | NULL | NULL | 9 | I2 |
  21. +----+------+----+------+
  22. 4 rows in set (0.00 sec)