原文转载自: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
相关推荐
【综合练习4:企业综合SQL笔试1】 在本次练习中,我们需要使用SQL语句来解决一系列涉及学生、课程、...以上是根据题目描述及提供的数据表结构给出的SQL查询解答,每个查询都针对一个特定的问题,旨在提取所需的信息。
--25、查询各科成绩前三名的记录--25.1 分数重复时保留名次空缺--25.2 分数重复时不保留名次空缺,合并名次--sql 2000用子查询实现--sql 2005用DENSE_RANK实现--26、查询每门课程被选修的学生数 --27、查询出只有两...
--3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 --4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 --4.1、查询在sc表存在成绩的学生信息的SQL语句。 --4.2、查询在sc表中不...
(7)查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列; (8)查询缺成绩的学生的姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名...
10. 查询每个同学各门课程的平均成绩和最高成绩,按降序输出姓名、平均成绩、最高成绩:通过聚合函数AVG和MAX计算平均分和最高分,然后按指定顺序排序。 11. 查询所有学生都选修了的课程号和课程名:找出所有学生的...
该语句使用了 left outer join 语句,将学生表和成绩表进行连接,firstly,查询出所有学生的信息,接着使用 group by 语句将结果集进行分组,最后输出每个学生的学号、姓名、选课数和总成绩。 4. 查询姓 李 的老师...
查询计算机系年龄大于计算机系平均年龄的学生的姓名和年龄。 查询计算机系考试成绩小于总平均分的学生的学号、姓名。 将考试成绩最低的并且不及格学生的最低修课成绩改为60。 将数据库基础考试成绩最低的且成绩为不...
1. 查询“ ”课程比“ ”课程成绩高的所有学生的学号 该实例使用了子查询来解决问题。首先,使用子查询将“ ”课程和“ ”课程的成绩分别查询出来,然后使用 WHERE 语句比较两个成绩,最后返回学号。 2. 查询平均...
- **查询数据库课程的成绩大于70分的、所有课程平均分最高的学生信息**:先找出符合条件的学生,再求平均分。 - 示例代码: ```sql SELECT 学号, AVG(成绩) AS 平均分 FROM 选课 WHERE 学号 IN (SELECT 学号 ...
13) 查询每一门课程成绩都大于等于80分的学生学号、姓名和性别,把值送往另一个已经存在的基本表STU(SNO,SNAME,SSEX)中 14) 把所有学生学号和课程号连接追加到新表中 15) 所有学生年龄增1 16) 统计3门...
这个查询语句的作用是从学生表和成绩表中检索出学号、姓名、成绩信息,其中课程代号为“06”且成绩大于或等于 80 分的学生。 4. 数据统计 SELECT COUNT(*) AS 学生人数 FROM 学生 这个查询语句的作用是统计学生表...
列出各门课程成绩最好的学生 原始SQL语句为: ```sql select t1.StudentID, t1.CourseID, t2.maxscore from ScoreInformation t1, (select CourseID, max(Score) as maxscore from ScoreInformation group by ...
在信息技术领域,开发一个学生成绩管理系统是一项常见的实践项目,尤其在数据库课程设计中。本系统——"基于JavaWeb的学生成绩管理系统",旨在提供一个全面、易用的平台,用于管理学生的成绩数据。它涉及到的关键...
例如,你可以查询所有年龄大于18岁的学生姓名和性别。 2. **SQL的连接查询操作**:当有多个相关表时,连接查询允许我们从不同表中提取关联信息。这涉及到INNER JOIN(只返回两个表中匹配的记录)、LEFT JOIN(返回...
使用聚合函数avg()计算学生的平均成绩,然后使用having子句过滤出平均成绩大于60分的学生。 3. 查询所有同学的学号、姓名、选课数、总成绩: 使用left outer join连接Student表和SC表,计算每个学生的选课数和总...
此查询使用了聚合函数`AVG()`以及`GROUP BY`和`HAVING`子句,以便计算每个学生的平均成绩,并筛选出平均成绩大于60分的学生。 ```sql SELECT S#, AVG(Score) FROM SC GROUP BY S# HAVING AVG(Score) > 60; ``` - *...
使用嵌套查询,先获取每个学生的“001”课程成绩,再比较“002”课程成绩,找出低于“001”的学生。 9. 查询所有课程成绩小于60的同学的学号、姓名: 使用NOT IN与子查询结合,排除成绩大于60的学生。 10. 查询...
11. 题目11:查询每门课都是80分以上的学生的学号与姓名。通过子查询找出所有课程成绩均大于80分的学号。 SQL 语句:`select sno, sname from s where sno in (select sno from sc group by sno having min(grade)>...
- 第二种方法则利用`GROUP BY`和`HAVING`子句,检查每个学生所有课程的成绩最小值是否都大于80分。 **6. 检索获奖学金的学生名单(每门课程在80分以上,平均成绩在90分以上)。** ```sql SELECT sname 姓名 FROM ...
8. 查询课程平均成绩大于 80 的课程名称:使用 AVG 函数和 GROUP BY 语句实现分组查询。 9. 查询选修人数最多的课程名称:使用 COUNT 函数和 GROUP BY 语句实现分组查询。 10. 查询计算机系的学生选修课程中选修...