【问题标题】:mySQL SELECT Left Outer Join involving more than 2 tablesmySQL SELECT Left Outer Join 涉及超过 2 个表
【发布时间】:2015-11-05 01:27:56
【问题描述】:

给定以下表格:

学生((PK)学生ID、名字、姓氏、性别、出生日期)

课程((PK)courseCode、courseName、classLevel、学分)

Registration((PK,FK)studentID, (PK,FK)courseCode, Grade)

我想编写一个查询来获取每个学生的信息(Students.studentIDStudents.firstNameStudents.lastName)、他们的课程信息 (Courses.courseName) 和成绩 (Registration.grade),包括未注册课程的学生在这些学生的课程名称和成绩列中返回空值。

据我所知(我仍在学习很多东西),这将需要以下内容:

Students LEFT OUTER JOIN [some aggregate of Courses and Registration]

但我不确定如何使用 mySQL 语法对其进行格式化。

这里有什么:

SELECT S.studentID, S.firstName, S.lastName, C.courseName, R.grade
    FROM Courses AS C, Students AS S
    LEFT OUTER JOIN Registration AS R ON S.studentID = R.studentID
    AND R.courseCode = C.courseCode
ORDER BY S.studentID
;

我知道这是不对的,我收到一个“未知列 C.courseCode”错误,所以语法显然是错误的,但这已经尽可能接近我认为它需要的样子了。

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    当您使用left join 时,请从包含您要保留的所有行的表开始。在这种情况下,students。然后在所有其他表上使用left join

    另外,从不from 子句中使用逗号。 总是使用明确的join 语法。

    因此,您的查询应如下所示:

    SELECT S.studentID, S.firstName, S.lastName, C.courseName, R.grade
    FROM Students S LEFT OUTER JOIN
         Registration R
         ON S.studentID = R.studentID LEFT OUTER JOIN
         Courses AS C, 
         ON R.courseCode = C.courseCode
    ORDER BY S.studentID;
    

    【讨论】:

    • 感谢您的帮助。我仍在尝试将我在 SQL 方面的工作与我多年的 C 语言背景(这一直让我搞砸)分开。这非常有效。建立别名时何时和何时不使用“AS”有什么区别吗?只是喜欢什么时候缩进等等
    • "可选。大多数程序员在为列名取别名时会指定 AS 关键字,但在为表名取别名时不会。 (见techonthenet.com/mysql/alias.php
    【解决方案2】:

    这是你需要的吗? (我更喜欢LEFT JOIN,因为它比LEFT OUTER JOIN短,但它们是一样的。)

    SELECT S.studentID, S.firstName, S.lastName, C.courseName, R.grade
        FROM Students AS S
        LEFT JOIN Registration AS R ON S.studentID = R.studentID
        LEFT JOIN Courses AS C ON R.courseCode = C.courseCode
    ORDER BY S.studentID
    ;
    

    编辑:像 Gordon 一样,我更喜欢显式连接,正如您从我的回答中看到的那样。但是,据我所知,性能没有差异。

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 2014-10-23
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2012-06-22
      • 2016-12-09
      相关资源
      最近更新 更多