SQL的连接

基础数据准备

创建两张用于测试的表

--用户表create table test_user(id int, name varchar(10));--工作信息表create table test_job(id int, job varchar(10));

分别插入两条测试数据

--往用户表中插入数据insert into test_user values(1, '张三');insert into test_user values(2, '李四');insert into test_user values(3, '王五');--往工作表中插入数据insert into test_job values(1, '医生');insert into test_job values(2, '律师');insert into test_job values(4, '神仙');

内连接

  1. 内连接(典型的连接运算,使用像 = 或 之类的比较运算符)。

  2. 包括相等连接和自然连接。

  3. 内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

SQL> select a.*, b.* from test_user a inner join test_job b on a.id = b.id;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             2 律师

等价于

SQL> select a.*, b.* from test_user a, test_job b where a.id = b.id;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             2 律师

连接的时候 on 和 普通的 where 一样,可以使用 and 和 or 关联多个条件,比如下面的SQL

SQL> select a.*, b.* from test_user a inner join test_job b on a.id = b.id and a.id = 1;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生

外连接

  1. left join 或 left outer join

左向外联接的结果集包括 left outer子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。

  1. 如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

  2. right join 或 right outer join

右向外联接是左向外联接的反向联接。将返回右表的所有行。

  1. 如果右表的某行在左表中没有匹配行,则将为左表返回空值。

  2. full join 或 full outer join

完整外部联接返回左表和右表中的所有行。

  1. 当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。

  2. 如果表之间有匹配行,则整个结果集行包含基表的数据值。

左(外)连接

使用left join和使用left outer join的效果相同

SQL> select a.*, b.* from test_user a left join test_job b on a.id = b.id;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             2 律师                                      3 王五                                              nil

左(外)连接的时候,from后面的表或视图的顺序很重要

SQL> select a.*, b.* from test_job b left join test_user a on a.id = b.id;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             2 律师                                        nil                                              4 神仙

右(外)连接

使用right join和使用right outer join的效果相同

SQL> select a.*, b.* from test_user a right join test_job b on a.id = b.id;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             2 律师                                       nil                                               4 神仙

右(外)连接的时候,from后面的表或视图的顺序很重要

SQL> select a.*, b.* from test_job b right join test_user a on a.id = b.id;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             2 律师                                      3 王五                                              nil 

全(外)连接

使用full join和使用full outer join的效果相同

SQL> select a.*, b.* from test_user a full join test_job b on a.id = b.id;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             2 律师                                        nil                                              4 神仙                                      3 王五                                               nil

交叉连接

  1. 交叉连接返回左表中所有的行,左表中的每一行与右表中的所有行组合。交叉连接又称作笛卡尔积。

  2. from 子句中的表或视图可通过内连接或完全外连接按任意顺序制定

  3. 但是,用左或右外连接指定表或视图时,表或视图的顺序很重要。

SQL 1

SQL> select * from test_user cross join test_job;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             1 医生                                      3 王五                                             1 医生                                      1 张三                                             2 律师                                      2 李四                                             2 律师                                      3 王五                                             2 律师                                      1 张三                                             4 神仙                                      2 李四                                             4 神仙                                      3 王五                                             4 神仙9 rows selected

SQL 2:可以看出搜索结果和from后面的表顺序有关

SQL> select * from test_job cross join test_user;                                     ID JOB                                             ID NAME--------------------------------------- ---------- --------------------------------------- ----------                                      1 医生                                             1 张三                                      2 律师                                             1 张三                                      4 神仙                                             1 张三                                      1 医生                                             2 李四                                      2 律师                                             2 李四                                      4 神仙                                             2 李四                                      1 医生                                             3 王五                                      2 律师                                             3 王五                                      4 神仙                                             3 王五9 rows selected

SQL 3:下面的where语句格式等价SQL 1交叉连接

SQL> select * from test_user, test_job;                                     ID NAME                                            ID JOB--------------------------------------- ---------- --------------------------------------- ----------                                      1 张三                                             1 医生                                      2 李四                                             1 医生                                      3 王五                                             1 医生                                      1 张三                                             2 律师                                      2 李四                                             2 律师                                      3 王五                                             2 律师                                      1 张三                                             4 神仙                                      2 李四                                             4 神仙                                      3 王五                                             4 神仙9 rows selected

SQL 3:下面的where语句格式等价SQL 2交叉连接

SQL> select * from test_job, test_user;                                     ID JOB                                             ID NAME--------------------------------------- ---------- --------------------------------------- ----------                                      1 医生                                             1 张三                                      2 律师                                             1 张三                                      4 神仙                                             1 张三                                      1 医生                                             2 李四                                      2 律师                                             2 李四                                      4 神仙                                             2 李四                                      1 医生                                             3 王五                                      2 律师                                             3 王五                                      4 神仙                                             3 王五9 rows selected

补充说明 & 扩展了解

select * from test_job left cross join test_user;select * from test_job full cross join test_user;select * from test_job right cross join test_user;select * from test_job inner cross join test_user;执行上面这几种SQL的搜索结果和下面的SQL相同select * from test_job cross join test_user;

关键字:sql, oracle, join, test_user

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部