SQL 经典题型解答(6)

Wesley13
• 阅读 493

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 
                AND n.score < 85 THEN '70-85' WHEN n.score >= 60 
                    AND n.score < 70 THEN
                        '60-70' ELSE '0-60' 
                    END 
                    ) AS px,
                    count( 1 ) num 
                FROM
                    Course m,
                    sc n 
                WHERE
                    m.C = n.C 
                GROUP BY
                    m.C,
                    m.Cname,
                    px 
                ORDER BY
                    m.C 
                ) t1,
                (
                SELECT
                    m.C,
                    m.Cname,
                    count( 1 ) all_num 
                FROM
                    Course m,
                    sc n 
                WHERE
                    m.C = n.C 
                GROUP BY
                    m.C,
                    m.Cname 
                ORDER BY
                    m.C 
                ) t2 
        WHERE
    t1.c = t2.c

详解:

首先统计各科成绩各分数段人数:课程编号,课程名称,选择表 sc 和表 course ,通过 CASE ... WHEN ... THEN ... ELSE ... END 语句分出分数段,再查出每一个课程学习的总人数,最后相除即可得到百分比。 CASE ... WHEN ... THEN ... ELSE ... END 用法参考 SQL 字符串拼接

程序运行结果: SQL 经典题型解答(6)


24、查询学生平均成绩及其名次

SELECT
    a.*,
    b.avgscore,
    b.mc 
FROM
    student a,
    (
    SELECT
        s,
        avg( score ) AS avgscore,
        rank ( ) over ( ORDER BY avg( score ) DESC ) AS mc 
    FROM
        sc 
    GROUP BY
        S 
    ) b 
WHERE
    a.s = b.s 
ORDER BY
    mc

详解:

首先从表 sc 中查出每个学生的平均成绩和根据平均成绩进行的排名,再与表 student 连接得到结果

程序运行结果: SQL 经典题型解答(6)

25、查询各科成绩前三名的记录

SELECT
    a.*,
    b.c,
    b.score,
    b.mc 
FROM
    student a,
    ( SELECT *, row_number ( ) over ( PARTITION BY c ORDER BY score DESC ) AS mc FROM sc ) b 
WHERE
    a.s = b.s 
    AND mc BETWEEN 1 
    AND 3 
ORDER BY
    c,
    mc

详解:

首先在表 sc 根据课程成绩生成每一门课程的排名记为表 b ,然后与表 student 连接得到结果

程序运行结果: SQL 经典题型解答(6)


26、查询每门课程被选修的学生数

SELECT
    c,
    count( s ) AS num 
FROM
    sc 
GROUP BY
    c

程序运行结果: SQL 经典题型解答(6)


27、查询出只有两门课程的全部学生的学号和姓名

SELECT 
    a.s,
    a.sname 
FROM
    student a,
    ( SELECT s FROM sc GROUP BY s HAVING count( s ) = 2 ) b 
WHERE
    a.s = b.s

详解:

在表 sc 中,学号出现的次数即为学生课程数,通过 GROUP BYHAVING 函数得出选课数为 2 的学生学号,连接表 student 得出结果

程序运行结果: SQL 经典题型解答(6)


28、查询男生、女生人数

SELECT    Ssex,count(s) FROM student WHERE Ssex = '男'
UNION ALL
SELECT    Ssex,count(s) FROM student WHERE Ssex = '女'

程序运行结果: SQL 经典题型解答(6)


29、查询名字中含有"风"字的学生信息

SELECT
    * 
FROM
    student 
WHERE
    Sname LIKE '%风%'

程序运行结果: SQL 经典题型解答(6)


30、查询同名同性学生名单,并统计同名人数

SELECT
    Sname,
    Ssex,
    COUNT( 1 ) num 
FROM
    student 
GROUP BY
    Sname,
    Ssex 
HAVING
    count( 1 ) > 1

详解:

通过 GROUP BY 划分出同名同性的学生,在通过 HAVING 判断人数是否大于 1 程序运行结果: SQL 经典题型解答(6)


31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)

SELECT
    * 
FROM
    student 
WHERE
    Sage LIKE '1990%'

程序运行结果: SQL 经典题型解答(6)


32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号

SELECT
    c,
    avg( score ) AS avgscore 
FROM
    sc 
GROUP BY
    c 
ORDER BY
    avg( score ) DESC,
    c 

详解:

ORDER BY,先根据 avg( score )排序,如果平均成绩相同,再根据课程编号升序排列

程序运行结果: SQL 经典题型解答(6)


33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

SELECT
    a.s,
    a.sname,
    b.avgscore 
FROM
    student a,
    ( SELECT s, avg( score ) AS avgscore FROM sc GROUP BY s HAVING avg( score ) >= 85 ) b
WHERE a.s = b.s

程序运行结果: SQL 经典题型解答(6)


34、查询课程名称为"数学",且分数低于60的学生姓名和分数

SELECT
    a.sname,
    b.score 
FROM
    student a,
    sc b,
    course c 
WHERE
    a.s = b.s 
    AND b.c = c.C 
    AND b.score < 60 
    AND c.Cname = '数学'

程序运行结果: SQL 经典题型解答(6)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Wesley13 Wesley13
2年前
SQL经典语句(MSSQL)
1、说明:创建数据库CREATEDATABASEdatabasename2、说明:删除数据库dropdatabasedbname3、说明:备份sqlserver 创建备份数据的deviceUSEmasterEXECsp\_addumpdevice'disk','testBack','c:\\mssql7b
Wesley13 Wesley13
2年前
SQL数据库常见问题解答及万能密码注入原理讲解[图]
SQL数据库常见问题解答及万能密码注入原理讲解\图\【万能密码】的原理用户进行用户名和密码验证时,网站需要查询数据库。查询数据库就是执行SQL语句。针对此BBS论坛,当用户登录时,后台执行的数据库查询操作(SQL语句)是【Selectuserid,usertype,emailFromusersWhereuserid’用户名’
Stella981 Stella981
2年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
Java面试解析总结:Java+Redis+数据库+算法与数据结构+分布式
!(https://oscimg.oschina.net/oscnet/up760e80c47ac2161a4a2fb57889bd590e1ff.png)金九银十即将到来,给大家整理了今年来最经典的面试真题1000道,每个题目都有详细的解答,收集了java基础、RabbitMQ,微服务、MySQL数据库、Java并发、JVM,Redis、设计模
Wesley13 Wesley13
2年前
Mysql 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩1\.查询课程ID为‘01’的课程的成绩第2名到第3名的学生信息及该课程成绩SELECT  d.,c.排名,c.s_score,c.c_idFROM  (SELECTa.s_id,a.s_score,a.c_id,@i:@i1AS排名FROMs
Wesley13 Wesley13
2年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Easter79 Easter79
2年前
Spring中JdbcTemplate使用RowMapper
1packagecom.cxl.demo.dao;23importjava.sql.ResultSet;4importjava.sql.SQLException;5importjava.util.List;6importorg.springfram