Sql 当找不到某个值的记录时,计数应为0

Sql 当找不到某个值的记录时,计数应为0,sql,Sql,我有两张桌子,A和B。A桌有学生名单。表B列出了他们的出席人数。我正在检查哪个学生上了多少课。我没有得到从未出现过的学生的记录。我想获取他们的记录,在他们的姓名前加上0。以下是我正在使用的查询: SELECT StudentName, Count(*) FROM Students, Attendance WHERE Students.StudentID = Attendance.StudentID GROUP BY StudentName 我已经检查了贴在网上的问题的答案 我尝试使用解决方案

我有两张桌子,A和B。A桌有学生名单。表B列出了他们的出席人数。我正在检查哪个学生上了多少课。我没有得到从未出现过的学生的记录。我想获取他们的记录,在他们的姓名前加上0。以下是我正在使用的查询:

SELECT StudentName, Count(*) 
FROM Students, Attendance
WHERE Students.StudentID = Attendance.StudentID
GROUP BY StudentName
我已经检查了贴在网上的问题的答案 我尝试使用解决方案中给出的左连接,但仍然得到相同的结果。从未出现在考勤表中的学生不会出现在查询结果中。我想看到他们的名字与计数0对他们的名字。
提前谢谢

您应该使用
左外连接
如下-

SELECT StudentName, Count(Attendance.StudentID) 
FROM Students left outer join Attendance
on (Students.StudentID = Attendance.StudentID)
GROUP BY StudentName
编辑

根据bendataclear强调的非常有效的一点,我已将
count(*)
表达式更改为
count(attention.StudentID)
。 现在看看它是如何工作的,如果假设我们想得到学生的
0
作为总数,而他们在考勤表中没有任何条目,对于那些左侧的外部联接输出,将在Attention.studentID列中有空值,并且当我们尝试计算此列时,这些学生的值将返回零

编辑2

案例-我们还需要具备classID的条件(来自考勤表)


我想这可以解决您的问题。

我忘记了
列上的
isnull
(这是我的名字,不是你的),但它肯定在Sql Server中工作:-

create table #students (
    studentid int,
    studentname varchar(50)
)
insert into #students values 
    (1,'david smith'),
    (2,'somebody else'),
    (3,'another person')

create table #attendance (
    studentid int,
    attendedon date
)
insert into #attendance values
     (1,'2013-01-01'),
     (3,'2013-01-01'),
     (3,'2013-01-02')

select s.studentname, isnull(a.classes,0) as classes
from #students s
left join (
    select studentid, count(*) as classes
    from #attendance
    group by studentid
) a on a.studentid=s.studentid
order by s.studentname
返回:-

studentname     classes
another person  2
david smith     1
somebody else   0

Count(*)
将为学生表中的所有学生返回大于0的值,您希望对左侧联接表中的一个字段进行计数,以获得匹配行的计数(例如
Count(attentication.StudentID)
)谢谢Pratik和Ben!这解决了我的基本问题,但还有一个问题。为了简化查询,我删除了运行此查询的特定学生和特定类。如果我删除where子句,我将正确获得所有结果,但是,如果我添加where子句并指定我查询的学生列表和我要查询的班级列表,我将错过count为0的行。。对此有什么建议吗?如果您对带有“班级”列的考勤表设置条件,而相应的班级不在该表中,那么您将无法从该表中获得任何行结果,您将无法从该表中获得任何结果。为此,您可以在subqyery中使用该条件来代替考勤表。请参阅我的更新答案\n另外,左连接和左外部连接似乎给出了相同的结果?此答案早于问题中添加MySQL的日期-我不知道此语法在MySQL中是否有效-但我将把它留给那些在寻找Microsoft解决方案时遇到困难的人。谢谢David,但是,我在这方面遇到语法错误,无法尝试:(.我正在使用MS SQL。上面提供的第一个解决方案解决了我最初的问题。谢谢你的帮助!我的解决方案是特定于SQL server的。你确定你没有使用MySQL吗?我正在使用MS SQL 2005…我可能误解了语法?奇怪。这个问题被标记为MySQL,这导致了我的困惑。我在回答中看不到任何内容这将导致语法错误…但如果没有您的模式,则很难进行测试。我将再看一看,看看我是否疯了。。。
studentname     classes
another person  2
david smith     1
somebody else   0