`

转:一个SQL查询出每门课程的成绩都大于80的学生姓名

阅读更多

原文转载自:http://www.cnblogs.com/hongyan5682/p/4816444.html

 

以下为转载内容:

 

表结构及数据:

name   kecheng    fenshu
张三     语文     81
张三     数学     75
李四     语文     76
李四     数学     90
王五     语文     81
王五     数学     100
王五     英语     90

 

方法一

  思路:如果能获得一张表,由学生姓名,语文成绩,数学成绩,英语成绩的表,剩下的就是在WHERE条件中筛选及可以获得想要的结果。

 

  具体办法:通过自连接的办法,以“姓名”为连接条件,自连接三次,便可以获得包含又姓名和三门课程成绩的数据行。虽然可以得到想要的数据列。但会有很多冗余重复列!

 

  点评:此方法是根据题目,依题解题,中规中矩! 不过多张表连接非常耗费时间。而且SQL语句也比较复杂,需要注意事项很多。

SELECT  D.name  FROM (
SELECT  S.name,S.score AS ITEM1,S1.score AS ITEM2,S2.score AS ITEM3
FROM Student S 
inner join Student S1 on S.name = S1.name and S.course <> S1.course
inner join Student S2 on S.name = S2.name and S.course <> S2.course
WHERE S.score>=80 and S1.score>=80 and S2.score>=80
) D 
GROUP BY D.name
易错点:内表的 score字段必须要取别名,否则会报错 。

 

方法二

  思路:采用逆向思维想想。。。。。。求三门成绩都大于80的人,也可以是使先查出有成绩小于80 的人,再除去这些人不就是三门成绩都大于80的人了么?  以前学过的数学逻辑逆向思维还真是有用的阿!!

 

  具体办法:先扫描表,查出有成绩小于80的人的姓名,然后再次扫描表,用not in 或not exists 方法。

 

  点评:此方法采用逆向思维,能快速写出高效且简单的 SQL语句。

//not in 
SELECT DISTINCT A.name FROM Student A 
WHERE A.name not in(
SELECT Distinct S.name FROM Student S WHERE S.score <80)

//not exists

SELECT DISTINCT A.name From Student A  
where not exists (SELECT 1 From Student S Where  S.score <80 AND S.name =A.name)

/*exists 详解
取出 外表第一条数据 ,然后与内表  根据连接条件 ,
形成一条或多条数据,判断这些生成的数据中是否存在
或者是不存在符合where条件的 。结果为ture的那条外表
记录旧被查询出来!

实例过程: 取出外表的第一条记录, 
和内表通过姓名条件连接,这时候产生2两记录,
根据 not exists是判断不存在。 条件是 score<80 .
而这两条记录存在一条记录小于80,所以于not exists 不符合,
该条记录不被查出。
*/

 

方法三

SELECT S.name
FROM Student S
GROUP BY S.name
Having MIN(S.score)>=80

 

分享到:
评论

相关推荐

    综合练习4:企业综合SQL笔试1

    【综合练习4:企业综合SQL笔试1】 在本次练习中,我们需要使用SQL语句来解决一系列涉及学生、课程、...以上是根据题目描述及提供的数据表结构给出的SQL查询解答,每个查询都针对一个特定的问题,旨在提取所需的信息。

    sql超级经典(练习题+答案)

    --25、查询各科成绩前三名的记录--25.1 分数重复时保留名次空缺--25.2 分数重复时不保留名次空缺,合并名次--sql 2000用子查询实现--sql 2005用DENSE_RANK实现--26、查询每门课程被选修的学生数 --27、查询出只有两...

    MYSQL题目练习

    --3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 --4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 --4.1、查询在sc表存在成绩的学生信息的SQL语句。 --4.2、查询在sc表中不...

    交互式SQL的使用,创建Student数据库,包括Students,Courses,SC表

    (7)查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列; (8)查询缺成绩的学生的姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名...

    数据库表的建立,各种查询及视图建立实验报告

    10. 查询每个同学各门课程的平均成绩和最高成绩,按降序输出姓名、平均成绩、最高成绩:通过聚合函数AVG和MAX计算平均分和最高分,然后按指定顺序排序。 11. 查询所有学生都选修了的课程号和课程名:找出所有学生的...

    mysql 查询语句学生表、课程表、 成绩表、教师表.docx

    该语句使用了 left outer join 语句,将学生表和成绩表进行连接,firstly,查询出所有学生的信息,接着使用 group by 语句将结果集进行分组,最后输出每个学生的学号、姓名、选课数和总成绩。 4. 查询姓 李 的老师...

    实验3答案-sql2.sql

    查询计算机系年龄大于计算机系平均年龄的学生的姓名和年龄。 查询计算机系考试成绩小于总平均分的学生的学号、姓名。 将考试成绩最低的并且不及格学生的最低修课成绩改为60。 将数据库基础考试成绩最低的且成绩为不...

    50个常用sql语句实例(学生表课程表成绩表教师表)[归类].pdf

    1. 查询“ ”课程比“ ”课程成绩高的所有学生的学号 该实例使用了子查询来解决问题。首先,使用子查询将“ ”课程和“ ”课程的成绩分别查询出来,然后使用 WHERE 语句比较两个成绩,最后返回学号。 2. 查询平均...

    数据库实验四:SQL数据查询.doc

    - **查询数据库课程的成绩大于70分的、所有课程平均分最高的学生信息**:先找出符合条件的学生,再求平均分。 - 示例代码: ```sql SELECT 学号, AVG(成绩) AS 平均分 FROM 选课 WHERE 学号 IN (SELECT 学号 ...

    数据库原理及运用实验四SQL连接查询.doc

    8. 查询课程平均成绩大于 80 的课程名称:使用 AVG 函数和 GROUP BY 语句实现分组查询。 9. 查询选修人数最多的课程名称:使用 COUNT 函数和 GROUP BY 语句实现分组查询。 10. 查询计算机系的学生选修课程中选修...

    数据库基础实验的实验报告附图

    13) 查询每一门课程成绩都大于等于80分的学生学号、姓名和性别,把值送往另一个已经存在的基本表STU(SNO,SNAME,SSEX)中 14) 把所有学生学号和课程号连接追加到新表中 15) 所有学生年龄增1 16) 统计3门...

    常用SQL查询代码整理

    这个查询语句的作用是从学生表和成绩表中检索出学号、姓名、成绩信息,其中课程代号为“06”且成绩大于或等于 80 分的学生。 4. 数据统计 SELECT COUNT(*) AS 学生人数 FROM 学生 这个查询语句的作用是统计学生表...

    统计成绩SQL语句

    列出各门课程成绩最好的学生 原始SQL语句为: ```sql select t1.StudentID, t1.CourseID, t2.maxscore from ScoreInformation t1, (select CourseID, max(Score) as maxscore from ScoreInformation group by ...

    基于javaweb的学生成绩管理系统

    在信息技术领域,开发一个学生成绩管理系统是一项常见的实践项目,尤其在数据库课程设计中。本系统——"基于JavaWeb的学生成绩管理系统",旨在提供一个全面、易用的平台,用于管理学生的成绩数据。它涉及到的关键...

    sql实验3 学生表的查询修改

    例如,你可以查询所有年龄大于18岁的学生姓名和性别。 2. **SQL的连接查询操作**:当有多个相关表时,连接查询允许我们从不同表中提取关联信息。这涉及到INNER JOIN(只返回两个表中匹配的记录)、LEFT JOIN(返回...

    50个SQL 语句的例子(基本覆盖所有sql语句)

    使用聚合函数avg()计算学生的平均成绩,然后使用having子句过滤出平均成绩大于60分的学生。 3. 查询所有同学的学号、姓名、选课数、总成绩: 使用left outer join连接Student表和SC表,计算每个学生的选课数和总...

    SQL50个查询命令

    此查询使用了聚合函数`AVG()`以及`GROUP BY`和`HAVING`子句,以便计算每个学生的平均成绩,并筛选出平均成绩大于60分的学生。 ```sql SELECT S#, AVG(Score) FROM SC GROUP BY S# HAVING AVG(Score) &gt; 60; ``` - *...

    数据库面试基础题常考题 低积分 福利版

    使用嵌套查询,先获取每个学生的“001”课程成绩,再比较“002”课程成绩,找出低于“001”的学生。 9. 查询所有课程成绩小于60的同学的学号、姓名: 使用NOT IN与子查询结合,排除成绩大于60的学生。 10. 查询...

    实验二 查询数据库

    11. 题目11:查询每门课都是80分以上的学生的学号与姓名。通过子查询找出所有课程成绩均大于80分的学号。 SQL 语句:`select sno, sname from s where sno in (select sno from sc group by sno having min(grade)&gt;...

    数据库技术与应用:实验四 SQL 数据查询.docx

    - 第二种方法则利用`GROUP BY`和`HAVING`子句,检查每个学生所有课程的成绩最小值是否都大于80分。 **6. 检索获奖学金的学生名单(每门课程在80分以上,平均成绩在90分以上)。** ```sql SELECT sname 姓名 FROM ...

Global site tag (gtag.js) - Google Analytics