在同一 SQL 查询中使用 WHERE、HAVING 和 GROUP BY
Using WHERE, HAVING, and GROUP BY in the same SQL query
我正在尝试查找所有 类 的姓名,他们要么在 R128 房间开会,要么有五个或更多学生注册在这两个名为 'enroll' 和 'class' 的表格中。我可以分别找到这个问题的两个部分,但我不明白如何在一个查询中找到它们。
这给了我想要的 类 房间 R128:
SELECT class.cname
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
WHERE room='R128';
这给了我 类 有 5 个或更多的学生注册:
SELECT class.cname
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
GROUP BY enroll.cname
HAVING COUNT(enroll.cname)>4;
我不知道如何将它们组合成一个查询。这是我目前所拥有的,但它 returns 是一个空集:
SELECT class.cname, COUNT(enroll.cname)
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
WHERE room='R128'
GROUP BY enroll.cname
HAVING COUNT(enroll.cname)>4;
这是class table
和 enroll table
R128房间的类是专利法、数据结构、印加考古学、奶牛群管理、数学概论。 类 有 5 个或更多学生的是数据库系统和操作系统设计。
这会产生您想要的结果吗?
select c.cname
from class c
inner join enroll e on e.cname = c.cname
group by c.cname
having max(room = 'R128') = 1 or count(*) > 4
假设 room
在 class
中,我建议 union
:
select c.cname
from class c
where room = 'R128'
union -- on purpose to remove duplicates
select e.cname
from enroll e
group by e.cname
having count(*) >= 5;
我正在尝试查找所有 类 的姓名,他们要么在 R128 房间开会,要么有五个或更多学生注册在这两个名为 'enroll' 和 'class' 的表格中。我可以分别找到这个问题的两个部分,但我不明白如何在一个查询中找到它们。
这给了我想要的 类 房间 R128:
SELECT class.cname
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
WHERE room='R128';
这给了我 类 有 5 个或更多的学生注册:
SELECT class.cname
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
GROUP BY enroll.cname
HAVING COUNT(enroll.cname)>4;
我不知道如何将它们组合成一个查询。这是我目前所拥有的,但它 returns 是一个空集:
SELECT class.cname, COUNT(enroll.cname)
FROM enroll RIGHT JOIN class ON enroll.cname=class.cname
WHERE room='R128'
GROUP BY enroll.cname
HAVING COUNT(enroll.cname)>4;
这是class table 和 enroll table
R128房间的类是专利法、数据结构、印加考古学、奶牛群管理、数学概论。 类 有 5 个或更多学生的是数据库系统和操作系统设计。
这会产生您想要的结果吗?
select c.cname
from class c
inner join enroll e on e.cname = c.cname
group by c.cname
having max(room = 'R128') = 1 or count(*) > 4
假设 room
在 class
中,我建议 union
:
select c.cname
from class c
where room = 'R128'
union -- on purpose to remove duplicates
select e.cname
from enroll e
group by e.cname
having count(*) >= 5;