这道SQL有一点...不一样?

codedecent 等级 365 0 0
标签:

原题目

从课程表(课程号,课程名) 学生表(学号,年龄,性别,课程号,分数)中 查询出平均分大于60分的学生的学号及课程成绩

最初尝试

一开始不太会做,直接在网络上搜索答案,找到的却只有<查询平均成绩大于60分的学生的学号和平均成绩>这样的题目答案

SELECT
    s_id,
    AVG( s_score ) 
FROM
    score 
GROUP BY
    s_id 
HAVING
    avg( s_score ) > 60

单表操作,而且还和题意有差别,但是基本的语句形式是搭好的了

假设在这里也使用单表操作

select
    s.s_id ,
    s.s_score
from
    test2.student s
where
    s_id in (
    select
        s.s_id
    from
        test2.student s
    group by
        s.s_id
    having
        avg(s.s_score) > 60);

这道SQL有一点...不一样? 结果虽然没有问题,但是结果由于缺少学科的名字,不知道某一学生分数对应的学科是什么,是不是应该把学科名也一并查询出来,不然题目给的学科表感觉有点多余了。。。

最终解决

尝试用正常处理方式拆解为两步处理(设学生表为student,课程表为course)

1.求平均分大于60分的学生的学号

select
    s.s_id
from
    student s 
group by
    s.s_id
having
    avg(s.s_score)  > 60;

这道SQL有一点...不一样?

2.求出一个学生的所有学科成绩(如:求01号学生的)

select
    s.s_id,
    c.c_name,
    s.s_score
from
    test2.course c
join 
    test2.student s
on 
    c.c_id = s.s_subjectNo
where 
    s.s_id  = '01';

这道SQL有一点...不一样?

3.将两者组合得到最终结果

select
    s.s_id,
    c.c_name,
    s.s_score
from
    course c
join 
    student s
on 
    c.c_id = s.s_subjectNo
where
    s.s_id in (
    select
        s.s_id
    from
        student s
    group by
        s.s_id
    having
        avg(s.s_score) > 60);

这道SQL有一点...不一样?

收藏
评论区

相关推荐

SQL 优化极简法则,还有谁不会?
点击上方蓝色“ 方志朋 ”,选择“设为星标” 回复“666”获取独家整理的学习资料! ![](https://oscimg.oschina.net/oscnet/be36ac58-a54c-4669-8d39-cc2499bf68d2.jpg) ### 文章目录 * 法则一:只返回需要的结果 * 法则二:确保查询使用了正确的索引
SQL 有序计算
什么是有序计算 -------        使用过 SQL 的朋友对计算字段都不会陌生,比如 firstname+lastname,year(birthday),这些计算字段属于**行内计算**,不管表达式里用到的是单个字段,还是多个字段,使用的数据都在当前记录行内。有行内计算,对应的也就有**跨行计算**,如:第一名和第二名的差距;从 1 月到当前月份
SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 今天给大家,带来的是 SELF JOIN的应用 下面是,表结构和,INSERT 语句脚本。 create table t0718 ( ![](https://oscimg.oschina.net/oscnet/3acba45d-b183-4056-95a1-26
MySQL——性能优化
性能优化的思路 1、首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句。 MySQL——慢查询 2、其次使用explain命令去查看有问题的SQL的执行计划。 MySQL——执行计划EXPLAIN 3、最后可以使用show profile\[s\] 查看有问题的SQL的性能使用情况。 MySQL高级:show profile
Oracle一条SQL语句时快时慢
今天碰到一个非常奇怪的问题问题,一条SQL语句在PL/SQL developer中很慢,需要9s,问题SQL: SELECT \* FROM GG\_function\_location f WHERE f.parent\_id ='03000000000001';  表GG\_function\_location有5千万的数据,parent\_id上
Oracle数据库提权(dba权限执行系统命令)
**0x01 提权准备** ------------- 这里我们先创建一个低权限的用户test SQL> conn sys/admin123@orcl as sysdba; 已连接。 SQL> create user test identified by test; 然后查看一下权限 SQL> select * from
Flink SQL 1.11 on Zeppelin 平台化实践
**简介:** 鉴于有很多企业都无法配备专门的团队来解决 Flink SQL 平台化的问题,那么到底有没有一个开源的、开箱即用的、功能相对完善的组件呢?答案就是本文的主角——Apache Zeppelin。 作者:LittleMagic 大数据领域 SQL 化开发的风潮方兴未艾(所谓"Everybody knows SQL"),Flink 自然也不能“免
Flink架构,源码及debug
序 =         工作中用Flink做批量和流式处理有段时间了,感觉只看Flink文档是对Flink ProgramRuntime的细节描述不是很多, 程序员还是看代码最简单和有效。所以想写点东西,记录一下,如果能对别人有所帮助,善莫大焉。         说一下我的工作,在一个项目里我们在Flink-SQL基础上构建了一个SQL Engine,
PHP开发web应用安全总结
### 一、SQL注入攻击(SQL Injection) 攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如: 1.某个Web应用有一个登录页面,这
SQL的各种连接Join详解
原文地址:https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。 最常见的 JOIN 类型:**SQL INNER JOIN(简单的 JOIN)、SQL LEFT JOIN、SQL  RIGHT JOIN
Slardar Sql Mapper Framework for Java( Java 持久层框架一枚~)
      slardar是一个sql mapping框架,其大概使用方式类似mybatis,没有采用hibernate那种orm的方式是因为个人觉得这种方式需要大量的处理sql,每次操作对象都要进行依次sql解析比较繁琐;转而想到mybatis这种把sql逻辑交给用户的方式还是比较合理的。同时又不像全盘照抄mybatis,还是想有一些独特的地方,于是将my
SQL的各种连接Join详解
原文地址:https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。 最常见的 JOIN 类型:**SQL INNER JOIN(简单的 JOIN)、SQL LEFT JOIN、SQL  RIGHT JOIN
sql server 2005只有
sql server 2005只有.mdf文件如何附加 、新建一个同名[数据库](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Flib.csdn.net%2Fbase%2F14),停止sql服务,删除新建数据库.ldf文件 2、将要附加的数据库的.mdf文件覆盖刚新建的.mdf文件,并重
由一次 UPDATE 过慢 SQL 优化而总结出的经验
最近,线上的 ETL 数据归档 SQL 发生了点问题,有一个 UPDATE SQL 跑了两天还没跑出来: update torderrecord set archiveid '420a7fe7476745e8a5f572280c192faa', updatetime updatetime where orderid in (select orderid
这道SQL有一点...不一样?
原题目 从课程表(课程号,课程名) 学生表(学号,年龄,性别,课程号,分数)中 查询出平均分大于60分的学生的学号及课程成绩 最初尝试一开始不太会做,直接在网络上搜索答案,找到的却只有这样的题目答案sqlSELECT sid, AVG( sscore ) FROM score GROUP BY sid HAVING avg( sscore ) 60单表操作

热门文章

sql补习班-Day1HelloWorld

最新文章

sql补习班-Day1HelloWorld