oracle 查询表五数据,Oracle学习(五):多表查询

当前位置:我的异常网» 数据库 » Oracle学习(五):多表查询

Oracle学习(五):多表查询

www.myexceptions.net  网友分享于:2015-05-31  浏览:0次

Oracle学习(5):多表查询

多表查询

连接的类型:

等值连接,不等值连接,外连接,自连接

等值连接

SQL> --等值连接: 查询员工信息:员工号,姓名,薪水和部门名称

SQL> select empno,ename,sal,dname

2  from emp,dept

3  where emp.deptno=dept.deptno;

EMPNO ENAME      SAL DNAME

---------- -------- ----- --------------

7369 SMITH      800 RESEARCH

7499 ALLEN     1600 SALES

7521 WARD      1250 SALES

7566 JONES     2975 RESEARCH

7654 MARTIN    1250 SALES

7698 BLAKE     2850 SALES

7782 CLARK     2450 ACCOUNTING

7788 SCOTT     3000 RESEARCH

7839 KING      5000 ACCOUNTING

7844 TURNER    1500 SALES

7876 ADAMS     1100 RESEARCH

7900 JAMES      950 SALES

7902 FORD      3000 RESEARCH

7934 MILLER    1300 ACCOUNTING

已选择14行。

SQL> --等值连接: 查询员工信息:员工号,姓名,薪水,部门名称,部门号(两张表都有部门号,会出错)

SQL> ed

已写入 file afiedt.buf

1  select empno,ename,sal,dname,deptno

2  from emp,dept

3* where emp.deptno=dept.deptno

SQL> /

select empno,ename,sal,dname,deptno

*

第 1 行出现错误:

ORA-00918: 未明确定义列

SQL> ed

已写入 file afiedt.buf

1  select e.empno,e.ename,e.sal,d.dname,d.deptno

2  from emp e,dept d

3* where emp.deptno=dept.deptno

SQL> /

where emp.deptno=dept.deptno

*

第 3 行出现错误:

ORA-00904: "DEPT"."DEPTNO": 标识符无效

(解决办法:给每张表起一个别名,然后表明数据是哪一个别名的)

SQL> ed

已写入 file afiedt.buf

1  select e.empno,e.ename,e.sal,d.dname,d.deptno

2  from emp e,dept d

3* where e.deptno=d.deptno

SQL> /

EMPNO ENAME      SAL DNAME              DEPTNO

---------- -------- ----- -------------- ----------

7369 SMITH      800 RESEARCH               20

7499 ALLEN     1600 SALES                  30

7521 WARD      1250 SALES                  30

7566 JONES     2975 RESEARCH               20

7654 MARTIN    1250 SALES                  30

7698 BLAKE     2850 SALES                  30

7782 CLARK     2450 ACCOUNTING             10

7788 SCOTT     3000 RESEARCH               20

7839 KING      5000 ACCOUNTING             10

7844 TURNER    1500 SALES                  30

7876 ADAMS     1100 RESEARCH               20

7900 JAMES      950 SALES                  30

7902 FORD      3000 RESEARCH               20

7934 MILLER    1300 ACCOUNTING             10

已选择14行。

不等值连接

SQL> --不等值连接:查询员工的工资级别

SQL> select * from salgrade;

GRADE      LOSAL      HISAL

---------- ---------- ----------

1        700       1200

2       1201       1400

3       1401       2000

4       2001       3000

5       3001       9999

SQL> select e.ename,e.sal,s.grade

2  from emp e,salgrade s

3  where e.sal between s.losal and s.hisal;

ENAME      SAL      GRADE

-------- ----- ----------

SMITH      800          1

JAMES      950          1

ADAMS     1100          1

WARD      1250          2

MARTIN    1250          2

MILLER    1300          2

TURNER    1500          3

ALLEN     1600          3

CLARK     2450          4

BLAKE     2850          4

JONES     2975          4

SCOTT     3000          4

FORD      3000          4

KING      5000          5

已选择14行。

SQL> host cls

外链接

SQL> --按部门统计员工人数:部门号,部门名称,人数

SQL> select d.deptno,d.dname,count(e.empno) 人数

2  from dept d,emp e

3  where d.deptno=e.deptno

4  group by d.deptno,d.dname;

DEPTNO DNAME                人数

---------- -------------- ----------

10 ACCOUNTING              3

20 RESEARCH                5

30 SALES                   6

(上述结果少一个人数为null的值)

SQL> select count(*) from emp where deptno=10;

COUNT(*)

----------

3

SQL> select count(*) from emp where deptno=20;

COUNT(*)

----------

5

SQL> select count(*) from emp where deptno=30;

COUNT(*)

----------

6

SQL> select * from dept;

DEPTNO DNAME          LOC

---------- -------------- -------------

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

SQL> select count(*) from emp where deptno=40;

COUNT(*)

----------

0

SQL> --希望:在结果中包含某些不成立时的记录

