Oracle SQL多表查询
曾经一段时间我对oracle的多表查询搞的云里雾里,究其原因:oracle自己的语法和SQL国际标准语法混用。此文章仅适合oracle 菜鸟,老鸟直接飞过…
多表连接类型(SQL 1999标准)
• Cross joins
• Natural joins
• USING clause
• Full (or two-sided) outer joins
• Arbitrary join conditions for outer joins
SQL1999语法:
SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON (table1.column_name = table2.column_name)]|
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)]|
[CROSS JOIN table2];
语法解释:
table1.column --指明从中检索数据的表和列
CROSS JOIN --返回两个表的笛卡尔集
NATURAL JOIN --根据相同的列名连接两个表
JOIN table
USING column_name --根据列名执行等值连接
JOIN table ON
table1.column_name --根据ON 子句中的条件执行等值连接
= table2.column_name
LEFT/RIGHT/FULL OUTER
一般来说,从数据显示方式来讲,分为内连接和外连接
内连接:只返回满足连接条件的数据。
外连接:除了返回满足连接条的行以外,还返回左(右)表中,不满足条件的行,
称为左(右)连接
演示,主要以SQL标准为主,oracle 写法作对比。示例用户为scott、HR
解锁这两个用户语句:
alter user scott identified by tiger account unlock;
alter user hr identified by hr account unlock;
内连接
--Oracle的写法
select empno,ename,sal,dname,loc from emp,dept
where emp.deptno=dept.deptno;
-- SQL 99标准的写法
select empno,ename,job,sal,dept.deptno,dname,loc
from emp join dept on emp.deptno=dept.deptno;
或把join改为inner join
外连接
左外连接
Oracle 外连接语法:
SELECT table1.column, table2.column --右外连接
FROM table1, table2
WHERE table1.column(+) = table2.column;
SELECT table1.column, table2.column --左外连接
FROM table1, table2
WHERE table1.column = table2.column(+);
SQL 1999标准外连接语法见上面SQL1999语法
--Oracle的写法
外连接的符号是(+),(+)要放在字段名后。(+)对面的那个表,会全部显示。
左外连接时,加号在等号的右边
SQL> select d.dname,e.ename,e.deptno
-------------- ---------- ------
SQL> select d.dname,e.ename,e.deptno
-------------- ---------- ------
SQL> select empno, ename, job, sal, dept.deptno, dname, loc
3 where emp.deptno(+) = dept.deptno;
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
SQL> select empno, ename, job, sal, dept.deptno, dname, loc
4 on emp.deptno = dept.deptno;
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
全连接
SQL> select empno, ename, job, sal, d.deptno, dname, loc
EMPNO ENAME JOB SAL DEPTNO DNAME LOC
----- ---------- --------- --------- ------ -------------- -------------
7369 SMITH CLERK 800.00 20 RESEARCH DALLAS
7499 ALLEN SALESMAN 1600.00 30 SALES CHICAGO
7521 WARD SALESMAN 1250.00 30 SALES CHICAGO
7566 JONES MANAGER 2975.00 20 RESEARCH DALLAS
7654 MARTIN SALESMAN 1250.00 30 SALES CHICAGO
7698 BLAKE MANAGER 2850.00 30 SALES CHICAGO
7782 CLARK MANAGER 2450.00 10 ACCOUNTING NEW YORK
7788 SCOTT ANALYST 3000.00 20 RESEARCH DALLAS
7839 KING PRESIDENT 5000.00 10 ACCOUNTING NEW YORK
7844 TURNER SALESMAN 1500.00 30 SALES CHICAGO
7876 ADAMS CLERK 1100.00 20 RESEARCH DALLAS
7900 JAMES CLERK 950.00 30 SALES CHICAGO
7902 FORD ANALYST 3000.00 20 RESEARCH DALLAS
7934 MILLER CLERK 1300.00 10 ACCOUNTING NEW YORK
自连接
SQL> select e.ename || ' works for ' || m.ename
-------------------------------
SQL> select e.ename || ' works for ' || m.ename
-------------------------------
自然连接
以两个表具有相同的字段的所有列为基础,可采用自然连接(natural join)
SQL> select empno, ename, job, sal, deptno, dname, loc
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
使用using子句创建连接
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
--下面的语句无效,因为where 子句中限定了location_id为d. location_id
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
ORA-25154: column part of USING clause cannot have qualifier
注意:两个表中名称相同的列在使用时不能有任何限定符,这一限制同样适用natural join
在oracle语法中直接from两张表就是cross join
等值连接时增加条件
上述的多表连接都是等值连接(最常用),等值连接后面还可以添加限定条件。
select e.empno, e.ename, d.dname
select e.empno, e.ename, d.dname
非等值连接
where sal between losal and hisal
select e.ename, e.sal, s.grade
on e.sal between losal and hisal
总结
Oracle的语法还是比较人性化的,除了左外连接和右外连接。如果想使代码简单明了,使用oracle的语法,如果想使写出的代码兼容性比较好(可能会移植到DB2等),尽量使用SQL标准语法。
9 SQL Queries and Subqueries 部分
Oracle SQL多表查询相关推荐
- ORACLE SQL 多表查询
ORACLE SQL 多表查询 开发工具与关键技术:Oracle sql*plus PLSQL Developer SQL 撰写时间:2019年05月08日 说明:顾名思义,多表就是多个表连接起来进行 ...
- [推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!)
[推荐]ORACLE SQL:经典查询练手第三篇(不懂装懂,永世饭桶!) [推荐]ORACLE SQL: 经典查询练手第三篇(不懂装懂,永世饭桶!) --通过知识共享树立个人品牌. 本文与大家共同讨论 ...
- Oracle EBS 常用表 查询语句
ORACLE EBS常用表查询语句 1. OU.库存组织 SELECT hou.organization_id ou_org_id, --org_id hou.name ou ...
- Oracle中多表查询再按时间倒序
我在工作中在Oracle中多表查询再按时间倒序时,用order by 表名.datatime desc 总是实现不了. 不过最后问杨鹃最后和我说可以把我们查询的总个sql语句做为一个表来排序: sel ...
- [强烈推荐]ORACLE SQL:经典查询练手第四篇(不懂装懂,永世饭桶!)
[推荐]ORACLE SQL: 经典查询练手第四篇(不懂装懂,永世饭桶!) --通过知识共享树立个人品牌. 本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那 ...
- Oracle数据库—— 多表查询
Oracle数据库-- 多表查询 (一)笛卡尔问题 1.笛卡尔积会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 2.为了避免笛卡尔积,可以在WHERE加入有效的连接条件 ( ...
- [推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇)
[推荐推荐][提供下载]ORACLE SQL: 经典查询练手系列文章收尾(目录篇) --通过知识共享树立个人品牌. 通过近一个月的努力,<经典查询练手系列>也快告一段落,但并不代表结束,以 ...
- sql多表查询之一:Where 和 On的秘密
原文 sql多表查询之一:Where 和 On的秘密 对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术.什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某 ...
- php sql查询两个表语句,sql多表查询语句与方法
sql多表查询有很多种方法,如有自然连接 INNER JOIN,外边查询LEFT JOIN,交叉查询JOIN,交叉连接JOIN等join on left on 等多的是哦. sql多表查询语句与方法 ...
最新文章
- android小程序案例_小程序案例赏析:高质量的小程序怎么做
- 科技议题“破圈”有利还是有弊|观点
- 【转】解决从jenkins打开robot framework报告会提示‘Opening Robot Framework log failed ’的问题...
- 牛逼哄哄的SLAM技术即将颠覆哪些领域
- Python IDLE或Python Shell不支持中文编码的解决方案
- 【架构】软件分层架构视角图
- xp,win7,win2003,win2008常用命令集
- 【效率】又来一个Windows神器!!!
- 浏览器外部署Silverlight更新检查失败的原因及对策
- slf4j介绍以及实现原理窥探
- Exchange2007 从零到入门(2)---收件人管理
- HttpClient api-连接池
- 以太坊智能合约Hello World示例程序
- 被360整的体无完肤,我真的怒了!
- Git工作流中常见的三种分支策略:GitFlow、GitHubFlow和GitLabFlow
- 使用spring集成的kafka收发消息
- Understanding the Bias-Variance Tradeoff
- how to catch out of memory exception in c++
- MariaDB -- 数据类型
- Android contacts 的详解
热门文章
- 【白皮书分享】低幼年龄段在线教育白皮书.pdf(附下载链接)
- 【报告分享】2020中国消费品牌发展报告.pdf(附下载链接)
- 【报告分享】万达文旅项目新媒体营销操作手册.pdf(附下载链接)
- (Deep learning)深度卷积网络实战——第二部分
- oracle ora-01476: 除数为 0,Oracle常见错误:ORA-01403 的根本原因和解决方案
- python十大装b语法_Python 十大语法
- TensorFlow2.0:自定义层与自定义网络
- 那些年让我们头疼的CSS3动画
- Presto架构及原理、安装及部署
- 第二篇 Python数据类型、字符编码、文件处理