SQL: structed Query Language
一、关系模型基础
1. 关系术语
- 数据库(Database):一组命名的关系(表)的集合。
- 关系/表(Relation/Table):
- 模式(Schema):描述表的结构(元数据)。
- 实例(Instance):符合模式的数据集合。
- 属性/列/字段(Attribute/Column/Field):表中的列。
- 元组/记录/行(Tuple/Record/Row):表中的一行数据。
- 基数(Cardinality):表中元组的数量。
2. 关系表的特性
- 模式固定:属性名唯一,类型为原子类型 不能嵌套属性。
- 表是无序的:可以是集合或多重集合(允许重复)。
- 表是扁平的:不允许嵌套属性。
- 物理数据独立性:逻辑定义与物理存储方式无关。
3. 第一范式(1NF)
- 所有关系必须是扁平的,不允许嵌套结构。
- 若需表示多值属性,应拆分为多个表。
二、SQL 概述
声明式语言:用户只需要说明想要什么,不需要关心怎么获取
`倾向于以一种操作和查询数据的方式被使用,
SQL 的优点与缺点
- 优点:
- 声明式:只需指定“做什么”,而非“如何做”。
- 广泛实现,功能丰富。
- 可扩展:支持调用其他语言和数据源。
- 缺点:
三、SQL 子语言
1. DDL:数据定义语言 (Data Definition Language)
创建表与主键
1 2 3 4 5 6 7
| CREATE TABLE Sailors ( sid INTEGER PRIMARY KEY, sname CHAR(20), rating INTEGER, age FLOAT, PRIMARY KEY(sid) #唯一的查找键 );
|
- 主键(Primary Key):唯一标识每行,不允许重复。
- 不允许插入新的相同主键tuple
- 如果是复合的主键,有一个元素不同就不同
外键
1 2 3 4 5 6 7 8
| CREATE TABLE Reserves ( sid INTEGER, bid INTEGER, day DATE, PRIMARY KEY (sid, bid, day), FOREIGN KEY (sid) REFERENCES Sailors, FOREIGN KEY (bid) REFERENCES Boats );
|
- 外键(Foreign Key):引用其他表的主键,确保引用完整性。
- 可以看作一个指针,指向上面的sailors的主键
- **确保子表没有引用父表中不存在的部分,`比如上面reserve需要维护的旅行者需要和sailors里面的sid一一对应
四、DML:数据操作语言
1. 基本查询结构
1 2 3 4 5 6 7
| SELECT [DISTINCT] <列表达式> FROM <表> [WHERE <条件>] [GROUP BY <列>] [HAVING <条件>] [ORDER BY <列>] [LIMIT <数量>];
|
2. 常用子句详解
SELECT
- 指定输出的列或表达式。
- 可使用
DISTINCT 去重。
WHERE
- 过滤行,仅保留满足条件的记录。
- 支持
AND、OR、NOT 等逻辑运算符。
ORDER BY
- 对结果排序,默认升序(ASC),可指定降序(DESC)。
- 支持多列排序。
LIMIT
- 限制返回的行数。
- 通常与
ORDER BY 联用以保证结果确定性。
3. 聚合与分组
聚合函数
SUM、AVG、MAX、MIN、COUNT
- **要么一起使用,不然不会和普通的列进行SELECT
- 忽略 NULL 值(除
COUNT(*) 外)。
GROUP BY
- 将数据按指定列分组。
- 输出中只能包含分组列或聚合表达式。
HAVING
**示例
1 2 3 4 5 6
| SELECT dept, AVG(gpa), COUNT(*) FROM Students WHERE gender = 'F' # 按性别分类,筛选出女生组 GROUP BY dept # 按照院系分组 HAVING COUNT(*) >= 2 # 过滤掉学生数量少于2的小组 ORDER BY dept; # 按照dept进行升序
|
- 注意到如果使用了WHERE,那么就会产生多组tuple主键是WHERE,然后就可以进行AVG平均值计算
1 2 3 4 5
| SELECT S.name, S.gpa, S.age*2 AS a2 # AS作用是起个别名 FROM Students S WHERE S.dept = 'CS' ORDER BY S.gpa, S.name ASC, a2 # 这边的ASC是降序的意思 LIMIT 3; # 只输出前面的3行
|
五、NULL 值的处理
- 任何与 NULL 的操作结果均为 NULL。
- 使用
IS NULL 或 IS NOT NULL 判断 NULL。
- 在布尔运算中,NULL 可能导致结果为 NULL,被视为 FALSE。
六、查询执行顺序(逻辑理解)
FROM:指定数据源
WHERE:过滤行
GROUP BY:分组
HAVING:过滤组
SELECT:选择输出列
ORDER BY:排序
LIMIT:限制行数
七、总结
- SQL 是声明式、功能丰富的查询语言。
- 关系模型强调结构扁平、物理独立。
- 现代 SQL 支持聚合、分组、排序、限制等高级功能。
- 查询可以多种方式编写,数据库系统负责优化执行。