《SQL基础教程》第07章 SQL1999


上一章所讲的"结合"是Oracle本身的表与表连接的方法。本章讲述SQL1999 的连接方法,也可以实现同样的功能,而且可读性更好。

SQL1999对应关系
OracleSQL1999
等价结合自然结合/内部结合
外部结合左侧外部结合/右侧外部结合
自己结合使用ON语句的结合
非等价结合使用ON语句的结合
直积结合交叉结合

自然结合(全部)

用于表与表之间相结合的字段的名称、类型、长度完全一样,这样的 自然结合用NATURAL JOIN关键字。因为相同的字段名内容完全相同,所以, 字段前可以不使用表名或别名。虽然例子中只有一个字段参与结合,并不 是说只能一个,完全可以有多个。有多个字段相结合时,这几个字段必须 全部相同。

SQL> select DEPID, DEPNAME, DEPADDR, STDID, STDNAME
  2  from   DEPARTMENT natural join STUFF;

DE DEPNAME    DEPADDR                    STDI STDNAME
-- ---------- -------------------------- ---- --------
20 开发       南京                       7360 张妃
30 销售       北京                       7499 关玉
30 销售       北京                       7521 刘蓓
20 开发       南京                       7566 江叁讲
30 销售       北京                       7654 李斯硼
30 销售       北京                       9698 邓笑评
10 会计       上海                       7782 孙荃
20 开发       南京                       7788 周语
10 会计       上海                       7839 鲁素
30 销售       北京                       7844 曹草
20 开发       南京                       7876 诸葛靓
20 开发       南京                       7902 穆归营
10 会计       上海                       7934 花牧岚

已选择13行。

自然结合(局部)

如果相结合的多个字段中,只用其中的一部分来结合,这时就要用USING子句。 在这种情况下,相同字段名且没有参与结合的字段前一定要用表名或别名来区分开来。

SQL> select DEPID, DEPNAME, DEPADDR, STDID, STDNAME
  2  from   DEPARTMENT join STUFF using DEPID;

DE DEPNAME    DEPADDR                    STDI STDNAME
-- ---------- -------------------------- ---- --------
20 开发       南京                       7360 张妃
30 销售       北京                       7499 关玉
30 销售       北京                       7521 刘蓓
20 开发       南京                       7566 江叁讲
30 销售       北京                       7654 李斯硼
30 销售       北京                       9698 邓笑评
10 会计       上海                       7782 孙荃
20 开发       南京                       7788 周语
10 会计       上海                       7839 鲁素
30 销售       北京                       7844 曹草
20 开发       南京                       7876 诸葛靓
20 开发       南京                       7902 穆归营
10 会计       上海                       7934 花牧岚

已选择13行。

交叉结合

交叉结合也就是直积结合。关键字是CROSS JOIN

SQL> select A.DEPID, A.DEPNAME, A.DEPADDR, B.STDID, B.STDNAME
  2  from   DEPARTMENT A cross join STUFF B;

DE DEPNAME    DEPADDR                    STDI STDNAME
-- ---------- -------------------------- ---- --------
10 会计       上海                       7360 张妃
20 开发       南京                       7360 张妃
30 销售       北京                       7360 张妃

......   此处省略

10 会计       上海                       7934 花牧岚
20 开发       南京                       7934 花牧岚
30 销售       北京                       7934 花牧岚
40 管理       南京                       7934 花牧岚

已选择52行。

ON语句结合(等价结合)

用ON语句也可以实现等价结合,用关键字JOIN ON。

SQL> select DEPID, DEPNAME, DEPADDR, A.STDID, STDNAME
  2  from   DEPARTMENT A join STUFF B on A.STDI = B.STDI;

DE DEPNAME    DEPADDR                    STDI STDNAME
-- ---------- -------------------------- ---- --------
20 开发       南京                       7360 张妃
30 销售       北京                       7499 关玉
30 销售       北京                       7521 刘蓓
20 开发       南京                       7566 江叁讲
30 销售       北京                       7654 李斯硼
30 销售       北京                       9698 邓笑评
10 会计       上海                       7782 孙荃
20 开发       南京                       7788 周语
10 会计       上海                       7839 鲁素
30 销售       北京                       7844 曹草
20 开发       南京                       7876 诸葛靓
20 开发       南京                       7902 穆归营
10 会计       上海                       7934 花牧岚

