|
@@ -51,7 +51,7 @@ insert into table2 select 3, 70
|
|
|
|
|
|
### 1、概念
|
|
### 1、概念
|
|
|
|
|
|
-内联接:也称等值连接,返回两张表都满足条件的部分
|
|
|
|
|
|
+内联接:也称等值连接,返回两张表都满足连接条件的部分
|
|
|
|
|
|
> 注释:inner join 就等于 join
|
|
> 注释:inner join 就等于 join
|
|
|
|
|
|
@@ -83,26 +83,27 @@ select * from table1 inner join table2 on table1.id = table2.id
|
|
<td>100</td>
|
|
<td>100</td>
|
|
</tr>
|
|
</tr>
|
|
</table>
|
|
</table>
|
|
|
|
+
|
|
> 注释:只返回符合条件的 table1 和 table2 的列
|
|
> 注释:只返回符合条件的 table1 和 table2 的列
|
|
|
|
|
|
-与下列执行效果相同
|
|
|
|
|
|
+与下列执行结果相同
|
|
|
|
|
|
```sql
|
|
```sql
|
|
A: select a.*, b.* from table1 a, table2 b where a.id = b.id
|
|
A: select a.*, b.* from table1 a, table2 b where a.id = b.id
|
|
B: select * from table1 cross join table2 where table1.id = table2.id
|
|
B: select * from table1 cross join table2 where table1.id = table2.id
|
|
```
|
|
```
|
|
|
|
|
|
-> 注释:cross join 后加条件只能用 where,不能用 on
|
|
|
|
|
|
+> 注释:现已不建议使用 A 方法进行内连接取数,cross join 后加条件只能用 where,不能用 on
|
|
|
|
|
|
## 二、外连接
|
|
## 二、外连接
|
|
|
|
|
|
### 1、概念
|
|
### 1、概念
|
|
|
|
|
|
-包括左向外联接(left join)、右向外联接(right join)或完整外部联接
|
|
|
|
|
|
+包括左外联接(left join)、右外联接(right join)或完整外部联接
|
|
|
|
|
|
-### 2、左连接:left join 或 left outer join
|
|
|
|
|
|
+### 2、左连接
|
|
|
|
|
|
-(1)左向外联接的结果集包括 left outer 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
|
|
|
|
|
|
+(1)左外联接(left join 或 left outer join)的结果集包括左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
|
|
|
|
|
|
(2)SQL 语句
|
|
(2)SQL 语句
|
|
|
|
|
|
@@ -138,11 +139,12 @@ select * from table1 left join table2 on table1.id = table2.id
|
|
<td>NULL</td>
|
|
<td>NULL</td>
|
|
</tr>
|
|
</tr>
|
|
</table>
|
|
</table>
|
|
-> 注释:包含 table1 的所有子句,根据指定条件返回 table2 相应的字段,不符合的以 null 显示
|
|
|
|
|
|
|
|
-### 3、右连接:right join 或 right outer join
|
|
|
|
|
|
+> 注释:包含 table1 的所有行,根据指定条件返回 table2 相应的字段,不符合的以 null 显示
|
|
|
|
+
|
|
|
|
+### 3、右连接
|
|
|
|
|
|
-(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
|
|
|
|
|
|
+(1)右外联接(right join 或 right outer join)是左外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
|
|
|
|
|
|
(2)SQL 语句
|
|
(2)SQL 语句
|
|
|
|
|
|
@@ -178,11 +180,12 @@ select * from table1 right join table2 on table1.id = table2.id
|
|
<td>70</td>
|
|
<td>70</td>
|
|
</tr>
|
|
</tr>
|
|
</table>
|
|
</table>
|
|
-> 注释:包含 table2 的所有子句,根据指定条件返回 table1 相应的字段,不符合的以 null 显示
|
|
|
|
|
|
|
|
-### 4、完整外部联接:full join 或 full outer join
|
|
|
|
|
|
+> 注释:包含 table2 的所有行,根据指定条件返回 table1 相应的字段,不符合的以 null 显示
|
|
|
|
+
|
|
|
|
+### 4、完整外部联接
|
|
|
|
|
|
-(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
|
|
|
|
|
|
+(1)完整外部联接(full join 或 full outer join)包含左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
|
|
|
|
|
|
(2)SQL 语句
|
|
(2)SQL 语句
|
|
|
|
|
|
@@ -224,6 +227,7 @@ select * from table1 full join table2 on table1.id = table2.id
|
|
<td>70</td>
|
|
<td>70</td>
|
|
</tr>
|
|
</tr>
|
|
</table>
|
|
</table>
|
|
|
|
+
|
|
> 注释:返回左右连接的和(见上左、右连接)
|
|
> 注释:返回左右连接的和(见上左、右连接)
|
|
|
|
|
|
## 三、交叉连接(完全)
|
|
## 三、交叉连接(完全)
|
|
@@ -302,13 +306,8 @@ select * from table1 cross join table2
|
|
<td>70</td>
|
|
<td>70</td>
|
|
</tr>
|
|
</tr>
|
|
</table>
|
|
</table>
|
|
-> 注释:返回 3*3=9 条记录,即笛卡尔积
|
|
|
|
-
|
|
|
|
-等价(与下列执行效果相同)
|
|
|
|
|
|
|
|
-```sql
|
|
|
|
-A: select * from table1, table2
|
|
|
|
-```
|
|
|
|
|
|
+> 注释:返回 3*3=9 条记录,即笛卡尔积
|
|
|
|
|
|
## 三、多表更新、删除
|
|
## 三、多表更新、删除
|
|
|
|
|
|
@@ -449,6 +448,7 @@ delete from table1 where not exists(select 1 from table2 b where table1.id = b.i
|
|
<td>70</td>
|
|
<td>70</td>
|
|
</tr>
|
|
</tr>
|
|
</table>
|
|
</table>
|
|
|
|
+
|
|
> 注释:将 table2 表中未使用的 table1 表编号删除
|
|
> 注释:将 table2 表中未使用的 table1 表编号删除
|
|
|
|
|
|
|
|
|
|
@@ -491,5 +491,6 @@ delete from table1 where exists(select 1 from table2 b where table1.id = b.id)
|
|
<td>70</td>
|
|
<td>70</td>
|
|
</tr>
|
|
</tr>
|
|
</table>
|
|
</table>
|
|
|
|
+
|
|
> 注释:将 table2 表中使用的 table1 表编号删除
|
|
> 注释:将 table2 表中使用的 table1 表编号删除
|
|
|
|
|