关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。
关系模型的数据结构非常简单:一张扁平的二维表。
笛卡尔积(Cartesian product):又称直积,分别用集合A和集合B的一个元素作第一、第二元素构成有序对,所有这样的有序对的集合称为A和B的笛卡尔积,记作A×B。
其符号化表示为:A×B{<x, y> | x∈A∧y∈B}。
易证:若|A| = m,|B| = n,则|AB| = m*n。(|A|表示集合A的模,即 集合A中元素的个数为m个)
例如:
A={a, b}, B={0, 1, 2},则
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
主键:如果在一个关系中,有多个候选码可以选择,则选定其中的一个作为该关系的主键。
它的值用于唯一地标识表中的某一条记录。主关键字是一种唯一关键字。
超码:是一个或多个属性的集合,超码中的这些属性可以让我们在一个实体集中唯一地标识一个实体。
注意:虽然超码可以唯一标识一个实体,但是可能大多数超码中含有多余的属性。所以我们需要候选码。
主码:是被选中用来在一个关系中区分不同元组的候选码。
我来举个例子吧:
学生表(学号,身份证号,姓名,性别)
超码:(学号,性别)→(姓名)。学号和性别能唯一标识姓名一点问题都没有,但是其实标识姓名,只用学号就能标识了,不需要性别。
候选码:(学号)→(姓名),(身份证号)→(姓名)。学号或身份证号都能唯一标识姓名。
主码:(学号)→(姓名)。这是人为选择的,其实身份证号也能做主码。
所谓"连接",就是两张表根据关联字段(就是ON后面的关联条件),组合成一个数据集。
上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。
学生表:
老师表:
/* 内连接 */SELECT * FROM student INNER JOIN teacher ON s_class=t_class/* 我比较喜欢这种 */SELECT * FROM student,teacher WHERE s_class=t_class
/* 左连接 */SELECT * FROM student LEFT JOIN teacher ON s_class=t_class
/* 右连接 */SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class
注意:Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+union+右外连接实现。
/* 全连接(不适用于MYSQL) */SELECT * FROM student FULL JOIN teacher ON s_class=t_class/* 全连接 */SELECT * FROM student LEFT JOIN teacher ON s_class=t_classUNIONSELECT * FROM student RIGHT JOIN teacher ON s_class=t_class
/* 交叉连接 */SELECT * FROM student CROSS JOIN teacher