在计算机领域中有许多伟大的设计理念和思想;在Unix中,一切皆文件;在面向对象的编程语言中,一切皆对象;在关系型数据库中,一切皆关系。
一、SQL编程思想
关系模型
关系模型以集合论中的关系概念为基础;无论是现实世界的实体对象还是它们之间的联系都用关系表示。我们在数据库中看到的关系就是二维表,由行和列组成。所以可以说是关系表是由数据行构成的集合。
关系模型由数据结构、关系操作、完整性约束三部分组成:
- 数据结构:关系模型中的数据结构就是关系表,包括基础表、派生表(查询结果)和虚拟表(视图)。
- 关系操作:增加、删除、修改、和查询,使用的就是SQL语言。其中查询操作最为复杂,包括选择、投影、并集、交集、差集以及笛卡尔积。
- 完整性约束:用于维护数据的完整性或者满足业务约束的需求,包括实体完整性(主键约束)、参照完整性(外键约束)以及用户定义的完整性(非空约束、唯一约束、检查约束和默认值)。
面向集合
SQL是操作关系数据库的标准语言。我们通常只需要说明想要的结果,而将数据处理的过程交给数据库管理系统。SQL是一种面向集合的编程语言,它的操作对象是集合,操作的结果也是集合。(在关系数据库中,关系、表、集合三者通常表示相同的概念)
SELECT
select id,name,age,create_time from student;
select *
from (select id,name,age,create_time from student)t
第一个SQL的作用是从学生表中查询学生信息。from之后是一个表,不仅如此查询结果也是一个表,我们可以将查询的结果作为一个表使用,()内的内容被称为派生表,指定了一个别名叫做t。
select字句用于指定需要查询的字段,可以包括表达式、函数值等。select在关系操作中被称作为投影。选择自己想要的结果重新组成一个集合。
where用于指定数据过滤的条件,在关系运算中被称作为选择。
order by用于对查询的结果进行排序,总之,SQL可以完成各种数据操作,过滤、分组、排序、限定数量等,所有这些操作的对象是关系表,结果也是关系表。
分组GROUP BY
分组操作和其他的关系操作不同,因为它改变了关系的结构。
select max(id),max(name),age,count(*) from student group by age
分组的其他字段,查询时都需要套用函数字段进行取值,否则出现多个值时不知道取哪个值,会出现报错。所以,group by 改变了集合元素的结构,创建了一个全新的关系。
UNION
SQL面向集合特性最明显的体现就是union、intersect、except/minus,这些集合运算符的作用都是将两个集合并成一个集合,必须满足一下条件:
- 两边的集合中字段的数量和顺序必须相同
- 两边的集合中对应字段的类型必须匹配或者兼容
集合操作运算符具体操作:
- union:计算两个集合的并集,排除了结果中的重复数据
- union all:计算两个集合的并集,保留了重复数据
- intersect:返回两个集合中的共同部分,并且排除了结果中的重复数据
- except:返回出现在第一个结果集中,但不出现在第二个结果集中的记录,并且排除了结果中的重复数据
- minus:返回出现在第一个结果集中,但不出现在第二个结果集中的记录,并且排除了结果中的重复数据
- distinct:用于消除重复数据,排除集合中的重复元素
JOIN
在SQL中,不仅实体对象存储在关系表中,对象之间的联系也存储在关系表中。当我们需要获取这些相关的数据时,需要使用到另外一个操作:连接查询。
JOIN:连接查类型包括内连接、外连接、交叉连接等,外连接分为左外连接、右外连接以及全外连接:
- 内连接:返回两个表中满足连接条件的数据
- 左外连接:返回左表中所有的数据,对于右表,返回满足连接条件的数据,如果没有就返回空值
- 右外连接:返回右表中所有的数据,对于左表,返回满足连接条件的数据,如果没有就返回空值
- 全外连接:同时返回左表和右表中的所有数据,对于两个表中不满足条件的数据返回空值
- 交叉连接:笛卡尔积
DML
表示数据操作语言,也就是插入、更新和删除。由于我们经常插入单条记录,并没有意思到实际上是以表为单位进行操作。update和delete语句都是以关系表尾单位的操作,只不过我们习惯说更新一行
数据或者删除几条记录。