⼀个SQL查询出每门课程的成绩都⼤于80的学⽣姓名
name kecheng fenshu顺理成章的意思
张三语⽂ 81
欧亨利短篇小说读后感
resist张三数学 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 ur <> S1.cour
inner join Student S2 on S.name = S2.name ur <> S2.cour
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