前言
第十五天,目标过半了,加油
联结
SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。
关系表
关系表的设计就是要保证把信息分解成多个表,一类数据
一个表。各表通过某些常用的值(即关系设计中的关系( relational) )互相关联
外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
外键怎么理解呢?
比如说A表中有一列值跟B表中的主键值相等,那么我们就称A表中的这一列为A表的外键。
为什么要使用联结
简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。
创建联结
联结的创建非常简单,规定要联结的所有表以及它们如何关联即可。
看下面的例子
表student
表teacher
这样我们就基于某种关系(班级相等)把两张表联结在一起了
用法和之前的没有太大的区别,主要是前面两列在表student中,后面一列在表teacher中,from语句也与前面的用法有细微的差别,之前都是取一张表,现在是取两张表。
还有就是这里我们使用的是完全限定的列名
WHERE子句的重要性
利用WHERE子句建立联结关系似乎有点奇怪,但实际上,有一个很充分的理由。请记住,**在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的。**在数据库表的定义中不存在能指示MySQL如何对表进行联结的东西。你必须自己做这件事情。在联结两个表时,你实际上做的是将第一个表中的每一行与第二个表中的每一行配对。 WHERE子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起。
笛卡儿积(cartesian product) 由没有联结条件的表关系返回的结果笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数
看下面的例子
因为没有联结条件,所以会将第一个表中的每一行与第二个表中的每一行进行联结,也就会返回6*3=18条记录
内部联结
目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。
比如
上面的语句可以实现之前的效果。此语句中的SELECT与前面的SELECT语句相同,但FROM子句不同。这里,两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。在使用这种语法时,联结条件用特定ON子句而不是WHERE子句给出。传递给ON的实际条件与传递WHERE的相同。
联结多个表
既然能联结两个表,那么能不能联结三个或者更多个表呢?当然是可以的。
SQL对一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。
今天就到这里了,最近又开始下雨了~