sql - 涉及在列中查找最频繁元组值的 SQL 查询
问题描述
我有以下关系:
- 教(ID,course_id,sec_id,学期,年)
- 讲师(ID,姓名,部门名称,薪水)
我试图将以下内容表达为 SQL 查询:
找到教过最多课程的讲师的 ID 和姓名(即在教中拥有最多的元组)。
我的查询
select ID, name
from teaches
natural join instructor
group by ID
order by count(*) desc
我知道这是不正确的,但我觉得我在正确的轨道上。为了回答这个问题,您需要处理这两种关系,因此需要自然连接操作。由于该问题询问教授最多课程的讲师,这告诉我我们正在尝试计算每个讲师 ID 出现在教员关系中的次数。据我了解,我们希望计算不同的讲师 ID,因此需要按命令分组。
解决方案
不要使用自然连接:它们所做的只是依靠列名来决定哪些列与表相关(它们不会检查外键约束或类似的东西,正如您所想的那样)。这在本质上是不可靠的。
您可以使用常规inner join
:
select i.id, i.name
from teaches t
inner join instructor i on i.id = t.sec_id
group by i.id, i.name
order by count(*) desc
limit 1
笔记:
这假设该列
teaches.sec_id
与instructor.id
(我看不出可以使用哪个其他列)我
limit
在查询中添加了一个子句,因为您声明您想要顶级讲师 - 语法可能因数据库而异始终在列名前加上它们所属的表,以使查询明确且更易于理解
在聚合查询中,子句中列出的所有非聚合列
select
都应出现在group by
子句中,这是一种很好的做法(也是许多数据库的要求);group by
我在您的条款中添加了讲师姓名
推荐阅读
- python - 大熊猫在行之间移动增量
- c# - Typewriter 生成的 TS 文件不是模块
- r - R循环文件导入
- python - Pandas Max or Min Row value in a new column based on value another colum
- php - 获取href值的dom x路径
- java - 无法删除 ParseException
- java - 我可以在 Neo4j 中使用直接 I/O 吗?
- javascript - 使用 javascript 移动元素处理网页滚动的问题
- c# - 如何让路由检测带有路由前缀的子路由?
- javascript - 是否有运行 JS 和 UI 编译的 AOT 的本机电子或类似库?