[TOC] # 从多个表里查询数据 果要查询的数据需要从多个表中取时,需要在 SELECT 语句中 FROM 关键字后用 JOIN… ON 将多个表关联起来查询。通常这多个表在业务上是有联系的,如某些字段值的定义和数据相同,这个联系条件就是连接条件,会体现在 ON 后面的括号里,ON 里也可以包括过滤条件。SQL 语法格式如下: ~~~ SELECT select_list FROM table_name1 [INNER] JOIN table_name2 ON ( join_condition ) WHERE query_condition ORDER BY column_list ~~~ ## 返回满足连接条件的多个表数据 默认 JOIN 返回的结果会满足 ON 后面的连接条件,这个又叫内连接(INNER JOIN),通常关键字 INNER 省略了就表示内连接。JOIN 前后的表分别称之为左表和右表,ON 里的条件描述的是左表和右表的连接条件和过滤条件。如果没有ON 子句,那 INNER JOIN 返回的就是左表和右表的全部数据,这个也称为笛卡儿积。 SQL 返回的结果会在 JOIN 结果上再经过 WHERE 后的查询条件过滤以及根据 ORDER BY 后的列排序。 **示例:****使用****JOIN从多个表里查询数据** ~~~ obclient> create table t1(id number not null primary key, name varchar(50)); Query OK, 0 rows affected (0.08 sec) obclient> create table t2(id number not null primary key, name varchar(50)); Query OK, 0 rows affected (0.06 sec) obclient> insert into t1 values(1,'A1'),(2,'B1'),(4,'D1'),(6,'F1'),(8,'H1'),(10,'J1'); Query OK, 6 rows affected (0.01 sec) Records: 6 Duplicates: 0 Warnings: 0 obclient> insert into t2 values(1,'B2'),(3,'C2'),(6,'F2'),(9,'I2'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 obclient> select t1.id, t1.name, t2.id, t2.name from t1 join t2 on (t1.id=t2.id) ; +----+------+----+------+ | ID | NAME | ID | NAME | +----+------+----+------+ | 1 | A1 | 1 | B2 | | 6 | F1 | 6 | F2 | +----+------+----+------+ 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示例** ~~~ obclient> select t1.id, t1.name, t2.id, t2.name from t1 left join t2 on (t1.id=t2.id) ; +----+------+----+------+ | ID | NAME | ID | NAME | +----+------+----+------+ | 1 | A1 | 1 | B2 | | 2 | B1 | NULL | NULL | | 4 | D1 | NULL | NULL | | 6 | F1 | 6 | F2 | | 8 | H1 | NULL | NULL | | 10 | J1 | NULL | NULL | +----+------+----+------+ 6 rows in set (0.01 sec) obclient> select t1.id, t1.name, t2.id, t2.name from t1 right join t2 on (t1.id=t2.id) ; +----+------+----+------+ | ID | NAME | ID | NAME | +----+------+----+------+ | 1 | A1 | 1 | B2 | | NULL | NULL | 3 | C2 | | 6 | F1 | 6 | F2 | | NULL | NULL | 9 | I2 | +----+------+----+------+ 4 rows in set (0.00 sec) ~~~