SQLite,聚合查询为where子句

时间:2014-05-12 06:59:46

标签: sql sqlite

鉴于架构:

CREATE TABLE Student (
    studentID INT PRIMARY KEY NOT NULL,
    studentName TEXT NOT NULL,
    major TEXT,
    class TEXT CHECK (class IN ("Freshman", "Sophomore", "Junior", "Senior")),
    gpa FLOAT CHECK (gpa IS NULL OR (gpa >= 0 AND gpa <= 4)),
    FOREIGN KEY (major) REFERENCES Dept(deptID) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE Dept (
    deptID TEXT PRIMARY KEY NOT NULL CHECK (LENGTH(deptID) <= 4),
    NAME TEXT NOT NULL UNIQUE,
    building TEXT
);

CREATE TABLE Course (
    courseNum INT NOT NULL,
    deptID TEXT NOT NULL,
    courseName TEXT NOT NULL,
    location TEXT,
    meetDay TEXT NOT NULL CHECK (meetDay IN ("MW", "TR", "F")),
    meetTime INT NOT NULL CHECK (meetTime >= '07:00' AND meetTime <= '17:00'),
    PRIMARY KEY (courseNum, deptID),
    FOREIGN KEY (deptID) REFERENCES Dept(deptID) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE Enroll (
    courseNum INT NOT NULL,
    deptID TEXT NOT NULL,
    studentID INT NOT NULL,
    PRIMARY KEY (courseNum, deptID, studentID),
    FOREIGN KEY (courseNum, deptID) REFERENCES Course ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (studentID) REFERENCES Student(studentID) ON UPDATE CASCADE ON DELETE CASCADE
);

我正在尝试为参加课程数量最多的学生找到他们正在参加的课程的名称,身份证和课程数量。检索名称和ID的sELECT很简单,但是我无法确定如何选择每个学生正在学习的课程数量,然后找到最大值并将其用作WHERE子句。

这是我到目前为止所做的:

SELECT Student.studentName, Student.studentID, COUNT(*) AS count
FROM Enroll
INNER JOIN Student ON Enroll.studentID=Student.studentID
GROUP BY Enroll.studentID

1 个答案:

答案 0 :(得分:0)

首先,您要计算每个学生的所有注册课程

SELECT COUNT() AS num 
FROM Enroll 
GROUP BY studentID

然后,您可以使用HAVING针对现有查询进行检查,以获得最终查询。

SELECT Student.studentName,Student.studentID,COUNT(*) AS count
       FROM Enroll
       INNER JOIN Student ON Enroll.studentID=Student.studentID
       GROUP BY Enroll.studentID
       HAVING COUNT()=(SELECT COUNT() AS num FROM Enroll GROUP BY studentID);

因此,回顾一下这基本上得到的数字代表了所有学生的最高入学人数,然后让所有学生在那个数字是他们的入学人数,因此所有学生的入学人数最高或相同。

我们使用HAVING,因为它是在GROUP BY之后应用的,这意味着您无法在COUNT()子句中使用WHERE等聚合函数。