【转】一个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 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
时间: 2024-11-10 04:13:59

【转】一个SQL查询出每门课程的成绩都大于80的学生姓名的相关文章

SQL查询出每门课都大于80 分的学生姓名

Course表如下: 查询出每门课都大于80 分的学生姓名有两种方法. 1.select  distinct name from Course where name not in (select distinct name from Course where score<=80) 2.select  name    from Course group by name having min(score)>80

[关于SQL]查询成绩都大于80分的学生

1.用一条SQL语句 查询出每门课都大于80分的学生姓名name kecheng fenshu张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英语 90 CREATE TABLE [dbo].[chengji]( [name] [nvarchar](50) NULL, [kecheng] [nvarchar](50) NULL, [fenshu] [int] NULL ) ON [PRIMARY] GO INSERT [dbo].[chen

用一条SQL语句 查询出每门课程都大于80分的学生姓名&quot; 的实现方式

建表: 1 create table Score( 2 name varchar(20), 3 course varchar(20), 4 score int) 5 6 go 7 8 insert Score 9 select 'HanMeimei','Chinese',81 union all 10 select 'HanMeimei','Mathematics',75 union all 11 select 'HanMeimei','History',81 union all 12 sele

用一条sql语句查询出“每门”课程都大于80分的学生姓名

Name chengji fengshu张三 数学 75张三 语文 81李四 数学 90李四 语文 76王五 数学 81王五 语文 100王五 英语 90 SQL Server: select distinct [Name] from [表] where [Name] not in ( select [Name] from [表] where [fengshu]<=80) 或者 select distinct name from A minus select name from A where

如何将sql查询出的列名用注释代替?

如何将sql查询出的列名用注释代替? 大家正常的工作的时候,会有这样的要求,客户想要看下原始数据,但是呢.前台导出又麻烦,这时候只能从数据库拷贝出来一份.但是呢,数据库里面的字段客户又看不明白,只能用数据库里面的注释.但是这时候,如果要求很多张表,难道我们要一个个复制吗?这也太tm蠢了. 1 查看我们表 select * from user_col_comments where table_name='TNAME'; 2 写上函数 create or replace function f_col

开发中遇到的问题---【使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据】

问题:使用mybatis时 有一个sql查询不到结果 日志也显示查询为o 但是从日志中取出执行的sql到数据库客户端手动执行,可以查到数据: 原因:MyBatis看到 #{}会认为你在给sql中的变量赋值,就像JDBC编程中给问号赋值一样(自动在前后加单引号)也就是说,他把你传入的字符串并没有当做多个值,而是当做一个大的字符串,所以查询不到值 而MyBatis看到${}的时候会直接将之替换成变量的值而不做任何处理: 解决方案:将查询条件中的“#”替换成“$”. <select id="fi

用一条SQL语句查出每门课都大于80分的学生的姓名

用一条sql语句查询出所有课程都大于80分的学生名单: name cource score 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 语文 81 王五 数学 100 王五 英语 90 1 SET FOREIGN_KEY_CHECKS=0; 2 3 -- ---------------------------- 4 -- Table structure for grade 5 -- ---------------------------- 6 DROP TABL

InterviewQuestion_SQLServer_Probl_查询每门课都大于80分的学生姓名

题目:用一条SQL语句查询出每门课都大于80分的学生姓名. 最近面试C#开发工程师,碰到上面这个考数据库的题目,自己感觉有点难度,没有思路,现将找到的解决方案整理如下: 文件:SQLQuery1.sql /* 环境:Microsoft SQL Server 2012 工具: Microsoft SQL Server Management Studio 数据库: Interview 数据表: grade 详情: name class score 张三 语文 81 张三 数学 75 李四 语文 76

SQL查询有两门以上不及格的学生及查询出全部及格的学生

1.表结构: /*学生*/ create table student( sno int not null primary key, sname varchar(10) ); /*课程*/ create table center( cno int not null primary key, cname varchar(10) ); /*分数*/ create table sgrade( sno int , cno int , sgrade int ); 2.插入数据: insert into st