【问题标题】:what should be the relation ship between both the tables so each student can have separate marksid两个表之间的关系应该是什么,这样每个学生都可以有单独的 markid
【发布时间】:2012-05-20 18:22:51
【问题描述】:

我是 sql 新手 我有两张桌子,第一张有分数,第二张有学生。 标记的主键是 markid,学生的主键是学生 ID。 我想知道两个表之间的关系应该是什么,这样每个学生都可以有单独的标记。 以及获取数据的 sql 查询是什么。

我已经尝试过与此选择查询的一对一关系 s="select s.Student Name,z.Hourly1Marks from Student s,marks z" 但它显示的是条目的笛卡尔积。

【问题讨论】:

    标签: sql


    【解决方案1】:

    研究INNER JOIN(如果每个学生有一个分数,即1:1关系)和LEFT JOIN(如果每个学生可以有多个分数,即1:n关系)的概念。

    您使用了没有限制的内连接。你需要的是类似

    SELECT S.name, Z.marks
    FROM students S
      JOIN marks Z ON S.student_id = Z.student_id
    

    或等效

    SELECT S.name, Z.marks
    FROM students S, marks Z
    WHERE S.student_id = Z.student_id
    

    对于 1:1 的关系案例,或

    SELECT S.name, Z.marks
    FROM students S
      LEFT JOIN marks Z ON S.student_id = Z.student_id
    

    对于 1:N 关系案例。

    【讨论】:

    • 内部联接也涵盖 1:N 关系。左(外)连接唯一有用的时候是当您的连接列上有空值或不匹配值时,我不确定这是否适用于他的问题。您也没有在回答中明确区分。
    • @TimPote:当说 1:N 时,通常认为是 N >= 0,因为这种关系的数量远远超过 N > 0 的关系,这使得内部连接的情况适用于规则的 1:N 关系例外。如果一个学生可能有多个分数,那么他很可能没有任何分数 - 并且内部连接失败。
    【解决方案2】:

    假设你有两张桌子:

    Students
    --------------
    IDStudent
    Name
    ....
    
    Marks
    --------------
    IDMarks
    Hourly1Marks
    

    Studend 和 Marks 之间的关系是“一个学生可能有 0 个或多个 Marks”,那么您需要在 Marks 表中添加一列 - 称之为 studentID,此列用作学生表的外键.

    那么你可以编写这个查询

    select s.Name, z.Hourly1Marks 
    from Student s left join marks z 
        on z.studentID = s.IDStudent
    

    这将使您返回所有学生及其分数(也包括没有任何分数的学生) 或者,如果你只想要至少一个分数的学生

    select s.Name, z.Hourly1Marks 
    from Student s inner join marks z 
        on z.studentID = s.IDStudent
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2013-04-09
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      相关资源
      最近更新 更多