多表查询2.docx

上传人:b****5 文档编号:7257637 上传时间:2023-01-22 格式:DOCX 页数:28 大小:105.51KB
下载 相关 举报
多表查询2.docx_第1页
第1页 / 共28页
多表查询2.docx_第2页
第2页 / 共28页
多表查询2.docx_第3页
第3页 / 共28页
多表查询2.docx_第4页
第4页 / 共28页
多表查询2.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

多表查询2.docx

《多表查询2.docx》由会员分享,可在线阅读,更多相关《多表查询2.docx(28页珍藏版)》请在冰豆网上搜索。

多表查询2.docx

多表查询2

1.1.1多表查询

(1)多表查询的基本语法(重点)

多表查询的语法如下:

SELECT{DISTINCT}*|查询列1别名1,查询列2别名2……

FORM表名称`1别名1,表名称2别名2,……

{WHERE条件表达式}

{ORDERBY排序字段ASC|DESC,排序字段ASC|DESC,……}

例:

用多表查询查询emp表和dept表中的信息

SELECT*FROMemp,dept

查看emp表

SELECT*FROMemp;

EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO

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

7369SMITHCLERK790217-12月-8080020

7499ALLENSALESMAN769820-2月-81160030030

7521WARDSALESMAN769822-2月-81125050030

7566JONESMANAGER783902-4月-81297520

7654MARTINSALESMAN769828-9月-811250140030

7698BLAKEMANAGER783901-5月-81285030

7782CLARKMANAGER783909-6月-81245010

7788SCOTTANALYST756619-4月-87300020

7839KINGPRESIDENT17-11月-81500010

7844TURNERSALESMAN769808-9月-811500030

7876ADAMSCLERK778823-5月-87110020

7900JAMESCLERK769803-12月-8195030

7902FORDANALYST756603-12月-81300020

7934MILLERCLERK778223-1月-82130010

查看dept表

SQL>SELECT*FROMdept;

DEPTNODNAMELOC

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

10ACCOUNTINGNEWYORK

20RESEARCHDALLAS

30SALESCHICAGO

40OPERATIONSBOSTON

例:

查询出雇员的编号,雇员姓名,部门编号,部门名称以及部门的位置

SELECTe.empno,e.ename,d.deptno,d.dname,d.locFROMempe,deptd

WHEREe.deptno=d.deptno

结果如下:

EMPNOENAMEDEPTNODNAMELOC

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

7369SMITH20RESEARCHDALLAS

7499ALLEN30SALESCHICAGO

7521WARD30SALESCHICAGO

7566JONES20RESEARCHDALLAS

7654MARTIN30SALESCHICAGO

7698BLAKE30SALESCHICAGO

7782CLARK10ACCOUNTINGNEWYORK

7788SCOTT20RESEARCHDALLAS

7839KING10ACCOUNTINGNEWYORK

7844TURNER30SALESCHICAGO

7876ADAMS20RESEARCHDALLAS

7900JAMES30SALESCHICAGO

7902FORD20RESEARCHDALLAS

7934MILLER10ACCOUNTINGNEWYORK

例:

查询出每个雇员的姓名,工作,雇员的直接上级领导的姓名

SELECTe.ename,e.job,s.enameFROMemps,empe

WHEREs.empno=e.mgr

其中别名e为雇员关系,s为经理关系

ENAMEJOBENAME

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

SMITHCLERKFORD

ALLENSALESMANBLAKE

WARDSALESMANBLAKE

JONESMANAGERKING

MARTINSALESMANBLAKE

BLAKEMANAGERKING

CLARKMANAGERKING

SCOTTANALYSTJONES

TURNERSALESMANBLAKE

ADAMSCLERKSCOTT

JAMESCLERKBLAKE

FORDANALYSTJONES

MILLERCLERKCLARK

例:

查询出每个雇员的姓名,工作,雇员的直接上级领导的姓名,雇员所在的部门名称

SELECTe.ename,e.job,s.enamemgr_name,d.dname

FROMemps,empe,deptd

WHEREe.mgr=s.empnoande.deptno=d.deptno

结果如下:

ENAMEJOBMGR_NAMEDNAME

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

SMITHCLERKFORDRESEARCH

ALLENSALESMANBLAKESALES

WARDSALESMANBLAKESALES

JONESMANAGERKINGRESEARCH

MARTINSALESMANBLAKESALES

BLAKEMANAGERKINGSALES

CLARKMANAGERKINGACCOUNTING

SCOTTANALYSTJONESRESEARCH

TURNERSALESMANBLAKESALES

ADAMSCLERKSCOTTRESEARCH

JAMESCLERKBLAKESALES

FORDANALYSTJONESRESEARCH

MILLERCLERKCLARKACCOUNTING

思考题:

查询出每个雇员的姓名,工资,部门名称,工资在公司的等级(salgrade)

及其领导的姓名,领导的工资,以及领导工资所对应的等级

分析:

先明确工资等级表(salgrade)中的内容

SELECT*FROMsalgrade;

GRADELOSALHISAL

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

17001200

212011400

314012000

420013000

530019999

再查询查询出每个雇员的姓名,工资,部门名称,工资在公司的等级(salgrade)

SELECTe.ename,e.sal,d.dname,g.gradee_grade,FROMempe,deptd,salgradeg,emps,

WHERE(e.deptno=d.deptno)AND(e.salBETWEENg.losalANDg.hisal)

ENAMESALDNAMEGRADE

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

SMITH800RESEARCH1

JAMES950SALES1

ADAMS1100RESEARCH1

WARD1250SALES2

MARTIN1250SALES2

MILLER1300ACCOUNTING2

TURNER1500SALES3

ALLEN1600SALES3

CLARK2450ACCOUNTING4

BLAKE2850SALES4

JONES2975RESEARCH4

SCOTT3000RESEARCH4

FORD3000RESEARCH4

KING5000ACCOUNTING5

在以上基础上增加查找上司姓名

SELECTe.ename,e.sal,d.dname,g.grade,s.ename

FROMempe,deptd,salgradeg,emps

WHERE(e.deptno=d.deptno)AND(e.salBETWEENlosalANDhisal)AND(s.empno=e.mgr)

结果为:

ENAMESALDNAMEGRADEENAME

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

SMITH800RESEARCH1FORD

JAMES950SALES1BLAKE

ADAMS1100RESEARCH1SCOTT

WARD1250SALES2BLAKE

MARTIN1250SALES2BLAKE

MILLER1300ACCOUNTING2CLARK

TURNER1500SALES3BLAKE

ALLEN1600SALES3BLAKE

CLARK2450ACCOUNTING4KING

BLAKE2850SALES4KING

JONES2975RESEARCH4KING

FORD3000RESEARCH4JONES

SCOTT3000RESEARCH4JONES

最后确定雇员的经理姓名,经理的工资,以及经理工资所对应的等级

SELECTe.ename,e.sal,d.dname,g.gradee_grade,s.enamemgr_name,g2.gradem_grade

FROMempe,deptd,salgradeg,emps,salgradeg2

WHERE(e.deptno=d.deptno)AND(e.salBETWEENg.losalANDg.hisal)AND(s.empno=e.mgr)AND(s.salBETWEENg2.losalANDg2.hisal)

 

结果

ENAMESALDNAMEE_GRADEMGR_NAMEM_GRADE

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

SMITH800RESEARCH1FORD4

JAMES950SALES1BLAKE4

ADAMS1100RESEARCH1SCOTT4

WARD1250SALES2BLAKE4

MARTIN1250SALES2BLAKE4

MILLER1300ACCOUNTING2CLARK4

TURNER1500SALES3BLAKE4

ALLEN1600SALES3BLAKE4

CLARK2450ACCOUNTING4KING5

BLAKE2850SALES4KING5

JONES2975RESEARCH4KING5

FORD3000RESEARCH4JONES4

SCOTT3000RESEARCH4JONES4

 

进一步思考:

如果要将上面求得的结果按如样式显示工资的等级,应该如何实现

1:

第五等工资

2:

第四等工资

3:

第三等工资

4:

第二等工资

5:

第一等工资

此时只能用DECODE()函数来实现

SELECTe.ename,

e.sal,

d.dname,

decode(g.grade,5,'第一等工资',4,'第二等工资',3,'第三等工资',2,'第四等工资',1,'第五等工资')e_grade,

s.enamemgr_name,

s.salmgr_sal,

decode(g2.grade,5,'第一等工资',4,'第二等工资',3,'第三等工资',2,'第四等工资',1,'第五等工资')m_grade

FROMempe,deptd,salgradeg,emps,salgradeg2

WHERE(e.deptno=d.deptno)AND(e.salBETWEENg.losalANDg.hisal)AND(s.empno=e.mgr)AND(s.salBETWEENg2.losalANDg2.hisal)

结果为:

ENAMESALDNAMEE_GRADEMGR_NAMEMGR_SALM_GRADE

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

SMITH800RESEARCH第五等工资FORD3000第二等工资

JAMES950SALES第五等工资BLAKE2850第二等工资

ADAMS1100RESEARCH第五等工资SCOTT3000第二等工资

WARD1250SALES第四等工资BLAKE2850第二等工资

MARTIN1250SALES第四等工资BLAKE2850第二等工资

MILLER1300ACCOUNTING第四等工资CLARK2450第二等工资

TURNER1500SALES第三等工资BLAKE2850第二等工资

ALLEN1600SALES第三等工资BLAKE2850第二等工资

CLARK2450ACCOUNTING第二等工资KING5000第一等工资

BLAKE2850SALES第二等工资KING5000第一等工资

JONES2975RESEARCH第二等工资KING5000第一等工资

FORD3000RESEARCH第二等工资JONES2975第二等工资

SCOTT3000RESEARCH第二等工资JONES2975第二等工资

(2)左、右连接(重点)

查看dept表中的记录的记录

SELECT*FROMdept;

DEPTNODNAMELOC

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

10ACCOUNTINGNEWYORK

20RESEARCHDALLAS

30SALESCHICAGO

40OPERATIONSBOSTON

例:

利用emp和dept做一个连接查询,查询结果包括雇员编号,雇员姓名,部门编号,部门名称,部门所在位置

SELECTe.empno,e.ename,d.deptno,d.dname,d.loc

FROMempe,deptd

WHEREe.deptno=d.deptno;

结果:

EMPNOENAMEDEPTNODNAMELOC

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

7369SMITH20RESEARCHDALLAS

7499ALLEN30SALESCHICAGO

7521WARD30SALESCHICAGO

7566JONES20RESEARCHDALLAS

7654MARTIN30SALESCHICAGO

7698BLAKE30SALESCHICAGO

7782CLARK10ACCOUNTINGNEWYORK

7788SCOTT20RESEARCHDALLAS

7839KING10ACCOUNTINGNEWYORK

7844TURNER30SALESCHICAGO

7876ADAMS20RESEARCHDALLAS

7900JAMES30SALESCHICAGO

7902FORD20RESEARCHDALLAS

7934MILLER10ACCOUNTINGNEWYORK

SELECTe.empno,e.ename,d.deptno,d.dname,d.loc

FROMempe,deptd

WHEREe.deptno(+)=d.deptno

结果为:

EMPNOENAMEDEPTNODNAMELOC

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

7782CLARK10ACCOUNTINGNEWYORK

7839KING10ACCOUNTINGNEWYORK

7934MILLER10ACCOUNTINGNEWYORK

7566JONES20RESEARCHDALLAS

7902FORD20RESEARCHDALLAS

7876ADAMS20RESEARCHDALLAS

7369SMITH20RESEARCHDALLAS

7788SCOTT20RESEARCHDALLAS

7521WARD30SALESCHICAGO

7844TURNER30SALESCHICAGO

7499ALLEN30SALESCHICAGO

7900JAMES30SALESCHICAGO

7698BLAKE30SALESCHICAGO

7654MARTIN30SALESCHICAGO

40OPERATIONSBOSTON

部门40就出现在结果中了.此时我们使用的是右连接

(+)在=左边表示右连接

(+)在=右边表示左连接

左连接:

SELECTe.empno,e.ename,d.deptno,d.dname,d.loc

FROMempe,deptd

WHEREe.deptno=d.deptno(+)

EMPNOENAMEDEPTNODNAMELOC

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

7369SMITH20RESEARCHDALLAS

7499ALLEN30SALESCHICAGO

7521WARD30SALESCHICAGO

7566JONES20RESEARCHDALLAS

7654MARTIN30SALESCHICAGO

7698BLAKE30SALESCHICAGO

7782CLARK10ACCOUNTINGNEWYORK

7788SCOTT20RESEARCHDALLAS

7839KING10ACCOUNTINGNEWYORK

7844TURNER30SALESCHICAGO

7876ADAMS20RESEARCHDALLAS

7900JAMES30SALESCHICAGO

7902FORD20RESEARCHDALLAS

7934MILLER10ACCOUNTINGNEWYORK

左连接以左表为基准,所以40不会出现在结果中

例.查询雇员的编号、姓名及其领导的编号、姓名

SELECTe.empno,e.ename,s.empnomgr_no,s.enamemgr_name

FROMempe,emps

WHEREs.empno=e.mgr;

结果为:

EMPNOENAMEMGR_NOMGR_NAME

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

7369SMITH7902FORD

7499ALLEN7698BLAKE

7521WARD7698BLAKE

7566JONES7839KING

7654MARTIN7698BLAKE

7698BLAKE7839KING

7782CLARK7839KING

7788SCOTT7566JONES

7844TURNER7698BLAKE

7876ADAMS7788SCOTT

7900JAMES7698BLAKE

7902FORD7566JONES

7934MILLER7782CLARK

已选择13行。

用左/右连接来实现

SELECTe.empno,e.ename,s.empnomgr_no,s.enamemgr_name

FROMempe,emps

WHEREs.empno(+)=e.mgr

结果为:

EMPNOENAMEMGR_NOMGR_NAME

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

7369SMITH7902FORD

7499ALLEN7698BLAKE

7521WARD7698BLAKE

7566JONES7839KING

7654MARTIN7698BLAKE

7698BLAKE7839KING

7782CLARK7839KING

7788SCOTT7566JONES

7839KING

7844TURNER7698BLAKE

7876ADAMS7788SCOTT

7900JAMES7698BLAKE

7902FORD7566JONES

7934MILLER7782CLARK

这样就可以完整地把KING显示出来了

1.1.2组函数及分组统计(重点)

分组组函数

SQL中常用的分组函数

Count():

计数

Max():

求最大值

Min():

求最小值

Avg():

求平均值

Sum():

求和

Count():

计数

例:

统计emp表中的人数

SQL>SELECTcount(empno)FROMemp;

结果为:

14

例:

统计获得奖金的人数

SELECTcount(comm)FROMemp;

结果为:

4

从结果可以看出,组函数count()对comm统计时,如果comm不是空值,计数为1,为空值时计数0

思考:

统计部门编号为10的人数

Max():

求最大值\Min():

求最小值主要应用在对数字求最大值或最小值

例:

求所雇员的最低工资

SELECTmin(sal)FROMemp

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1