SQL> /*

SQL> 外连接:

SQL> 左外连接:where d.deptno=e.deptno,当条件不成立时,等号左边所代表的表的信息任然被显示

SQL>           写法: where d.deptno=e.deptno(+)

SQL> 右外连接:where d.deptno=e.deptno,当条件不成立时,等号右边所代表的表的信息任然被显示

SQL>            写法:where d.deptno(+)=e.deptno

SQL> 全外连接:where d.deptno=e.deptno,当条件不成立时,等号两边所代表的表的信息任然被显示

SQL>            写法:where d.deptno(+)=e.deptno(+)

SQL> */

SQL> select d.deptno,d.dname,count(e.empno) 人数

2  from dept d,emp e

3  where d.deptno=e.deptno(+)

4  group by d.deptno,d.dname

5  order by 1;

DEPTNO DNAME                人数

---------- -------------- ----------

10 ACCOUNTING              3

20 RESEARCH                5

30 SALES                   6

40 OPERATIONS              0

SQL> host cls

自连接

SQL> --自连接:

SQL> --查询员工信息:***的老板是****

SQL> select * from emp;

EMPNO ENAME    JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- -------- --------- ---------- -------------- ----- ---------- ----------

7369 SMITH    CLERK           7902 17-12月-80       800                    20

7499 ALLEN    SALESMAN        7698 20-2月 -81      1600        300         30

7521 WARD     SALESMAN        7698 22-2月 -81      1250        500         30

7566 JONES    MANAGER         7839 02-4月 -81      2975                    20

7654 MARTIN   SALESMAN        7698 28-9月 -81      1250       1400         30

7698 BLAKE    MANAGER         7839 01-5月 -81      2850                    30

7782 CLARK    MANAGER         7839 09-6月 -81      2450                    10

7788 SCOTT    ANALYST         7566 13-7月 -87      3000                    20

7839 KING     PRESIDENT            17-11月-81      5000                    10

7844 TURNER   SALESMAN        7698 08-9月 -81      1500          0         30

7876 ADAMS    CLERK           7788 13-7月 -87      1100                    20

7900 JAMES    CLERK           7698 03-12月-81       950                    30

7902 FORD     ANALYST         7566 03-12月-81      3000                    20

7934 MILLER   CLERK           7782 23-1月 -82      1300                    10

已选择14行。

SQL> select e.ename||'的老板是'||b.ename

2  from emp e, emp b

3  where e.mgr=b.empno;

E.ENAME||'的老板是'||B.ENAME

----------------------------

FORD的老板是JONES

SCOTT的老板是JONES

JAMES的老板是BLAKE

TURNER的老板是BLAKE

MARTIN的老板是BLAKE

WARD的老板是BLAKE

ALLEN的老板是BLAKE

MILLER的老板是CLARK

ADAMS的老板是SCOTT

CLARK的老板是KING

BLAKE的老板是KING

JONES的老板是KING

SMITH的老板是FORD

已选择13行。

SQL> --自连接:通过表的别名,将同一张表视为不同的表,再利用别的连接操作

SQL> --自连接一般只适用于小表(因为产生的笛卡尔表数据量太过庞大)

SQL> host cls

层次查询

SQL> --层次查询:只有一张表

SQL> --          同一张表的前后两次操作进行连接

SQL> select level,empno,ename,mgr

2  from emp

3  connect by prior empno=mgr

4  start with mgr is null;

LEVEL      EMPNO ENAME           MGR

---------- ---------- -------- ----------

1       7839 KING

2       7566 JONES          7839

3       7788 SCOTT          7566

4       7876 ADAMS          7788

3       7902 FORD           7566

4       7369 SMITH          7902

2       7698 BLAKE          7839

3       7499 ALLEN          7698

3       7521 WARD           7698

3       7654 MARTIN         7698

3       7844 TURNER         7698

3       7900 JAMES          7698

2       7782 CLARK          7839

3       7934 MILLER         7782

已选择14行。

SQL> ed

已写入 file afiedt.buf

1  select level,empno,ename,mgr

2  from emp

3  connect by prior empno=mgr

4  start with mgr is null

5* order by 1

SQL> /

LEVEL      EMPNO ENAME           MGR

---------- ---------- -------- ----------

1       7839 KING

2       7566 JONES          7839

2       7698 BLAKE          7839

2       7782 CLARK          7839

3       7902 FORD           7566

3       7521 WARD           7698

3       7900 JAMES          7698

3       7934 MILLER         7782

3       7499 ALLEN          7698

3       7788 SCOTT          7566

3       7654 MARTIN         7698

3       7844 TURNER         7698

4       7876 ADAMS          7788

4       7369 SMITH          7902

已选择14行。

SQL> /*

SQL> 第一次:7839

SQL> 第二次:where mgr=7839

SQL>        7566 7698 7782

SQL> 第三次:where mgr in (7566 7698 7782)

SQL> */

SQL> spool off1楼u0100288694小时前楼主总结的很详细,学习了 。nn欢迎关注,互相交流:http://blog.csdn.net/u010028869

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值