一道Oracle子查询小练习

昨天晚上躺在床上看Oracle(最近在学习这个),室友说出个题目让我试试。题目如下:

有如下表结构,请选择出成绩为前三名的人的信息(如果成绩相同,则算并列),表名为test:

    NAME                      GRADE
    -------------------- ----------
    kate                            80
    jenny                          80
    daring                         85
    agony                         85
    xxx                            90
    yyy                             60

 

昨天大概想了下可以从以下几点考虑实现:

  1、首先肯定要进行排序

  2、子查询

  3、由于Oracle中没有TopN,所以只能考虑用rownum伪列

  4、由于可以有重复的成绩,考虑用distinct或者分组

 

经过测试,我的答案如下:

  select  *  from test
  where  grade  in (

    select grade from (

        select distinct grade from test

        order by grade desc

      )

    where rownum < 4

  )

  order by grade desc;

 

  select  *  from test
  where  grade  in (

    select grade from (

        select  grade from test

        group by grade

        order by grade desc

      )

    where rownum < 4

  )

  order by grade desc;

 

  上面两种方法,思路大致差不多,只不过上面的用distinct关键字过滤重复,下面的方法用分组的方法实现。实现思想基本没变。

时间: 2024-09-07 14:20:36

一道Oracle子查询小练习的相关文章

[20150727]使用标量子查询小问题.txt

[20150727]使用标量子查询小问题.txt --最近一段时间一直在做优化,仔细看我前面的blog,不主张使用标量子查询,实际上还是有一些小细节要注意. 1.测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ----------------------------------------------

有关于Oracle子查询问题

问题描述 有关于Oracle子查询问题 select * from (select rownum as rowsize, d.route_name as route_name, d.depart_count as depart_count, d.createby_name as createby_name, to_char(d.createby_date, 'yyyy-MM-dd') as createby_date, d.remark as remark from base_detail d

Oracle子查询

SQL> --问题:要查询工资比SCOTT高的员工信息 SQL> --1. 查询SCOTT的工资 SQL> select sal from emp where ename='SCOTT';        SAL                                                                      ----------                                                             

Oracle基础学习之子查询_oracle

首先使用子查询的时候注意事项包括,子查询可以嵌套多层和子查询需要圆括号()括起来,下面我们来看看详细的介绍. 基础介绍 1,wherer:子查询一般会返回单行单列 单行多列 多行单列 : 2,having:子查询会返回单行单列,同时表示要使用统计函数: 3,from:子查询返回多行多列数据(表结构): 4,select:返回单行单列 (一般不使用): 示例详解 where(进行数据行的筛选操作): a:查询出低于公司平均工资的雇员信息. select * from emp where sal<(

select-oracle 子查询中有两个字段,怎么同时查出来

问题描述 oracle 子查询中有两个字段,怎么同时查出来 比如说:select a.id,a.name,(select sum(b.count),a.num-sum(b.count) from b) from a; 有这么一个语句,我想一下在b表里查出两个值来,作为两列字段跟a.id a.name两列的值同时都显示出来,但是我上面的写法会报错.不知道括号里的情况该怎么处理? ps:当然我只是举了个例子,具体的语句要比这个复杂的多,求指点 解决方案 select a.id,a.name,c.co

Oracle数据库入门之多表连接与子查询

Oracle表连接 概述:SQL/Oracle使用表连接从多个表中查询数据 格式:select 字段列表 from table1,table2 where table1.column1=table2.column2; 说明:当被连接的多个表中存在同名字段时,必须在该字段前加上"table."作为前缀 如果没有限定where连接条件,否则就会出现笛卡尔集的不现实或没有实用意义的结果 举例:select empno, ename, sal, emp.deptno, dname, loc f

oracle数据库里,子查询必须写在括号里吗

问题描述 oracle数据库里,子查询必须写在括号里吗 想问一下,子查询必须写在括号里吗,不写在括号里的查询不叫子查询是吗 解决方案 一般都 要将查询结果括号起来,要不语句就会报错了,语法方面的问题.子查询并不是说要写在括号里,而是查询时用到了另一个查询的结果 解决方案二: 可以这么理解,不放在括号里会报错 解决方案三: 写在2015第一天里的 解决方案四: 查询其实是调用了子查询出的值,我感觉就是这样的 解决方案五: 查询其实是调用了子查询出的值,我感觉就是这样的 解决方案六: 恩,不放括号里

SQL为王:oracle标量子查询和表连接改写

小鱼(邓秋爽) 云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化.SQL优化和troubleshooting 编辑手记:如何提高数据的查询效率是每个人都关注的问题,今天让我们来学习如何合理使用标量子查询和表连接方式来提高查询速度吧~ 之前小鱼就听过了标量子查询,不过对于其中的细节理解还是远远不够,借助一部分资料和自己测试对标量子查询做一点简单的分析和介绍. Oracle允许在select子句中包含单行子查询,这个也就是oracle的标量子查询,标量子查询有点类似于外

关于在.Net中Oracle的子查询的问题

问题描述 刚才我写了一个很简单的子查询select*from(select*fromA)发现这样写在利用.Net的OracleDataAdapter找Schema的时候会报错--语法错误:应为标识符或带引号的标识符.这是为什么? 解决方案 解决方案二:这样的自查询,似乎在查找和填充(Fill方法)资料的时候是没问题的,但是用FillSchema去查找Schema的时候就会报错,是不是因为没有TableName,所以找Schema的时候会有问题?Oracle本身是可能执行这种语句的,不过也可能仅仅