云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 资料 SQL语言 - 图文

资料 SQL语言 - 图文

  • 62 次阅读
  • 3 次下载
  • 2025/12/10 17:29:53

P13 财务处报销科 郑文华 科长 罗四明 报销员 P13 财务处报销科 张明君 报销员 P13 财务处报销科 表的别名有如下的一些用途:

* 简化输入(特别当表名很长时);

* 当表要与自身连接时(下面就会讲到); * 在相关子查询中(下一节将会讲到)。

4、表与自身的连接

当需要把表中的某些行与同一表中的另一些行连接时,就必须要把表与其自身连接起来。表与自身的连接必须使用表的别名,若在FROM子句中用两个不同的别名对应于同一个表时,就可以像连接两个分开的表一样来把表与自身连接起来。 例31:列出财务处的下属部门:

SELECT lowdept.deptcode,lowdept.deptname, updept.deptname FROM department lowdept, department updept WHERE updept.deptname='财务处' and lowdept.higher=updept.deptcode; 结果为: P11 财务处计划科 财务处 P13 财务处报销科 财务处 P12 财务处记帐科 财务处 例32:列出工资大于\赵汉雄\工资的所有人员: SElECT x.peopname,x.salary,x.job FROM people x,people y WHERE y.peopname='赵汉雄' and x.salary>y.salary; 结果为:

李铭棠 200 经理 沈晓华 180 处长 王英泉 210 处长 黄伯尧 180 处长 沈妙玉 180 驾驶员 从这个例子中还可以看到:表连接不一定是等值连接,它也可以是不等值连接。

5、外连接

一般来说,如果某一表中所选取的一行不能与另一个表中的任何一行相连接(即不满足连接条件)时,则在查询结果中此行不再出现。

例33:列出P30和P10部门的人员和工作地址,

SELECT d.deptcode, deptname, peopname, job, address FROM department d, people p

WHERE d.deptcode in ('P30', 'P31') and d.deptcode=p.deptcode; 结果为: P30 销售处 赵汉雄 处长 公司大楼204室 P30 销售处 姚国平 推销员 公司大楼204室 P30 销售处 张宗恒 推销员 公司大楼204室 P30 销售处 曹向群 推销员 公司大楼204室 P30 销售处 王晨 推销员 公司大楼204室 P30 销售处 史玲娟 办事员 公司大楼204室 在这里可以看到,由于P31部门没有人员,它不能与people表相连接,所以连P31部门的编号,名称和地址信息也不显示了,有时可能会造成不存在P31部门的假象。 如果要求即使没有匹配的人员,也要把部门的信息显示出来的话, 就需要使用外连接。

连接是通过连接条件中的某个连接列后面加一个外连接操作符(+)来实现的,例34:用连接列出P30和P31部门的人员和工作地址:

SELECT d.deptcode, deptname, peopname, job, address FROM department d, people p WHERE d.deptcode in ('P30','P31') and d.deptcode=p.deptcode(+); 结果为: P30 销售处 赵汉雄 处长 公司大楼204室 P30 销售处 姚国平 推销员 公司大楼204室 P30 销售处 张宗恒 推销员 公司大楼204室 P30 销售处 曹向群 推销员 公司大楼204室 P30 销售处 王晨 推销员 公司大楼204室 P30 销售处 史玲娟 办事员 公司大楼204室 P31 销售研究中心 公司大楼202室 此例的WHERE子句中连接表达式中的p.deptcode后面使用了外连接符号,SQL在处理时,对people表添加了一个各列全为空值的额外行,若depoctment表中的行不能与people表中任何一行连接,则与这个额外行连接,以保证depoctment表中各行的信息在查询结果中显示出来。

在结束这部分内容之前,再来看一个使用外连接的例子。 例35:列出那些没有人员的部门.

SELECT deptcode, d.deptname, address, peopname FROM department d, people p WHERE d.deptcode=p.deptcode(+) and peopname is null; 结果为:

P31 销售研究中心 公司大楼202室 (四) 子查询的使用

SQL还可以使用嵌套查询,所谓嵌套查询是在 WHERE 子句中包含另一个查询,WHERE子句中的这个查询就称为子查询。

在WHERE子句中的逻辑表达式中, 子查询必须用在关系表达式的右侧,并由一对括号括起来。子查询返回的值可以是一个值或一列值,甚至多列值,这些值成为关系表达式中的一部分,最后形成主查询的检索条件。

一般来说,若查询条件依赖于表中的数据, 即查询条件可以动态变化时,用子查询是很合适的。

1、返回一个值的子查询

返回一个值的子查询是最简单的子查询,由子查询返回的值,就是WHERE子句中逻辑表达式的一个值。