已选择13行。

ON语句结合(非等价结合)

用ON语句也可以实现非等价结合,用关键字JOIN ON。

SQL> select A.STDNAME, A.SALARY, B.LVLID, B.MINSALR, B.MAXSALR
  2  from   STUFF A join SALRLEVEL B 
  3        on A.SALARY between B.MINSALR and B.MAXSALR;

STDNAME      SALARY      LVLID    MINSALR    MAXSALR
-------- ---------- ---------- ---------- ----------
刘蓓           2250          2       2001       2500
李斯硼         2250          2       2001       2500
曹草           2500          2       2001       2500
诸葛靓         2100          2       2001       2500
花牧岚         2300          2       2001       2500
关玉           2600          3       2501       3000
江叁讲         2975          3       2501       3000
周语           3000          3       2501       3000
穆归营         3000          3       2501       3000
孙荃           3450          4       3001       3500
邓笑评         3850          5       3501       9999
鲁素           9000          5       3501       9999
张妃           1800          1       1500       2000
已选择13行。

ON语句结合(自己结合)

ON语句可以实现自己结合,用关键字JOIN ON。

SQL> select 部下.STDID, 部下.STDNAME, 部下.LEADER,
  2        上司.STDID, 上司.STDNAME
  3  from   STUFF 部下join STUFF 上司 on 部下.LEADER = 上司.STDID;

STDI STDNAME  LEAD STDI STDNAME
---- -------- ---- ---- --------
7360 张妃     7902 7902 穆归营
7566 江叁讲   7839 7839 鲁素
9698 邓笑评   7839 7839 鲁素
7782 孙荃     7839 7839 鲁素
7788 周语     7566 7566 江叁讲
7876 诸葛靓   7788 7788 周语
7902 穆归营   7566 7566 江叁讲
7934 花牧岚   7782 7782 孙荃

已选择8行。

左结合右结合(外部结合)

左结合和右结合其实是一会事。下面四句是实现的同一功能。

select ... from TA left  join TB on TA.ID = TB.ID
select ... from TB right join TA on TB.ID = TA.ID
select ... from TA, TB where TA.ID = TB.ID(+)
select ... from TA, TB where TA.ID(+) = TB.ID
SQL> select A.DEPID, A.DEPNAME, A.DEPADDR, B.STDID, B.STDNAME
  2  from   DEPARTMENT A left join STUFF B
  3         on     A.DEPID = B.DEPID;

DE DEPNAME    DEPADDR                    STDI STDNAME
-- ---------- -------------------------- ---- --------
10 会计       上海                       7782 孙荃
10 会计       上海                       7839 鲁素
10 会计       上海                       7934 花牧岚
20 开发       南京                       7360 张妃
20 开发       南京                       7876 诸葛靓
20 开发       南京                       7788 周语
20 开发       南京                       7566 江叁讲
20 开发       南京                       7902 穆归营
30 销售       北京                       7499 关玉
30 销售       北京                       9698 邓笑评
30 销售       北京                       7654 李斯硼
30 销售       北京                       7844 曹草
30 销售       北京                       7521 刘蓓
40 管理       南京

已选择14行。

3个以上表的结合

SQL> select A.DEPID, B.STDNAME, B.SALARY, C.LVLID
  2  from  DEPARTMENT A join STUFF B on A.DEPID = B.DEPID
  3	   join SALRLEVEL C on B.SALARY between C.MINSALR and C.MAXSALR;

DE STDNAME      SALARY      LVLID
-- -------- ---------- ----------
30 刘蓓           2250          2
30 李斯硼         2250          2
30 曹草           2500          2
20 诸葛靓         2100          2
10 花牧岚         2300          2
30 关玉           2600          3
20 江叁讲         2975          3
20 周语           3000          3
20 穆归营         3000          3
10 孙荃           3450          4
30 邓笑评         3850          5
10 鲁素           9000          5
20 张妃           1800          1

已选择13行。