⼀个SQL查询出每门课程的成绩都⼤于80的学⽣姓名
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 urse <> S1.course
inner join Student S2 on S.name = S2.name urse <> 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