设为首页 收藏本站
查看: 872|回复: 0

[经验分享] Oracle SQL之--多表查询基础用法

[复制链接]

尚未签到

发表于 2018-9-24 06:07:23 | 显示全部楼层 |阅读模式
多表查询,顾名思义就是从多个表中查询你所要的数据。这里以scott用户下的emp表与dept表进行试验,两个表的结构如下:  SQL> select * from dept; DEPTNO DNAME LOC  ---------- -------------- -------------
  10 ACCOUNTING NEW YORK
  20 RESEARCH DALLAS
  30 SALES CHICAGO
  40 OPERATIONS BOSTON
  SQL> select * from emp;
  EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
  ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
  7369 SMITH      CLERK           7902 17-DEC-80      800                    20
  7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
  7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
  7566 JONES      MANAGER         7839 02-APR-81       2975                    20
  7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
  7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
  7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
  7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
  7839 KING       PRESIDENT            17-NOV-81      5000                    10
  7844 TURNER     SALESMAN        7698 08-SEP-81       500          0         30
  7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
  EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
  ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
  7900 JAMES      CLERK           7698 03-DEC-81        950                    30
  7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
  7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
  14 rows selected.
  使用连接可在多个表中查询数据:
  基本语句如下:
  SELECT table1.column, table2.column from  table1, table2 where  table1.column1 = table2.column2
  连接的类型分成很多种:Equijoins(等值连接) Non-equijoin(非等值连接) Outer-join(外连接) Self-join(自连接) Cross joins(交叉连接) Natural joins(自然连接)
  1、Equijoins
  Equijoins(等值连接)--利用emp表中的deptno与dept表中的deptno进行等值连接。
  SQL> select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.dname from emp,dept where
  2  emp.deptno=dept.deptno;
  EMPNO ENAME          DEPTNO     DEPTNO DNAME
  ---------- ---------- ---------- ---------- --------------
  7369 SMITH              20         20 RESEARCH
  7499 ALLEN              30         30 SALES
  7521 WARD               30         30 SALES
  7566 JONES              20         20 RESEARCH
  7654 MARTIN             30         30 SALES
  7698 BLAKE              30         30 SALES
  7782 CLARK              10         10 ACCOUNTING
  7788 SCOTT              20         20 RESEARCH
  7839 KING               10         10 ACCOUNTING
  7844 TURNER             30         30 SALES
  7876 ADAMS              20         20 RESEARCH
  EMPNO ENAME          DEPTNO     DEPTNO DNAME
  ---------- ---------- ---------- ---------- --------------
  7900 JAMES              30         30 SALES
  7902 FORD               20         20 RESEARCH
  7934 MILLER             10         10 ACCOUNTING
  14 rows selected.
  2、Non-equijoin
  Non-equijoin(非等值连接)--新建一个名为job_grades的表,并往其中添加数据:
  SQL> select * from job_grades
  2  ;
  GRA   LOWEST_SAL HIGHEST_SAL
  ----- ---------- -----------
  A            500        1499
  B           1500        2499
  C           2500        3500
  SQL> select emp.ename,emp.sal,job_grades.gra from emp,job_grades where emp.sal between
  2  job_grades.lowest_sal and job_grades.highest_sal;
  ENAME             SAL GRA
  ---------- ---------- -----
  SMITH             800        A
  WARD              1250       A
  MARTIN            1250       A
  ADAMS             1100       A
  JAMES             950        A
  MILLER            1300       A
  ALLEN             1600       B
  CLARK             2450       B
  TURNER            1500       B
  JONES             2975       C
  BLAKE             2850       C
  ENAME             SAL GRA
  ---------- ---------- -----
  SCOTT             3000      C
  FORD              3000      C
  13 rows selected.
  3、Self-join
  Self-join(自连接)---是sql语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
  SQL> select worker.ename || ' works for ' || manager.ename from emp worker,emp manager
  2  where worker.mgr = manager.empno;
  WORKER.ENAME||'WORKSFOR'||MANAG
  -------------------------------
  SMITH works for FORD
  ALLEN works for BLAKE
  WARD works for BLAKE
  JONES works for KING
  MARTIN works for BLAKE
  BLAKE works for KING
  CLARK works for KING
  SCOTT works for JONES
  TURNER works for BLAKE
  ADAMS works for SCOTT
  JAMES works for BLAKE
  WORKER.ENAME||'WORKSFOR'||MANAG
  -------------------------------
  FORD works for JONES
  MILLER works for CLARK
  13 rows selected.
  4、Natural joins
  Natural joins(自然连接)---是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。
  SQL> select deptno,ename,dname,loc from emp natural join dept;
  DEPTNO ENAME      DNAME          LOC
  ---------- ---------- -------------- -------------
  20 SMITH      RESEARCH       DALLAS
  30 ALLEN      SALES          CHICAGO
  30 WARD       SALES          CHICAGO
  20 JONES      RESEARCH       DALLAS
  30 MARTIN     SALES          CHICAGO
  30 BLAKE      SALES          CHICAGO
  10 CLARK      ACCOUNTING     NEW YORK
  20 SCOTT      RESEARCH       DALLAS
  10 KING       ACCOUNTING     NEW YORK
  30 TURNER     SALES          CHICAGO
  20 ADAMS      RESEARCH       DALLAS
  DEPTNO ENAME      DNAME          LOC
  ---------- ---------- -------------- -------------
  30 JAMES      SALES          CHICAGO
  20 FORD       RESEARCH       DALLAS
  10 MILLER     ACCOUNTING     NEW YORK
  14 rows selected.
  4.1  Using字句
  在natural join字句创建等值连接时,可以使用using字句指定等值连接中需要用到的列。使用using可以在有多个列满足条件时进行选择。
  SQL> select e.empno,e.ename,d.loc from emp e join dept d using(deptno);
  EMPNO ENAME      LOC
  ---------- ---------- -------------
  7369 SMITH      DALLAS
  7499 ALLEN      CHICAGO
  7521 WARD       CHICAGO
  7566 JONES      DALLAS
  7654 MARTIN     CHICAGO
  7698 BLAKE      CHICAGO
  7782 CLARK      NEW YORK
  7788 SCOTT      DALLAS
  7839 KING       NEW YORK
  7844 TURNER     CHICAGO
  7876 ADAMS      DALLAS
  EMPNO ENAME      LOC
  ---------- ---------- -------------
  7900 JAMES      CHICAGO
  7902 FORD       DALLAS
  7934 MILLER     NEW YORK
  14 rows selected.
  4.2 ON字句
  自然连接中是以具有相同名字的列作为连接条件的。我们可以使用ON字句指定额外的连接条件,这个连接条件时与其他条件分开的。
  SQL> select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.loc from emp join dept
  2  on (emp.deptno = dept.deptno);
  EMPNO ENAME          DEPTNO     DEPTNO LOC
  ---------- ---------- ---------- ---------- -------------
  7369 SMITH              20         20 DALLAS
  7499 ALLEN              30         30 CHICAGO
  7521 WARD               30         30 CHICAGO
  7566 JONES              20         20 DALLAS
  7654 MARTIN             30         30 CHICAGO
  7698 BLAKE              30         30 CHICAGO
  7782 CLARK              10         10 NEW YORK
  7788 SCOTT              20         20 DALLAS
  7839 KING               10         10 NEW YORK
  7844 TURNER             30         30 CHICAGO
  7876 ADAMS              20         20 DALLAS
  EMPNO ENAME          DEPTNO     DEPTNO LOC
  ---------- ---------- ---------- ---------- -------------
  7900 JAMES              30         30 CHICAGO
  7902 FORD               20         20 DALLAS
  7934 MILLER             10         10 NEW YORK
  14 rows selected.
  5、Outer-join
  outer-join(外连接)---使用外连接可以查询不满足连接条件的数据。外连接的符号是(+)。外连接还可以分为左外连接、右外连接。所谓左外连接,就是返回左表中不满足条件的行。右外连接,则是返回右表中不满足条件的行。
  上面的dept表中有一个40号的deptno,但是emp表中却没有这个dept的数据。故可以用来做外连接的实验:
  5.1 右外连接:
  下面两条SQL语句的效果是一样的:
  SQL> select e.ename,e.deptno,d.dname from emp e right outer join dept d on (e.deptno = d.deptno);
  SQL> select e.ename,e.deptno,d.dname from emp e,dept d where e.deptno(+) = d.deptno;
  ENAME          DEPTNO DNAME
  ---------- ---------- --------------
  SMITH              20 RESEARCH
  ALLEN              30 SALES
  WARD               30 SALES
  JONES              20 RESEARCH
  MARTIN             30 SALES
  BLAKE              30 SALES
  CLARK              10 ACCOUNTING
  SCOTT              20 RESEARCH
  KING               10 ACCOUNTING
  TURNER             30 SALES
  ADAMS              20 RESEARCH
  ENAME          DEPTNO DNAME
  ---------- ---------- --------------
  JAMES              30 SALES
  FORD               20 RESEARCH
  MILLER             10 ACCOUNTING
  OPERATIONS
  5.2 左外连接
  左外连接的sql语句与右外连接的sql语句相似:
  SQL> select e.ename,e.deptno,d.dname from emp e,dept d where e.deptno = d.deptno(+);
  SQL> select e.ename,e.deptno,d.dname from emp e left outer join dept d on (e.deptno = d.deptno);
  6、Cross joins(交叉连接)
  使用corss join字句是连接表产生叉集。叉集合笛卡尔集是相同的
  SQL> select ename,dname from emp cross join dept;
  ENAME      DNAME
  ---------- --------------
  SMITH      ACCOUNTING
  ALLEN      ACCOUNTING
  WARD       ACCOUNTING
  JONES      ACCOUNTING
  MARTIN     ACCOUNTING
  BLAKE      ACCOUNTING
  CLARK      ACCOUNTING
  SCOTT      ACCOUNTING
  KING       ACCOUNTING
  TURNER     ACCOUNTING
  ADAMS      ACCOUNTING
  ENAME      DNAME
  ---------- --------------
  JAMES      ACCOUNTING
  FORD       ACCOUNTING
  MILLER     ACCOUNTING
  SMITH      RESEARCH
  ALLEN      RESEARCH
  WARD       RESEARCH
  JONES      RESEARCH
  MARTIN     RESEARCH
  BLAKE      RESEARCH
  CLARK      RESEARCH
  SCOTT      RESEARCH
  ENAME      DNAME
  ---------- --------------
  KING       RESEARCH
  TURNER     RESEARCH
  ADAMS      RESEARCH
  JAMES      RESEARCH
  FORD       RESEARCH
  MILLER     RESEARCH
  SMITH      SALES
  ALLEN      SALES
  WARD       SALES
  JONES      SALES
  MARTIN     SALES
  ENAME      DNAME
  ---------- --------------
  BLAKE      SALES
  CLARK      SALES
  SCOTT      SALES
  KING       SALES
  TURNER     SALES
  ADAMS      SALES
  JAMES      SALES
  FORD       SALES
  MILLER     SALES
  SMITH      OPERATIONS
  ALLEN      OPERATIONS
  ENAME      DNAME
  ---------- --------------
  WARD       OPERATIONS
  JONES      OPERATIONS
  MARTIN     OPERATIONS
  BLAKE      OPERATIONS
  CLARK      OPERATIONS
  SCOTT      OPERATIONS
  KING       OPERATIONS
  TURNER     OPERATIONS
  ADAMS      OPERATIONS
  JAMES      OPERATIONS
  FORD       OPERATIONS
  ENAME      DNAME
  ---------- --------------
  MILLER     OPERATIONS
  56 rows selected.
  以上是个人学习之后做的笔记,刚刚入门,还有很多欠缺的地方。但是还是一点态度吧,大家一起学习进步!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600376-1-1.html 上篇帖子: 安装Oracle10g及导入数据库 下篇帖子: 某运营商的oracle笔试题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表