关系数据库是建立在关系模型上的,而关系模型本质上是若干个存储数据的二维表,可以把它们看做很多Excel表。和Excel表有所不同的是,关系数据库的表和表之间需要建立“一对多”,“多对一”和“一对一”的关系,这样才能够按照应用程序的逻辑来组织和存储数据。
表的每一行称为记录(Record),记录是一个逻辑意义上的数据;
表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。
主键:关系型数据库中的一条记录中有多个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。确定一条记录的唯一标识
比如:
学生表(学号,姓名,性别,班级),其中每个学生的学号是唯一的,学号就是一个主键
课程表(课程编号,课程名,学分),其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩),成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个主键
主键最好是完全业务无关的字段,我们一般把这个字段命名为id
。常见的可作为id
字段的类型有:
- 自增长数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
- 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似
8f55d96b-8acc-4636-8cb8-76bf8abc2f57
。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
对于大部分应用来说,通常自增类型的主键就能满足需求
外键:用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。
A表中的一个字段,是B表的主键,那他就可以是A表的外键。
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键 。同理 成绩表中的课程号是课程表的外键
外键并不是通过列名实现的,而是通过定义外键约束实现的:删除外键约束并没有删除外键这一列
主键、外键和索引的区别
主键 | 外键 | ||
定义: | 唯一标识一条记录,不能有重复的,不允许为空 | 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 | 该字段没有重复值,但可以有一个空值 |
作用: | 用来保证数据完整性 | 用来和其他表建立联系用的 | 是提高查询排序的速度 |
个数: | 主键只能有一个 | 一个表可以有多个外键 | 一个表可以有多个惟一索引 |
SQL语言定义了三种操作数据库的能力
- DDL: Data Definition Language
DDL允许用户定义数据,即创建表、删除表、修改表结构这些操作。 - DML: Data Manipulation Language
DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。 - DQL: Data Query Language
DQL允许用户查询数据,这也是通常最频繁的数据库日常操作