官网连接:

https://docs.oracle.com/en/database/oracle/oracle-database/20/sqlrf/Joins.html#GUID-39081984-8D38-4D64-A847-AA43F515D460

官网介绍时的分类:

Equijoins,等值连接(理解为内连接的一种)

Band Joins,这属于一种特殊的非等值连接,暂不介绍。

Self Joins,自连接,就是表关联的对象是自己

Cartesian Products,笛卡尔积

Inner Joins,内连接

Outer Joins,外连接

Antijoins,反连接

Semijoins,半连接

表关联也叫表连接,纯粹看你想怎么说。

例子,以销售额(tmp_sale)和销售员(tmp_saer)为例:

*Inner Joins,内连接 ,Equijoins,等值连接*

将两个表连接起来,既能得到销售数据,又能得到交易员信息,这就是等值连接,只有在关联字段的值都存在且相等的时候返回(可以看到例子里没有周八和吴九的数据):

等值连接

等值连接,内连接

这两个例子都是等值连接,第二个例子又是内连接(关键词 inner),实际是一样的逻辑两种写法。一种写法参考上述等值连接,将关联的表排列在 from 关键词之后,关联条件写入 where 条件,实际开发不推荐,推荐使用 join 关键词写法,join 连接两个表,将关联写入 on 语句。

注意,这不表示等值连接 = 内连接,等值连接只能是“=”,而内连接则可以是其他类型的对比关联条件,如不等于,等值连接是内连接的子集。

内连接,不等连接(可以看到数据是参差不齐的,销售员的业绩和销售员信息不对应,实际查询无意义):

其他类似大于小于的不等连接的例子便不再赘述。

Cartesian Products,笛卡尔积

两个集合的直积,a 表27条数据,b 表7条数据,最终17*7=729条数据(和上述的不等连接略有相似,也就是笛卡尔积包含了等值连接和不等值连接):

Self Joins,自连接

表关联的对象是自己(多用于分层或多级数据存放在表中,[[Oracle 专题] SQL 递归遍历树结构]()):

Outer Joins,外连接

左外连接,左表全量显示,后表依据关联语句查询右表,有则显示,无则为空(右表有左表没有的数据不统计)。

语法 left join 和 left outer join 无差别。

两种写法如下:

左外连接

右外连接,与左外连接相反。

语法 right join 和 right outer join 无差别。

两种写法如下:

右外连接

实际使用中根据业务需求来定,通常使用 left join,由核心表关联附属表数据。

多表连接,参考:

select ...
  from tbl1 a, tbl2 b tbl3 c
 where a.bid = b.id
   and b.cid = c.id;


select ...
  from tbl1 a
  left join tbl2 b
    on a.bid = b.id
  left join tbl3 c
    on b.cid = c.id
  left join tbl4 d
    on a.did = d.id
   and b.ddd = d.ddd;

需要提一下,多表关联的关联字段不单单是关联两方的表中字段,也可以是其他关联表的字段,多表 left join 可以理解为递推,a 表与 b 表关联,产生新的表再与 c 表关联,以此类推。

Semijoins,半连接,Antijoins,反连接

半连接和反连接其实就是子查询 in(= any) 和 exists 的运用。exists 中需要有关联部分。

常用表关联已经差不多讲完了。

扩展:在查询资料的时候多数提到 Hint,属于 SQL 优化范畴,在查询表或者表关联的时候,我们为了提高性能,常规的方法是“走索引”,但是有些查询或者关联,Oracle 在解析代码的时候,不会按照我们期望的那样走,这个时候我们可以通过调整代码解决,也可以通过 Hint 解决(强制索引)。由于 Oracle 本身优化已经做的极好,通常不建议启用 Hint。

最后修改:2021 年 10 月 25 日
如果觉得我的文章对你有用,请随意赞赏