以下查询之间有什么区别?他们给了我相同的结果。
1
SELECT student. * ,
department.department_name,
semester.semester_name
FROM (
student
LEFT JOIN department ON student.student_id = department.department_id
LEFT JOIN semester ON student.student_id = semester.semester_id
)
2
SELECT student. * ,
department.department_name,
semester.semester_name
FROM (
student
LEFT JOIN department ON student.department_id = department.department_id
LEFT JOIN semester ON student.semester_id = semester.semester_id
)
第3
SELECT student. * ,
department.department_name,
semester.semester_name
FROM (
student
LEFT JOIN department ON student.student_id = student.student_id
LEFT JOIN semester ON student.student_id = student.student_id
)
4
SELECT student. * , department.department_name, semester.semester_name
FROM (
student
LEFT JOIN department ON student.department_id = student.student_id
LEFT JOIN semester ON student.semester_id = student.student_id
)
答案 0 :(得分:3)
你无法匹敌:
student.student_id = department.department_id
这没有意义 - 你说学生证和部门号是可以互换的,但事实并非如此。在这种特殊情况下,你可能有“学生1”和“部门1”,所以在你测试的情况下,它可以工作。但它一般不会。
同样,这样做没有任何价值:
student.student_id = student.student_id
在这里,你要说的是你想要的东西与自己相等。由于所有事情都与自己相同,因此不会施加任何限制,因此是多余的。如果这是JOIN
的唯一条款,您将最终加入新表的所有行(笛卡尔积),这绝对不是您想要的。
只有查询(2)似乎是正确的。
答案 1 :(得分:0)
2)(除非你有一个奇怪的架构)是正确的,因为它会给出学生及其课程和学期的清单。
3)将提供针对所有课程和所有学期的学生列表,因为student.student_id = student.student_id
将始终为真。
1和4)将在学生和课程与学期之间进行随机匹配,具体取决于他们之间发生了哪些ID(即学生ID恰好与学期或部门ID相同)。