SQL查询问题:匹配大小写无关的CS院系并统计学术人员数
解决CS院系学术人员统计问题
首先,先明确你的核心需求:
- 找出所有名称包含(大小写无关)"Computer ... Science"或"Computing ... Science"的院系(中间允许有其他内容)
- 输出这些院系的
deptnum和对应的学术人员总数 - 必须使用
NATURAL JOIN - 结果按
deptname字母顺序排序
你现有代码的问题
第一次尝试的问题
SELECT deptnum FROM academic NATURAL JOIN department WHERE UPPER(deptname) LIKE ('%computer science%') OR UPPER(deptname) LIKE ('%computing science%') ORDER BY deptnum;
- 匹配逻辑错误:
%computer science%要求"computer"和"science"是连续的短语,但需求允许中间有其他内容(比如"Computer Information Science"),所以这种写法匹配不到这类院系 - 缺少统计逻辑:只查询了
deptnum,没有统计每个院系的学术人员总数 - 排序不符合要求:你按
deptnum排序,但需求是按deptname字母顺序 - 未分组/去重:同一个院系的多个学术人员会导致
deptnum重复输出
第二次尝试的问题
你修改后的代码虽然调整了匹配逻辑,但还是没解决统计总数和排序的问题,而且用DISTINCT去重的效率不如分组,分组才是处理这类聚合统计更合适的方式。
正确的查询代码
SELECT deptnum, COUNT(academicid) AS total_academic_staff FROM academic NATURAL JOIN department WHERE (UPPER(deptname) LIKE '%COMPUTER%' AND UPPER(deptname) LIKE '%SCIENCE%') OR (UPPER(deptname) LIKE '%COMPUTING%' AND UPPER(deptname) LIKE '%SCIENCE%') GROUP BY deptnum, deptname ORDER BY deptname ASC;
关键细节解释:
- 统计总数:用
COUNT(academicid)来统计每个院系的学术人员数量,别名total_academic_staff让结果更直观易读 - 正确匹配:把"Computer/Computing"和"Science"拆分成两个独立的
LIKE条件,并用括号确保逻辑优先级,这样能匹配中间有任意内容的院系名称(比如"Computing Systems Science""Computer and Data Science"等) - 分组去重:通过
GROUP BY deptnum, deptname确保每个院系只返回一行结果,同时为按deptname排序提供依据 - 正确排序:
ORDER BY deptname ASC严格按照需求的字母顺序排序 - NATURAL JOIN:满足题目要求的连接方式,它会自动匹配两个表中同名的关联列(这里应该是
deptnum)
为什么原代码无结果?
最可能的原因是你的数据库里,符合条件的院系名称中"Computer/Computing"和"Science"之间有其他字符(比如空格以外的词汇),而你第一次的代码要求这两个词连续出现,所以无法匹配到数据。修改后的拆分条件就能覆盖这类情况。
内容的提问来源于stack exchange,提问作者user24529
相关产品推荐
相关产品推荐

