SQL基础一考试指南:SQL子查询类型(二)

日期: 2008-12-07 作者:John WatsonRoopesh Ramklass翻译:曾少宁 来源: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&……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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步出现的错误。

  在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的能源管理》等。

相关推荐