练习8-3 研究不同类型的子查询 在这个练习中,我们将演示可能发生在不同类型的子查询中的问题。我们使用SQL*Plus或SQL Developer来编写代码。所有的查询都应该能在HR Schema上执行:假定EMPLOYEES已经有一些标准记录集。 1、以用户HR登录到数据库。
2、编写一个查询,判断谁的薪水比Mr. Tobias高: select last_name from employees where salary > (select salary from employees&……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
练习8-3 研究不同类型的子查询
在这个练习中,我们将演示可能发生在不同类型的子查询中的问题。我们使用SQL*Plus或SQL Developer来编写代码。所有的查询都应该能在HR Schema上执行:假定EMPLOYEES已经有一些标准记录集。
1、以用户HR登录到数据库。
2、编写一个查询,判断谁的薪水比Mr. Tobias高:
select last_name from employees where salary > (select salary from employees where last_name='Tobias') order by last_name; |
这将会返回86个名字,并以字母顺序排序。
3、编写一个查询,判断谁的薪水比Mr. Taylor高:
select last_name from employees where salary > (select salary from employees where last_name='Taylor') order by last_name; |
这次查询会失败并抛出错误:“ORA-01427: single-row subquery returns more than one row”。下图是在SQL*Plus中显示的第2步操作的最后几行输出,以及第3步出现的错误。
我们要判断为什么第2步成功了而第3步却失败了。答案就在数据的状态中:
select count(last_name) from employees where last_name='Tobias'; select count(last_name) from employees where last_name='Taylor'; |
第2和第3步查询中使用的“大于(>)”操作符要求使用单行子查询,但是第3步使用的子查询可能会根据使用的不同查询规则而返回多行记录。
4、我们要修改第2步和第3步中的代码,使它能在任何LAST_NAME值查询中都执行成功。下面是两种可选的方法:第一个是使用一个能处理多行子查询的操作符;另一个是使用一个总是返回单行记录的子查询。
方法一:
select last_name from employees where salary > all (select salary from employees where last_name='Taylor') order by last_name; |
方法二:
select last_name from employees where salary > (select max(salary) from employees where last_name='Taylor') order by last_name; |
SCENARIO & SOLUTION | |
如何设计最好的子查询,使它们不会执行失败并出现错误:“ORA-01427: single-row subquery returns more than one row”? | 可以有2种常用方法:一是使用聚集(Aggregation),它可以将你得到的多行记录减为一行;二是使用IN、ANY或ALL操作符,这些操作符允许与返回的多行记录进行比较。但它们都不是最好的方法;最好的方法是要用主键来判断所返回的记录行,而不是用非唯一键。 |
有时我们会需要考虑选择使用子查询还是使用其它替代技术,如星号(*)通配符。那么哪一种才是更好的选择呢? | 这个选择与条件有关。在数据库中,通常不同的技术会有不同的执行方法。根据它所配置的实例、数据库和数据结构,各自的性能也会有所不同。如果面对这样的选择,查询语句应该要进行调优分析。DBA可以对此提供有用的建议。 |
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
2017年12月数据库流行度排行榜 定格岁末排名瞬间
数据库知识网站DB-engines最近更新的2017年12月份数据库流行度排名情况是否能提供更多的看点呢?TechTarget数据库网站将与您分享12月份的榜单排名情况,让我们拭目以待。
-
2017年11月数据库流行度排行榜 半数以上数据库积分减少
数据库知识网站DB-engines更新了2016年11月份的数据库流行度排行榜。TechTarget数据库网站将与您一同关注11月份的榜单排名情况。
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。