T-SQL - 习题01_查询每门课都大于80分的学生姓名

本文分享了在面试中遇到的SQL题目解答,包括如何使用SQL语句查询所有课程成绩均超过80分的学生姓名,以及如何找出平均分数超过80分的学生。提供了两种不同的查询方法,并详细解释了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 时间:2017-09-11 整理:byzqy

题目:用一条SQL语句查询出每门课都大于80分的学生姓名。

最近面试C#开发工程师,碰到上面这个考数据库的题目,自己感觉有点难度,没有思路,现将找到的解决方案整理如下:

文件:SQLQuery1.sql

/*
环境:Microsoft SQL Server 2012
工具: Microsoft SQL Server Management Studio
数据库: Interview
数据表: grade
详情:
name    class    score
张三    语文    81
张三    数学    75
李四    语文    76
李四    数学    90
王五    语文    81
王五    数学    100
王五    英语    90
*/

--查询出每门课都大于80分的学生姓名:
--方法1
SELECT DISTINCT name FROM grade WHERE name NOT IN(SELECT DISTINCT name FROM grade WHERE score <= 80);
--方法2
SELECT name FROM grade GROUP BY name HAVING MIN(score) > 80;

--查询平均分大于80的学生的姓名:
--方法1
SELECT name FROM (SELECT COUNT(*) AS t,SUM(score) AS num,name FROM grade GROUP BY name) AS a WHERE a.num > 80*t;
--方法2
SELECT name,AVG(score) AS sc FROM grade g1 GROUP BY name HAVING AVG(score) > 80;

代码分解:

--查询出每门课都大于80分的学生姓名:
--方法1
SELECT DISTINCT name FROM grade WHERE name NOT IN(SELECT DISTINCT name FROM grade WHERE score <= 80);
----------------
SELECT DISTINCT name FROM grade WHERE score <= 80            -->查询结果:name 李四 张三
SELECT DISTINCT name FROM grade WHERE name NOT IN('张三','李四')    -->查询结果:name 王五
SELECT name FROM grade WHERE name NOT IN('张三','李四')           -->查询结果:name 王五 王五 王五

--方法2
SELECT name FROM grade GROUP BY name HAVING MIN(score) > 80;
----------------
SELECT name FROM grade GROUP BY name                    -->查询结果:name 李四 王五 张三
SELECT name FROM grade GROUP BY name HAVING AVG(score) < 80;      -->查询结果:name 张三 (平均成绩小于80的姓名)


--查询平均分大于80的学生的姓名:
--方法1
SELECT name FROM (SELECT COUNT(*) AS t,SUM(score) AS num,name FROM grade GROUP BY name) AS a WHERE a.num > 80*t;
----------------
SELECT COUNT(*) AS t,SUM(score) AS num,name FROM grade GROUP BY name        
    -->查询结果:
                t    num    name
                2    166    李四
                3    271    王五
                2    156    张三

SELECT COUNT(*) AS t,SUM(score) AS num,class FROM grade GROUP BY class
    -->查询结果:
                t    num    class
                3    265    数学
                1    90     英语
                3    238    语文

--方法2
SELECT name,AVG(score) AS sc FROM grade g1 GROUP BY name HAVING AVG(score) > 80;
----------------
SELECT name,AVG(score) AS sc FROM grade AS g1 GROUP BY name HAVING AVG(score) > 80;
    -->查询结果:
                name    sc
                李四    83
                王五    90

运行结果:

结果1:

结果2:

结果3:

结果4:

 

以上整理,如有错误之处或有更好的方法,请看到朋友不吝指正,谢谢!

参考文章:

http://www.cnblogs.com/praglody/p/6854181.html?utm_source=itdadao&utm_medium=referral

http://huihai.iteye.com/blog/900844

转载于:https://www.cnblogs.com/jswl/p/7504060.html

### 数据库SQL习题 对于期末考试中的数据库SQL习题,可以设计一系列题目来考察学生SQL的理解和应用能力。以下是几个不同难度级别的例子: #### 基础级 1. 创建一个名为`students`的表格,其中包含字段:id (INT), name (VARCHAR(50)), age (INT),并设置适当约束条件[^1]。 ```sql CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT CHECK(age >= 0) ); ``` 2. 向上述创建的学生表中插入几条记录,并确保数据合理合法。 ```sql INSERT INTO students VALUES (1, 'Alice', 20), (2, 'Bob', 22), (3, 'Charlie', 21); ``` #### 中等级 查询所有年龄大于等于21岁的学生姓名及其对应的年龄,并按字母顺序排列结果集。 ```sql SELECT name, age FROM students WHERE age >= 21 ORDER BY name ASC; ``` #### 高级别 假设存在另一个程成绩表`scores`,结构如下: - student_id (INT): 学生ID - course_name (VARCHAR(50)): 科目名称 - score (FLOAT): 成绩数 编写一条SQL语句找出每平均最高的那位同学的名字以及该科目的最高均(如果有多位同学取得相同高,则全部列出),同时显示他们所修读的具体科目名。 ```sql WITH avg_scores AS ( SELECT course_name, MAX(avg_score) as max_avg_score FROM ( SELECT course_name, AVG(score) OVER(PARTITION BY course_name) as avg_score FROM scores ) t GROUP BY course_name ) SELECT s.name, a.course_name, a.max_avg_score FROM avg_scores a JOIN ( SELECT course_name, student_id, AVG(score) as stu_avg_score FROM scores GROUP BY course_name, student_id ) b ON a.course_name = b.course_name AND ABS(a.max_avg_score - b.stu_avg_score) < 0.0001 JOIN students s ON b.student_id = s.id; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值