【问题标题】:SQL query to find the students in one courseSQL查询查找一门课程的学生
【发布时间】:2014-06-14 22:53:23
【问题描述】:

一共有三个表

学生、课程和注册

  Students has id, name columns

  Courses has also course.id, course.name

还有第三个表加入学生和课程表

Registration : stu_id, course_id 

一个学生可以选修一门或多门课程。

我想查找只注册一门课程的学生的姓名。

【问题讨论】:

  • 你有没有尝试过——比如阅读手册或浏览一些“学习 SQL”的网站?然后您可以尝试查询,如果它不起作用,请将其展示给我们,我们可能会提供帮助。我们不是来为你做你的工作的。或许您可以使用sqlfiddle.com 进行实验和学习!

标签: mysql sql


【解决方案1】:

尝试使用 INNER JOIN

SELECT S.id, S.name
FROM students S
INNER JOIN registration R ON S.id = R.stu_id
GROUP BY S.id, S.name
HAVING COUNT(*) = 1

【讨论】:

    【解决方案2】:

    如下:

    SELECT s.id, s.name
    FROM students s
    LEFT JOIN registration r ON s.id = r.stu_id
    GROUP BY s.id, s.name
    HAVING COUNT(r.course_id) = 1
    

    【讨论】:

    • 不会left join 也包括没有参加任何课程的学生吗?
    • 不,如果是left join,您还会为未参加任何课程的学生获得一排,结果也将包括他们,因为HAVING COUNT(*) = 1
    • @snyder 是的,你是对的,在使用left join 时必须将COUNT(*) 更改为COUNT(r.course_id)。
    • 但是当内部联接已经返回请求的结果集时,为什么还要使用外部联接呢?只是为了降低效率? :-)
    【解决方案3】:
    select s.*
    from (
        select r.stu_id stu_id
        from Registration r
        group by r.stu_id
        having count(*) == 1) ra
    join Students s on s.id = ra.stu_id;
    

    这个效率更高。

    您的架构不太可能包含空字段。因此,无论您使用哪种联接,内联接还是左联接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 2023-03-31
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多