我意识到这可能是一个有点愚蠢的问题,但我正在学习SQL,我很难理解加入表的想法。
下面是一个示例查询:
select name, title from instructor natural join teaches, course
where teaches.course_id = course.course_id;连接发生在选择之前,对吗?因此,如果我想要从不同表中存在的属性生成查询,我可以简单地选择我想要的属性,而不必指定它们在不同的表中,因为一旦它们被连接,select命令就可以在连接关系上工作,而不是两个单独的关系?
发布于 2019-03-01 19:58:02
您可以将连接看作是创建一个新的虚拟行,其中两个连接表中的所有列都是并排的。
假设您有桌子:
mysql> create table A (c1 int, c2 int, c3 int);
mysql> create table B (c4 int, c5 int, c6 int);
mysql> insert into A values (1,2,3);
mysql> insert into B values (4,5,6);您可以查询FROM A JOIN B ON ...condition...,现在您的WHERE子句和SELECT子句应用于一组有六列的行。
mysql> select * from a join b;
+------+------+------+------+------+------+
| c1 | c2 | c3 | c4 | c5 | c6 |
+------+------+------+------+------+------+
| 1 | 2 | 3 | 4 | 5 | 6 |
+------+------+------+------+------+------+这样你就可以做这样的事情:
WHERE c1 = 123 AND c4 = 456它测试每个已连接的行,因此您可以引用任一表中的任何列,就好像它们位于同一行一样。实际上,它们在连接结果中位于同一行。
同样,可以在选择列表中引用这些列中的任何一列。
SELECT c2, c6 FROM ...如果两个表中都存在同名的列,该怎么办?这时,您应该用table.column语法限定列名,这样就不会对您所指的列名模棱两可。
PS:您应该养成对所有表使用联接语法的习惯。不要使用旧的逗号样式的联接语法。混合这两种语法样式会给您带来意外的问题,因为优先顺序。在“联接比逗号运算符(,).”一节中,请阅读https://dev.mysql.com/doc/refman/8.0/en/join.html。
https://stackoverflow.com/questions/54951343
复制相似问题