Oracle SQL多表查询(三)
据类型能够不同,则会报错。
--SQL1999标准写法
SQL> select empno, ename, job, sal, deptno, dname, loc
2 from emp natural
3 join dept;
EMPNO ENAME JOB SAL DEPTNO DNAME LOC
----- ---------- --------- --------- ------ -------------- -------------
7782 CLARK MANAGER 2450.00 10 ACCOUNTING NEW YORK
7839 KING PRESIDENT 5000.00 10 ACCOUNTING NEW YORK
7934 MILLER CLERK 1300.00 10 ACCOUNTING NEW YORK
7566 JONES MANAGER 2975.00 20 RESEARCH DALLAS
7902 FORD ANALYST 3000.00 20 RESEARCH DALLAS
7876 ADAMS CLERK 1100.00 20 RESEARCH DALLAS
7369 SMITH CLERK 800.00 20 RESEARCH DALLAS
7788 SCOTT ANALYST 3000.00 20 RESEARCH DALLAS
7521 WARD SALESMAN 1250.00 30 SALES CHICAGO
7844 TURNER SALESMAN 1500.00 30 SALES CHICAGO
7499 ALLEN SALESMAN 1600.00 30 SALES CHICAGO
7900 JAMES CLERK 950.00 30 SALES CHICAGO
7698 BLAKE MANAGER 2850.00 30 SALES CHICAGO
7654 MARTIN SALESMAN 1250.00 30 SALES CHICAGO
14 rows selected
使用using子句创建连接
如果几个列具有相同的名称,但是数据类型不匹配,那么可以使用using子句来修改natural join子句以指定要用于等值连接的列,在多个列匹配时,使用using 子句只匹配一个列,在引用列中不要使用表名或别名。natural join 和using 子句是互不相容的。
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
WHERE location_id = 1400;
--下面的语句无效,因为where 子句中限定了location_id为d. location_id
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
WHERE d.location_id = 1400;
ORA-25154: column part of USING clause cannot have qualifier
注意:两个表中名称相同的列在使用时不能有任何限定符,这一限制同样适用natural join
cross join 实现交叉连接
交叉连接产生的结果集也就是笛卡尔乘积
--oracle 的写法
select empno, ename, dname
from emp,dept;
在oracle语法中直接from两张表就是cross join
--SQL1999标准写法
select empno, ename, dname
from emp
cross join dept;
等值连接时增加条件
上述的多表连接都是等值连接(最常用),等值连接后面还可以添加限定条件。
--oracle 的写法
select e.empno, e.ename, d.dname
from emp e, dept d
where d.deptno = e.deptno
and e.ename = 'SCOTT';
--SQL1999标准的写法
select e.empno, e.ename, d.dname
from emp e
inner join dept d
on d.deptno = e.deptno
and e.ename = 'SCOTT';
非等值连接
--oracle的写法
select ename, sal, grade
from emp, salgrade
where sal between losal and hisal
and emp.deptno = 20;
--SQL1999标准写法
select e.ename, e.sal, s.grade
from emp e
join salgrade s
on e.sal between losal and hisal
and e.deptno = 20;
总结
Oracle的语法还是比较人性化的,除了左外连接和右外连接。如果想使代码简单明了,使用oracle的语法,如果想使写出的代码兼容性比较好(可能会移植到
DB2等),尽量使用SQL标准语法。
详细信息请参考oracle 官方文档
Oracle Database
SQL Language Reference
11g Release 2 (11.2)
E17118-04
9 SQL Queries and Subqueries 部分