我知道现在很多人会对我大喊大叫。但是从我的理解
说我有两张桌子
学生
student_id
firstname
surname
课程
course_id
name
student_id
所以课程表有一个外键STUDENT_ID
,这意味着一个学生可以拥有多个课程吗?
OKAY。
根据我的理解,如果我想选择与一名学生相关的所有课程,我可以做以下任何一项:
SELECT *
FROM courses AS c, students AS s
WHERE c.student_id = s.student_id
AND s.student_id = 1;
OR
SELECT *
FROM courses AS c
JOIN students AS s ON c.student_id = s.student_id AND s.student_id = 1;
那么当JOIN与WHERE完全相同时,JOIN的重点是什么?
我知道我的理解是错的,但我找不到简单的答案。
请赐教!
答案 0 :(得分:7)
FOREIGN_KEY
会让您的生活变得简单。在从关系中检索数据时,它从未意味着帮助您。
e.g。如果您在没有这样的课程时尝试插入course_id = 10
的学生,那么外键约束将不允许您有这样的学生。
JOIN
与使用WHERE
完全相同。看看这个question。
答案 1 :(得分:1)
简而言之:没有区别。
更长的解释:关系模型基于“笛卡尔积”。在查询中
SELECT a.x , b.y
FROM table_a a, table_b b
;
,生成每个可能的行组合table_a和table_b。如果a包含10行,并且b 100行,则会得到1000行。您添加到WHERE子句的所有内容都将这些结果限制为仅满足WHERE子句的行对。所以在
SELECT a.x , b.y, ...
FROM table_a a, table_b b
WHERE a.x = b.y
;
除了“NOT(a.x = b.y)”
的行外,你会得到所有东西实际上,有两种WHERE子句元素:与两个表相关的元素,以及将列表达式与常量进行比较的元素。 JOIN子句是一种指定第一种限制的方法。 有一些细微的差异和复杂性(NULL,外连接),但目前这两个结构是等价的。