上一章所讲的"结合"是Oracle本身的表与表连接的方法。本章讲述SQL1999 的连接方法,也可以实现同样的功能,而且可读性更好。
Oracle | SQL1999 |
---|---|
等价结合 | 自然结合/内部结合 |
外部结合 | 左侧外部结合/右侧外部结合 |
自己结合 | 使用ON语句的结合 |
非等价结合 | 使用ON语句的结合 |
直积结合 | 交叉结合 |
用于表与表之间相结合的字段的名称、类型、长度完全一样,这样的 自然结合用NATURAL JOIN关键字。因为相同的字段名内容完全相同,所以, 字段前可以不使用表名或别名。虽然例子中只有一个字段参与结合,并不 是说只能一个,完全可以有多个。有多个字段相结合时,这几个字段必须 全部相同。
SQL>select
DEPID, DEPNAME, DEPADDR, STDID, STDNAME 2from
DEPARTMENTnatural 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 2from
DEPARTMENTjoin
STUFFusing
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 2from
DEPARTMENT Across join
STUFF B; DE DEPNAME DEPADDR STDI STDNAME -- ---------- -------------------------- ---- -------- 10 会计 上海 7360 张妃 20 开发 南京 7360 张妃 30 销售 北京 7360 张妃 ...... 此处省略 10 会计 上海 7934 花牧岚 20 开发 南京 7934 花牧岚 30 销售 北京 7934 花牧岚 40 管理 南京 7934 花牧岚 已选择52行。
用ON语句也可以实现等价结合,用关键字JOIN ON。
SQL>select
DEPID, DEPNAME, DEPADDR, A.STDID, STDNAME 2from
DEPARTMENT Ajoin
STUFF Bon
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语句也可以实现非等价结合,用关键字JOIN ON。
SQL>select
A.STDNAME, A.SALARY, B.LVLID, B.MINSALR, B.MAXSALR 2from
STUFF Ajoin
SALRLEVEL B 3on
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语句可以实现自己结合,用关键字JOIN ON。
SQL>select
部下.STDID, 部下.STDNAME, 部下.LEADER, 2 上司.STDID, 上司.STDNAME 3from
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 2from
DEPARTMENT Aleft join
STUFF B 3on
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行。
SQL>select
A.DEPID, B.STDNAME, B.SALARY, C.LVLID 2from
DEPARTMENT Ajoin
STUFF Bon
A.DEPID = B.DEPID 3join
SALRLEVEL Con
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行。