SQL 经典题型解答(4)

SQL 经典题型解答(4)

18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

SELECT
    a.C,
    a.Cname,
    MAX( b.score ),
    MIN( b.score ),
    CAST( AVG( b.score ) AS DECIMAL ( 18, 2 ) ) pingqunfen,
    CAST(
        ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C AND sc.score > 60 ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C ) AS DECIMAL ( 18, 2 )
    ) jigelv,
    CAST(
        (
        SELECT
            COUNT( 1 )
        FROM
            sc
        WHERE
            sc.C = a.c
            AND sc.score >= 70
            AND sc.score < 80
        ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.c = a.c ) AS DECIMAL ( 18, 2 )
    ) zhongdneglv,
    CAST(
        (
        SELECT
            COUNT( 1 )
        FROM
            sc
        WHERE
            sc.C = a.C
            AND sc.score >= 80
            AND sc.score < 90
        ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C ) AS DECIMAL ( 18, 2 )
    ) youlianglv,
    CAST(
        ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C AND sc.score >= 90 ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C ) AS DECIMAL ( 18, 2 )
    ) youxiulv
FROM
    course a,
    sc b
WHERE
    a.C = b.C
GROUP BY
    a.C,
    a.Cname
ORDER BY
        a.C 

详解:

SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在 SQL 语言中,第一个被处理的子句是 FROM 子句,尽管 SELECT 语句第一个出现,但是几乎总是最后被处理。 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者

上面代码的运行顺序如下:

  1. FROM:对 FROM 子句中的前两个表执行笛卡尔积( Cartesian product )(交叉联接),生成虚拟表 VT1
  2. WHERE:对 VT1 应用 WHERE 筛选器。只有使为 TRUE 的行才被插入 VT2 .
  3. GROUP BY:按 GROUP BY 子句中的列列表对 VT2 中的行分组,生成 VT3 .
  4. SELECT:处理 SELECT 列表,产生 VT4 .
  5. ORDER BY:将 VT4 中的行按 ORDER BY 子句中的列列表排序,生成 VT5,并返回调用者.
    • CAST(expr AS type)函数用于将 expr 源值转换为目标数据类型 type
    • CAST() 函数中的SELECT 语句需要通过 WHERE sc.C = a.C 进行限制,因为已经通过 GROUP BY 语句对表 a 进行了分组,如果不加限制,算出的结果没有对课程进行分组。

      代码中的 COUNT( 1 )表示求表 sc 的第一列数量,相当于 COUNT( s )

参考资料:

程序运行结果:



19、按各科成绩进行排序,并显示排名

SELECT
    a.s,
    a.sname,
    c.Cname,
    b.score,
    RANK ( ) over ( ORDER BY b.score DESC) AS ‘名次‘
FROM
    student a,
    sc b,
    course c
WHERE
    a.s = b.S
    AND b.c = c.C
    AND b.C = ‘01‘ 

详解:

RANK() 函数用法:RANK() OVER(order by [目标列名]) as name,根据目标列名所在列进行排序,返回排名。

其他科目程序与上面类似。

SQL 四大排名函数

程序运行结果:



部分答案参考自:SQL 经典五十道题

原文地址:https://www.cnblogs.com/wobu/p/9630912.html

时间: 2024-10-11 04:57:35

SQL 经典题型解答(4)的相关文章

SQL 经典题型解答(5)

SQL 经典题型解答(5) @(数据库) 20.查询学生的总成绩并进行排名 SELECT a.s, a.Sname, SUM( b.score ) AS sumscore, RANK() OVER (ORDER BY SUM( b.score ) DESC) AS '名次' FROM student a, sc b WHERE a.s = b.S GROUP BY a.S,a.Sname 详解: 没有用到新的知识. 程序运行结果: 21.查询不同老师所教不同课程平均分从高到低显示 SELECT

SQL 经典题型解答(6)

SQL 经典习题解答(6) 23.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比 SELECT t1.*, t2.all_num, CONCAT( ROUND( t1.num / t2.all_num * 100, 2 ), '%' ) '百分比' FROM ( SELECT m.C, m.Cname, ( CASE WHEN n.score >= 85 THEN '85-100' WHEN n.score >= 70

SQL 经典语句

15题需要再分析.没弄懂 使用scott/tiger用户下的emp表和dept表完成下列练习, 表的结构说明如下 emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号) dept部门表(deptno部门编号/dname部门名称/loc地点) 工资 = 薪金 + 佣金 1.列出至少有一个员工的所有部门. 2.列出薪金比“SMITH”多的所有员工. 3.列出所有员工的姓名及其直接上级的姓名. 4.列出

Oracle SQL 经典查询练手第三篇

Oracle SQL 经典查询练手第三篇 本文分享的是Oracle SQL的经典查询第三篇,仅仅是作者自己的见解,如有问题,希望您给出建议或者方法.同时,欢迎广大读者们补充,如果您有经典的查询方式也可以拿出来我们共同分享,共同成长,共同进步. 本计算机上使用的是Oracle 11.2.0版本,使用scott用户登陆.使用的是系统自带的表. 表结构: describe employees; describe departments; describe locations; select *from

针对JS经典题型对全局变量及局部变量的理解浅谈

第一次写博,还蛮激动... 看到了三题经典题型,经老师讲解后,对此类题目有了更深刻的认识 就我目前的认识对此题进行总结.如有错误,敬请指正 首先,我们先明确一下JS引擎的工作步骤: js引擎工作分为两步: 1.将这个js中的变量和函数声明保存到当前(注意,是当前)执行环境的变量对象中 2.再逐行解析执行js.当看到一个函数或一个变量时,js引擎就会去查询 这个函数或变量是在哪里定义的 查询的方式有两种: a.按作用域链查找:先在当前执行环境查询这个变量或程序,如果没有,就到父执行环境 中查找,还

sql经典语句大全

SQL Server提供了大量的函数, 但是在一些常见的如, 字符串拆分, 字符提取,过滤等没有对应的处理, 本帖主要收集一些常见的函数, 整理如下: ------------------------------ http://topic.csdn.net/u/20080306/23/d3c100f2-cda1-4efa-927d-f1f7968884ce.html /* 功能:拆分字符串. 作者:..... */ http://topic.csdn.net/u/20080724/11/dacb

DP经典题型:石子合并问题

本周集训专题为DP系列,一个经典的系列便是石子归并问题. (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为新合成的一堆石子的数量.求将这N堆石子合并成一堆的总花费最小(或最大). 这是石子归并的简化版本,石子处于一排.由于发现只能是相邻的2堆石子进行归并.我们会发现,贪心算法在此处便失去作用,局部最优解并不能带来整体最优解. 因此,不难让我们想到,此题应该采取DP(dynamic Programing)来求其最优解. 动态规划常常采取从部分整体最

【笔试/面试】SQL 经典面试题

基本概念 (1)any/all,构成 where 子句的条件判断,any:表示或(or)的概念,all:则表示与(and)的概念,这两个关键字的出现是为了语句的简化: (2)先分组再做聚合,逻辑上也应当如此,聚合(取最值)之后便无分组的必要: select region, sum(population), sum(area) from bbc group by region; 1 (3)group by having,having 对分组后的数据进行筛选,这是 where 所做不到的: 1. 不

收集的sql经典语句

经典SQL语句大全 一.基础1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'--- 开始 备份BACKUP DATABASE pubs TO testBack 4.说明:创