You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求SQL查询语句:找出同时拥有mathematics和computer类书籍的学生信息

解决方案:查询同时关联数学和计算机科目的学生信息

没问题,我来帮你解决这个查询需求。要找出同时关联了mathematics和computer科目的学生,我们需要先从book表中筛选出符合条件的学生ID,再关联student表获取详细信息,具体可以用以下两种常用方法:

方法一:分组统计筛选(适合大多数场景)

这种方法通过子查询先筛选出同时拥有两个目标科目的学生ID,再关联学生表获取信息:

SELECT s.Student_ID, s.name AS student_name, s.age
FROM student s
JOIN (
    -- 子查询:筛选出同时关联两个科目的学生ID
    SELECT student_ID
    FROM book
    WHERE subject IN ('mathematics', 'computer')
    GROUP BY student_ID
    -- 确保该学生同时拥有两个不同的科目(避免同一科目重复记录干扰)
    HAVING COUNT(DISTINCT subject) = 2
) b ON s.Student_ID = b.student_ID;

逻辑说明:

  1. 子查询部分:先从book表中过滤出科目为mathematics或computer的记录,然后按student_ID分组。
  2. HAVING COUNT(DISTINCT subject) = 2:确保分组后的学生同时关联了两个不同的目标科目,避免同一个科目多次记录导致的误判。
  3. 最后将子查询的结果与student表通过学生ID关联,获取对应的学生姓名和年龄。

方法二:双重EXISTS验证(适合有索引的高性能场景)

如果你的book表在student_ID和subject字段上有索引,这种方法的查询性能会更优:

SELECT s.Student_ID, s.name AS student_name, s.age
FROM student s
-- 验证该学生存在mathematics科目关联记录
WHERE EXISTS (
    SELECT 1
    FROM book b1
    WHERE b1.student_ID = s.Student_ID
      AND b1.subject = 'mathematics'
)
-- 同时验证该学生存在computer科目关联记录
AND EXISTS (
    SELECT 1
    FROM book b2
    WHERE b2.student_ID = s.Student_ID
      AND b2.subject = 'computer'
);

逻辑说明:

通过两个独立的EXISTS子查询,分别检查当前学生是否存在mathematics和computer的关联记录,只有两个条件都满足时,该学生才会被选中。

注意事项

  • 字段大小写:如果你的数据库对字段名大小写敏感(比如PostgreSQL的特定配置),请确保student表的Student_ID和book表的student_ID匹配一致,必要时可以用引号包裹字段名(例如"Student_ID")。
  • 重复记录处理:如果book表中同一个学生同一个科目有多条记录,方法一中的COUNT(DISTINCT subject)可以避免误判;若能确保每个学生每个科目只有一条记录,也可以去掉DISTINCT使用COUNT(*) = 2。

内容的提问来源于stack exchange,提问作者cee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:34:09