例如:要找出工资高于赵汉雄的工资的所有人员,在找出这些人员之前,需要先找出赵汉雄的工资,然后再把每个人员的工资与赵汉雄的工资进行比较, 以找出满足条件的人员。当然要解决这个问题,可以通过两次查询:

SELECT salary FROM people WHERE peopname='赵汉雄'; 得到结果为170。然后:

SELECT peopname,salary FROM people WHERE salary> 170; 结果为:

李铭棠 200 沈晓华 180 王英泉 210 黄伯尧 180 沈妙玉 180 但是,若在WHERE子句中使用子查询找出赵汉雄的工资,就可以通过一次查询得到同样的结果:

SELECT peopname,salary FROM people WHERE salary> (SELECT salary FROM pople WHERE peopname='赵汉雄');

当这里,SQL*Plus将先执行用括号括起来的子查询,该子查询返回赵汉雄的工资,主查询再把每个人的工资与返回值比较,以决定是否选取该行。按这种方式使用子查询,如果没有返回值或返回值多于一个,则SQL*Plus将给出错误信息。

2、返回一组值的子查询

如果子查询返回多个值,则必须规定返回值在WHERE子句中的使用方式,此时在关系运算符(=、!=、>、>=、<、<=)与子查询之间应插入any或all,若插入any,则只要有一个返回值使关系表达式成立,查询条件就满足。若插入all,则要所有返回值都使关系表达式成立,查询条件才满足。其中=any可用in代替、!=all可用not in代替。 下面我们来看几个返回多个值的子查询的例子:

例36:列出工资比P00部门中最低工资高的其它部门中全部职工的情况 SELECT peopname,salary,job,deptcode FROM people

WHERE salary > any(SELECT salary FROM people WHERE deptcode='P00') and deptcode != 'P00'; 结果为:

P10 周金海 170 处长 P12 顾为民 160 科长 P20 沈晓华 180 处长 P30 赵汉雄 170 处长 P40 王英泉 210 处长 P50 黄伯尧 180 处长 沈妙玉 180 驾驶员 P50 黄金宝 170 驾驶员 P50 例37:列出工资高于P00部门最高工资的全部职工的情况 SELECT peopname,salary,job,deptcode FROM people

WHERE salary > all(SELECT salary FROM people WHERE deptcode='P00';

结果为:

王英泉 210 处长 P40 例38:列出P20部门中与P30部门某一人员职务相同的职工, SELECT peopname, job, salary FROM people

WHERE deptcode='P20'

and job in (SELECT job FROM people WHERE deptcode='P30'); 结果为: 吴志红 办事员 125 180 沈晓华 处长 例39:列出P20部门中与P30部门所有人员的职务都不相同的职工 SELECT peopname, job, salary? 2 FROM people WHERE deptcode='P20'

and job not in (SELECT job FROM people WHERE deptcode='P30'); 结果为:

姚志邦 采购员 150 张浩 采购员 140 林光华 采购员 110 3、返回多列的子查询

子查询可以返回多个列,当子查询返回多列时,关系运算的另一侧也应是多个列,并且这些列的清单必须用括号括起来。

例40:列出与沈晓华有相同工资和相同职务的职工 SELECT peopname,job,salary FROM people

WHERE (job,salary)=(SELECT job,salary FROM peopname

WHERE peopname='沈晓华'); 结果为: 沈晓华 处长 180 黄伯尧 处长 180 注意:虽然前面的例子中,子查询和主查询都从同一个表中取数据,但实际上子查询可从任何表中取值。

4、使用多个子查询

WHERE子句可以包含任何数量的由and和or连接的含有子查询的条件。 例41:列出职务与沈晓华相同,或工资大于或等于赵汉雄工资的职工, SELECT peopname, job, salary FROM people WHERE job=(SELECT job FROM people WHERE peopname='沈晓华')

or salary>=(SELECT salary FROM people WHERE peopname='赵汉雄') 结果为:

200 李铭棠 经理 170 周金海 处长

搜索更多关于: 资料 SQL语言 - 图文 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

P13 财务处报销科 郑文华 科长 罗四明 报销员 P13 财务处报销科 张明君 报销员 P13 财务处报销科 表的别名有如下的一些用途: * 简化输入(特别当表名很长时); * 当表要与自身连接时(下面就会讲到); * 在相关子查询中(下一节将会讲到)。 4、表与自身的连接 当需要把表中的某些行与同一表中的另一些行连接时,就必须要把表与其自身连接起来。表与自身的连接必须使用表的别名,若在FROM子句中用两个不同的别名对应于同一个表时,就可以像连接两个分开的表一样来把表与自身连接起来。 例31:列出财务处的下属部门: SELECT lowdept.deptcode,lowdept.deptname, updept.deptname FROM department lowdept, department updept

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com