连接
功能描述
连接是将两个或者两个以上的表或视图的行列进行组合的查询。连接查询可返回单个表字段信息也可返回多表字段信息,用户可自定义。如果多表连接时有相同字段返回,则需对重复字段进行别名定义防止同名返回出错。一般连接查询都含一个或多个连接条件用于筛选需要返回的行数据,连接条件WHERE子句可以是相同字段连接,也可以是不同字段相同属性进行连接,还可以仅引用其中一个表的字段信息限制连接查询返回的行。数据库支持的连接查询包括:内连接、外连接、交叉连接。
内连接
内连接根据连接条件分为等值连接、不等值连接、自然连接。使用内连接时,返回满足条件的所有行数据,如果两个表的相关字段满足连接条件且查询未指定应返回的表的字段,则从这两个表中获取满足条件的数据并组合成新的记录。自连接是一种特殊的内连接,是对表自身的连接。
- 等值连接:连接条件为等值比较即使用
=
比较运算符。 - 不等值连接:等值连接的相反情况,使用
>
、<
、<>
、!=
、>=
、<=
比较运算符。 - 自然连接:特殊的等值连接,不可指定连接条件,数据库根据关系表中的相同字段进行条件连接,使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列,若无相同字段则返回连接表笛卡尔积。
示例
示例1
等值连接sqlSQL> CREATE TABLE pre_tb(id INT,name VARCHAR(30)); SQL> INSERT INTO pre_tb VALUES(1,'abc')(2,null)(3,'def'); SQL> CREATE TABLE pre_tb1(id INT,col1 VARCHAR(30)); SQL> INSERT INTO pre_tb1 VALUES(1,'abc')(2,null)(3,'def')(5,'two'); SQL> SELECT * FROM pre_tb t1 INNER JOIN pre_tb1 t2 ON t1.id=t2.id; ID | NAME | ID | COL1 | ------------------------------------------------------------------------------ 1 | abc| 1 | abc| 2 | <NULL>| 2 | <NULL>| 3 | def| 3 | def|
示例2
自然连接sqlSQL> SELECT * FROM pre_tb t1 NATURAL JOIN pre_tb1 t2; ID | NAME | COL1 | ------------------------------------------------------------------------------ 1 | abc| abc| 2 | <NULL>| <NULL>| 3 | def| def|
示例3
不等值连接sqlSQL> SELECT * FROM pre_tb t1 INNER JOIN pre_tb1 t2 ON t1.id>t2.id; ID | NAME | ID | COL1 | ------------------------------------------------------------------------------ 2 | <NULL>| 1 | abc| 3 | def| 1 | abc| 3 | def| 2 | <NULL>|
外连接
外连接根据需要返回的行分为左外连接、右外连接、全外连接。外连接返回满足连接条件的所有行并同时返回一个表中的部分或全部不满足另一个表中的行。
- 左外连接:返回左表所有的行数据,对于左表中右表没有匹配的所有行,包含右表列的任何列均返回
NULL
反之返回右表数据。 - 右外连接:返回右表所有的行数据,对于右表中左表没有匹配的所有行,包含左表列的任何列均返回
NULL
反之返回左表数据。
左外连接以左表为基准,右外连接以右表为基准,全外连接则以左右连表为基准。
示例
示例1
左外连接sqlSQL> CREATE TABLE out_tb(id INT,name VARCHAR(30)); SQL> INSERT INTO out_tb VALUES(1,'abc')(2,null)(3,'def')(4,'aaa'); SQL> CREATE TABLE out_tb1(id INT,col1 VARCHAR(30)); SQL> INSERT INTO out_tb1 VALUES(1,'abc')(2,null)(3,'def')(5,'two'); SQL> SELECT * FROM out_tb t1 LEFT JOIN out_tb1 t2 ON t1.id=t2.id; ID | NAME | ID | COL1 | ------------------------------------------------------------------------------ 1 | abc| 1 | abc| 2 | <NULL>| 2 | <NULL>| 3 | def| 3 | def| 4 | aaa| <NULL>| <NULL>|
示例2
右外连接sqlSQL> SELECT * FROM out_tb t1 RIGHT JOIN out_tb1 t2 ON t1.id=t2.id; ID | NAME | ID | COL1 | ------------------------------------------------------------------------------ 1 | abc| 1 | abc| 2 | <NULL>| 2 | <NULL>| 3 | def| 3 | def| <NULL>| <NULL>| 5 | two|
示例3
全外连接sqlSQL> SELECT * FROM out_tb t1 FULL JOIN out_tb1 t2 ON t1.id=t2.id; ID | NAME | ID | COL1 | ------------------------------------------------------------------------------ 1 | abc| 1 | abc| 2 | <NULL>| 2 | <NULL>| 3 | def| 3 | def| 4 | aaa| <NULL>| <NULL>| <NULL>| <NULL>| 5 | two|
交叉连接
交叉连接即笛卡尔积,无连接条件,数据库将返回一个表的每一行与另一个表的每一行相结合的结果行,若连接表数据量过多则应避免使用交叉连接产生过多数据。
示例
笛卡尔积:out_tb
表包含4行数据,out_tb1
表包含4行数据,则交叉连接后共16行数据。
sql
SQL> SELECT * FROM out_tb t1 CROSS JOIN out_tb1 t2;
ID | NAME | ID | COL1 |
------------------------------------------------------------------------------
1 | abc| 1 | abc|
1 | abc| 2 | <NULL>|
1 | abc| 3 | def|
1 | abc| 5 | two|
2 | <NULL>| 1 | abc|
2 | <NULL>| 2 | <NULL>|
2 | <NULL>| 3 | def|
2 | <NULL>| 5 | two|
3 | def| 1 | abc|
3 | def| 2 | <NULL>|
3 | def| 3 | def|
3 | def| 5 | two|
4 | aaa| 1 | abc|
4 | aaa| 2 | <NULL>|
4 | aaa| 3 | def|
4 | aaa| 5 | two|