`

转:一个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

 

分享到:
评论

相关推荐

    SQL语言嵌套查询和数据更新操作

    36. 把平均成绩大于80分的男同学的学号和平均成绩存入另一个表S——GRADE(SNO,AVG——GRADE); 37. 把选修了课程名为“数据结构”的学生的成绩提高10%; 38. 把选修了“C2”号课程,且成绩低于该门课程的平均...

    MYSQL题目练习

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

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

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

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

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

    实验3答案-sql2.sql

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

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

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

    sql面试题- (学生表_课程表_成绩表_教师表)

    1、查询“001”课程比“002”课程成绩高的所有学生的学号; select a.S# from (select s#,score from SC where C#='001') a,(select s#,score from SC where C#='002') b where a.score&gt;b.score and a.s#=b.s#...

    VB.Net学生成绩管理系统

    5、可以设置,修改,增加学生信息,也可以批量增加学生信息,批量增加的学生姓名都是学生编号,可以学生登录后台后自己修改姓名等信息,学生增加的时候必须选择相关的班级。 6、可以设置,修改,增加课程信息,包括...

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

    这是一个数据库的课程设计作业,是基于javaweb的一个学生成绩管理系统,里面涵盖的数据库的增删改查等等操作,前端为了美观用的是bootstrap框架。

    经典sql练习

    经典sql练习,链接给出题型: https://www.jobui.com/mianshiti/it/shujuku/5838/ 本意无需资源分数,但csdn变坏了,没有0分可以选,没有分数的,发qq邮箱索要1943680751

    数据库实验交互模式下的DML sql查询

    (9)找出选修“数据库”课程,且成绩大于90的学生姓名 (10)找出张平所选修全部课程的课程名和成绩 (11)找出选修了所有课程的学生的学号 (12)找出选修了学号为“98001”的学生所选修所有课程的学生姓名 (13)...

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

    1、查询“201”课程比“202”课程成绩高的所有学生的学号 2、查询平均成绩大于“60”分的同学的学号和平均成绩 3、查询“所有”同学的学号、姓名、选课数、总

    大学生数据库实验.zip

    (2) 查询每一门课的间接先行课(即先行课的先行课)。 (3) 查询学生的学号、姓名、选修课程的名称和成绩。 (4) 查询选修了课程的学生姓名。 (5) 查询所有学生的信息和所选修的课程。 (6) 查询已被选修的课程的情况和...

    数据库原理A实验报告二(实验报告二)

    一.实验题目 (1)数据库单表查询和多表连接查询 二.实验要求 (1)掌握单表查询SELECT、FROM、WHERE的用户,特别要掌握比较运算符、逻辑运算符的...(3)查询学生的学号、姓名、选修课程的名称和成绩 (4)查询选

    【SQL语句练习】(一) 查询学生获得的总学分

    本题目要求编写SQL语句, 检索出学生‘张三’选修的所有课程及成绩,最后计算他所获得的总学分。输出成绩结果集按课程号升序排序。 注意:选课成绩在60分以上才能获得相应的学分。cou表中credit列为某课程的学分值 ...

    50个常用SQL语句,很好

    2、查询平均成绩大于60分的同学的学号和平均成绩; select S#,avg(score) from sc group by S# having avg(score) &gt;60; 3、查询所有同学的学号、姓名、选课数、总成绩; select Student.S#,Student.Sname,...

    数据库原理实验报告整合

    9、查询选修‘101’课程或‘102’课程的学生姓名。 select from where 10、查询选修‘101’课程和‘102’课程的学生学号。 select from where 11、查询选修‘101’课程但没选修‘102’课程的学生学号。 ...

    SQL50个查询命令

    1、查询“001”课程比“002”课程成绩高的所有学生的学号; select a.S# from (select s#,score from SC where C#='001') a,(select s#,score from SC where C#='002') b where a.score&gt;b.score and a.s#=b.s#; ...

    实验2答案-sql1.sql

    查询计算机系学生考试成绩最低的两个成绩所对应的学生的姓名、课程名和成绩。 列出没有选课的学生的学号、姓名和所在系。 三、思考题 1、创建表: 教师表(  tid 普通编码定长字符型,长度为10,主关键字  ...

    MYSSQL_MSS_ORACLE经典SQL.pdf

    2、--查询平均成绩大于60分的同学的学号和平均成绩; select S#,avg(score) from sc group by S# having avg(score) &gt;60; 3、--查询所有同学的学号、姓名、选课数、总成绩; select Student.S#,Student....

Global site tag (gtag.js) - Google Analytics