1 SQL 的哲学
形如 Linux 哲学一切都是文件, 在 SQL 领域也有这样一条至理名言
一切都是关系
2 关系数据库
所谓关系数据库 (Relational database) 是创建在关系模型基础上的数据库, 借助于集合代数等数学概念和方法来处理数据库中的数据.
现实世界中的各种实体以及实体之间的各种联系均用关系模型表示. 现如今虽然对此模型有一些批评意见, 但它还是数据存储的传统标准. 标准数据查询语言 SQL 就是一种基于关系数据库的语言, 这种语言执行对关系数据库中数据的检索和操作.
关系模型由关系数据结构, 关系操作集合, 关系完整性约束三部分组成.
2.1 数据结构
表(关系 Relation)
以列 (值组 Tuple) 和行 (属性 Attribute) 的形式组织起来的数据的集合. 一个数据库包括一个或多个表 (关系 Relation). 例如, 可能有一个有关作者信息的名为 authors 的表(关系 Relation). 每行(属性 Attribute) 都包含特定类型的信息, 如作者的姓氏. 每列 (值组 Tuple) 都包含有关特定作者的所有信息: 姓, 名, 住址等等. 在关系型数据库当中一个表 (关系 Relation) 就是一个关系, 一个关系数据库可以包含多个表(关系 Relation)
行
也称为记录(Record), 代表了关系中的单个实体.
列
也称为字段(Field), 表示实体的某个属性. 表中的每个列都有一个对应的数据类型, 常见的数据类型包括字符类型, 数字类型, 日期时间类型等.
2.2 操作集合
关系模块中常用的操作包括:
增加(Create)
查询(Retrieve)
更新(Update)
删除(Delete)
其中, 使用最多, 也最复杂的操作就是数据查询, 具体来说包括
选择(Selection)
投影(Projection)
并集(Union)
交集(Intersection)
差集(exception)
笛卡儿积(Cartesian product)
...
2.3 完整性约束
完整性约束包括
2.3.1 实体完整性(Entity integrity)
实体完整性(是关系模型中数据库完整性三项规则的其中之一. 实体完整性这项规则要求每个数据表都必须有主键, 而作为主键的所有栏位, 其属性必须是独一及非空值.
在关系数据库中, 唯一标识每一行数据的字段称为主键(Primary Key), 主键字段不能为空. 每个表有且只能有一个主键.
2.3.2 参照完整性
又称引用完整性, 是数据的属性, 用以表明引用的有效. 参照的完整性不允许关系中有不存在的实体引用. 参照完整性与实体完整性二者, 皆是关系模型必须满足的完整性约束条件, 其目的在于保证数据的一致性.
外键的参照完整性.
外键 (Foreign Key) 代表了两个表之间的关联关系
比如员工属于某个部门; 因此员工表中存在部门编号字段, 引用了部门表中的部门编号字段. 对于外键引用, 被引用的数据必须存在, 员工不可能属于一个不存在的部门; 删除某个部门之前, 也需要对部门中的员工进行相应的处理.
2.3.3 用户定义完整性
基于业务需要自定义的约束.
非空约束(NOT NULL)
确保了相应的字段不会出现空值, 例如员工一定要有姓名
唯一约束(UNIQUE)
用于确保字段中的值不会重复, 每个员工的电子邮箱必须唯一
检查约束(CHECK)
可以定义更多的业务规则, 例如, 薪水必须大于 0 , 字符必须大写等
默认值(DEFAULT)
用于向字段中插入默认的数据.
MySQL 中只有 InnoDB 存储引擎支持外键约束; MySQL 8.0.16 增加了对检查约束的支持. 因此我们强大的 MySQL 支持以上所有约束.
从 MySQL 5.5 开始默认使用 InnoDB 存储引擎, 支持事务处理 (ACID), 行级锁定, 故障恢复, 多版本并发控制(MVCC) 以及外键约束等
3 SQL: 面向集合编程
3.1 语法特性
SQL 是一种声明性的编程语言, 语法接近于自然语言(英语). 通过几个简单的英文单词, 例如 SELECT,INSERT,UPDATE,CREATE,DROP 等, 完成大部分的数据库操作.
简单的查询示例
可以看出, SQL 简单直观.
以上查询中的 SELECT,FROM 等称为关键字(也称为子句), 一般大写
表名, 列名等内容一般小写
分号 (;) 表示语句的结束
SQL 语句不区分大小写, 但是遵循一定的规则可以让代码更容易阅读.
SQL 是一种声明式的语言, 声明式语言的主要思想是告诉计算机想要什么结果(what), 但不指定具体怎么做. 这类语言还包括 html, 正则表达式以及函数式编程等.
3.2 面向集合
对于 SQL 语句而言, 它所操作的对象是一个集合(表), 操作的结果也是一个集合(表). 例如以下查询:
- SELECT emp_id, emp_name, salary
- FROM employee;
其中 employee 是一个表, 它是该语句查询的对象; 同时, 查询的结果也是一个表. 所以, 我们可以继续扩展该查询:
- SELECT emp_id, emp_name, salary
- FROM (
- SELECT emp_id, emp_name, salary
- FROM employee
- ) dt;
我们将括号中的查询结果 (取名为 dt) 作为输入值, 传递给了外面的查询; 最终整个语句的结果仍然是一个表.
SQL 中的查询可以完成各种数据操作, 例如过滤转换, 分组汇总, 排序显示等; 但是它们本质上都是针对表的操作, 结果也是表.
不仅仅是查询语句, SQL 中的插入, 更新和删除都以集合为操作对象. 我们再看一个插入数据的示例:
CREATE TABLE t(id INTEGER);
-- 适用于 MySQL,SQL Server 以及 PostgreSQL
- INSERT INTO t(id)
- VALUES (1), (2), (3);
我们首先使用 CREATE TABLE 语句创建了一个表, 然后使用 INSERT INTO 语句插入数据. 在执行插入操作之前, 会在内存中创建一个包含 3 条数据的临时集合(表), 然后将该集合插入目标表中. 由于我们通常一次插入一条数据, 以为是按照数据行进行插入; 实际上, 一条数据也是一个集合, 只不过它只有一个元素而已.
UNION ALL 是 SQL 中的并集运算, 用于将两个集合组成一个更大的集合. 此外, SQL 还支持交集运算 (INTERSECT), 差集运算(EXCEPT) 以及笛卡儿积(Cartesian product)
4 数据库案例
包含 3 个表: 员工表 (employee), 部门表(department) 和职位表(job).
结构图, 也称为实体 - 关系图(Entity-Relational Diagram)
5 总结
关系模型中定义了一个简单的数据结构, 即关系(表), 用于存储数据. SQL 是关系数据库的通用标准语言, 通过声明的方式执行数据定义, 数据操作, 访问控制等.
记住, 对于 SQL, 一切都是关系(表).
参考
《数据库系统概念(原书第 6 版)》
关系数据库
SQL 从入门到精通
实体完整性
参照完整性
来源: https://www.cnblogs.com/JavaEdge/p/12310482.html