如何在SQL中查找一列中符合另一列中条件的所有项



我需要在表中找到分数,即所有成绩都在70到90之间的学生人数。答案应该只返回105和108,因为它们是唯一符合标准的学生人数。由于某种原因,我一直得到105108、109,但我不明白为什么。这是下表。

分数

sno | grade
101 | 64
109 | 68
105 | 75
109 | 76
108 | 78
107 | 79
108 | 81
101 | 85
NULL | 86
105 | 88
107 | 91
103 | 92

这就是给我这个结果的查询。

SELECT sno                              
FROM scores
GROUP BY sno
HAVING grade BETWEEN 70 and 90;```

我想你在追求这样的东西:

SELECT sno, MIN(grade) as mingrade, MAX(grade) AS maxgrade 
FROM scores 
GROUP BY sno
HAVING MIN(grade) >= 70 AND MAX(grade) <= 90

但要注意,这将返回对于"0"具有空值的行;sno";因为这一行符合您的标准。如果要排除该行,则始终可以在FROM scores之后添加WHERE sno IS NOT NULL

注意:很明显,如果您不希望在结果集中包含mingrade/maxgrade列,则可以省略它们。

附加说明:我认为您使用的是SQLite?大多数其他SQL方言抱怨您的示例中的语法,因为它们希望聚合函数应用于HAVING子句中使用的列。

值得一提的是,这里有一个在线演示

这个怎么样:

WITH OUTSIDE_GRADES
AS
(
SELECT SNO FROM SCORES
WHERE 1=1 
AND (GRADE < 70 OR GRADE > 90)
)
SELECT distinct SNO FROM SCORES WHERE SNO NOT IN (SELECT SNO FROM 
OUTSIDE_GRADES)

相关内容

  • 没有找到相关文章

最新更新