从多个表里查询数据 
==============================



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

```javascript
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从多个表里查询数据** 

```javascript
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示例** 

```javascript
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)
```



