隐式/显式连接有什么区别?

时间:2012-02-23 10:45:11

标签: sql

  

可能重复:
  Explicit vs implicit SQL joins

我知道现在很多人会对我大喊大叫。但是从我的理解

说我有两张桌子

学生

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的重点是什么?

我知道我的理解是错的,但我找不到简单的答案。

请赐教!

2 个答案:

答案 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,外连接),但目前这两个结构是等价的。