MySQL必知必会 学习笔记 第十五章 联结表

在这里插入图片描述
如上图,语言表中包含语言的很多信息,而电影表中包含语言的id,独立出一个语言表的原因如下:
1.同一种语言的所有信息都是相同的,对每个电影重复此信息既浪费时间又浪费存储空间。
2.如果语言的某信息改变,只需在语言表中改动一次即可。
3.每个电影输入时,很难保证每次输入该语言数据的方式都相同,不一致的数据在报表中很难利用。

关系表的设计就是要保证把信息分解成多个表,一类数据一个表,各表通过某些常用的值(即关系设计中的关系)互相关联。

语言表中每种语言有唯一的标识,此标识称为主键,可以是语言id或任何其他唯一值。语言表中的主键又叫电影表的外键,外键是某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

这样的关系数据库的可伸缩性远比非关系数据库要好,可伸缩性是能够适应不断增加的工作量而不失败,设计良好的数据库或应用程序称之为可伸缩性好。

数据存储在多个表中可用联结查询,联结是一种机制,用来在一条SELECT语句中关联表。联结不是物理实体,它在实际的数据库表中不存在,联结由MySQL根据需要建立,它存在于查询的执行当中。

使用关系表时,在关系列中插入合法的数据非常重要,如果电影表中有非法的语言id,则这些电影没有关联到某个语言。为防止这种情况发生,可指示MySQL只允许在电影表的语言id列中出现合法值,这就是维护引用完整性,它是通过在表的定义中指定主键和外键来实现的。

创建联结,查询出电影名和其语言:

SELECT title, name
FROM film, language
WHERE film.language_id = language.language_id;

以上SQL语句中title是电影表中的电影名,name是language表中的语言名。以上需要使用完全限定的表名,因为只给出language_id时,MySQL不知道指的是哪一个表中的列。

在联结时,引用的列可能出现二义性时,必须使用完全限定列名,如果引用一个没有用表名限制的具有二义性的列名,MySQL将返回错误:
在这里插入图片描述
由没有连接条件的表关系返回的结果为笛卡尔积,检索出的行的数目是第一个表中的行数乘以第二个表中的行数,以下SQL语句会产生笛卡尔积:

SELECT title, name
FROM film, language;

运行结果一部分:
在这里插入图片描述
一共有1000个电影和六个语言,可见输出中每个电影都匹配了六个语言。应该保证所有联结中都有WHERE子句。

类似以上这种笛卡尔积的联结类型有时被称为叉联结。

基于两个表之间的相等测试称为等值联结,也称内部联结。明确指明联结的类型:

SELECT title, name
FROM film INNER JOIN language
ON film.language_id = language.language_id;

以上SQL返回值与之前返回电影名和语言的SQL相同。

ANSI SQL首选INNER JOIN语法。尽管使用WHERE子句定义联结的确比较简单,但明确使用联结语法能确保不会忘记联结条件,有时使用WHERE会影响性能。

一条SELECT语句中可联结的表的数目没有限制。联结会在运行时关联每个指定表,这种处理非常耗费资源,不要联结不必要的表。

猜你喜欢

转载自blog.csdn.net/tus00000/article/details/111095866