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

name   kecheng    fenshu 数学

张三     语文     81class

张三     数学     75方法

李四     语文     76数据

李四     数学     90查询

王五     语文     81英语

王五     数学     100di

王五     英语     90时间

 

方法一:vi

 

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

 

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

 

  点评:此方法是根据题目,依题解题,中规中矩! 不过多张表链接很是耗费时间。并且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

相关文章
相关标签/搜索