93 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
从多个表里查询数据 
 | 
						|
==============================
 | 
						|
 | 
						|
 | 
						|
 | 
						|
如果要查询的数据需要从多个表中取时,需要在 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)
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
 |