首先,这是作业的一部分,但我正在尝试更详细地说明在查询数据库时count()函数的工作原理。
问题是:列出学生的名字,SSN和课程数量(不同宿舍中课程编号相同的课程被计为不同的课程)。
我一直在用这个来查询:
SELECT S.Name, S.SSN, COUNT(*)
FROM Student S, Enrollment E
WHERE S.SSN = E.SSN
GROUP BY S.SSN
这似乎返回了正确的答案,但我不确定为什么。结果,我似乎无法得到下一个问题(假设在不同方面采用相同CourseNumber的课程被视为一门课程)是正确的。
以下是create table命令,因此您可以看到哪个表包含哪些信息:
CREATE TABLE Student(
SSN INT(9),
Name VARCHAR(20),
Major VARCHAR(30),
PRIMARY KEY (SSN)
);
CREATE TABLE Course(
CourseNumber INT(5),
PrerequisiteCourseNumber INT(10),
CourseTitle VARCHAR(10),
NumberUnits INT(2),
PRIMARY KEY (CourseNumber)
);
CREATE TABLE Section(
CourseNumber INT(5),
Quarter VARCHAR(10),
RoomNumber INT(5),
DayTime VARCHAR(20),
PRIMARY KEY (CourseNumber,Quarter),
FOREIGN KEY (CourseNumber) REFERENCES Course(CourseNumber)
);
CREATE TABLE Enrollment(
SSN INT(9),
CourseNumber INT(5),
Quarter VARCHAR(10),
Grade VARCHAR(1),
PRIMARY KEY (SSN,CourseNumber,Quarter),
FOREIGN KEY (SSN) REFERENCES Student(SSN),
FOREIGN KEY (CourseNumber) REFERENCES Course(CourseNumber),
FOREIGN KEY (Quarter) REFERENCES Section(Quarter)
);
任何指针?
答案 0 :(得分:3)
你正在做的是使用旧的连接语法(pre ansi syntax),你可以在其中进行表的交叉连接,并使用where将其转换为连接。一个等价的查询就是这个。
SELECT S.Name, S.SSN, COUNT(*)
FROM Student S
JOIN Enrollment E ON S.SSN = E.SSN
GROUP BY S.SSN
现在回答你关于伯爵正在做什么和做什么的问题..
COUNT()返回返回的每一行的计数。 GROUP BY通过共同点(即您的SSN字段)对所有记录进行分组。因此,如果学生在表格中有5个SSN行,那么他的计数将为5。
现在您正在寻找有课程编号的部分..您需要在相应的字段中加入这些表格,并在每个季度为您的论坛添加一个字段
又添加到上一个代码..
WHERE E.quarter = whatever_quarter_you_want
如果需要,您可以为此查询添加更多内容。但如果您想要更完整的答案,请在问题中添加数据。
答案 1 :(得分:0)
您当前的查询是: -
SELECT S.Name, S.SSN, COUNT(*)
FROM Student S
INNER JOIN Enrollment E
ON S.SSN = E.SSN
GROUP BY S.SSN
这样做是为了让学生加入招生,因此为每个学生提供多行,每个学生为他们注册的每个课程/季度。然后按SSN(学号?)进行分组,以计算他们注册的课程/宿舍数。你应该真的按S.Name分组(虽然MySQL不会反对,大多数SQL会这样)。
请注意,COUNT(*)计算行数。您可以使用COUNT(E.CourseNumber)来计算课程编号不为空的行数。这里不太有用,但对于LEFT OUTER JOIN可能很有用。您还可以使用COUNT(DISTINCT CourseNumber)来计算学生的唯一非空课程编号。
LEFT OUTER JOIN也可能更好,因为这可以让你返回0作为存在但未注册参加任何课程的学生的计数: -
SELECT S.Name, S.SSN, COUNT(DISTINCT E.CourseNumber)
FROM Student S
LEFT OUTER JOIN Enrollment E
ON S.SSN = E.SSN
GROUP BY S.Name, S.SSN
答案 2 :(得分:-2)
SELECT S.Name, S.SSN, COUNT(*)
FROM Student S, Enrollment E, Section Sec, Course C
WHERE S.SSN = E.SSN AND E.CourseNumber = Sec.CourseNumber
AND Sec.CourseNumber = C.CourseNumber AND Sec.Quarter like E.Quarter
GROUP BY S.Name, S.SSN