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

  • 过滤行,仅保留满足条件的记录。
  • 支持 ANDORNOT 等逻辑运算符。

ORDER BY

  • 对结果排序,默认升序(ASC),可指定降序(DESC)。
  • 支持多列排序。

LIMIT

  • 限制返回的行数。
  • 通常与 ORDER BY 联用以保证结果确定性。

3. 聚合与分组

聚合函数

  • SUMAVGMAXMINCOUNT
  • **要么一起使用,不然不会和普通的列进行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 NULLIS NOT NULL 判断 NULL。
  • 在布尔运算中,NULL 可能导致结果为 NULL,被视为 FALSE。

六、查询执行顺序(逻辑理解)

  1. FROM:指定数据源
  2. WHERE:过滤行
  3. GROUP BY:分组
  4. HAVING:过滤组
  5. SELECT:选择输出列
  6. ORDER BY:排序
  7. LIMIT:限制行数

七、总结

  • SQL 是声明式、功能丰富的查询语言。
  • 关系模型强调结构扁平、物理独立。
  • 现代 SQL 支持聚合、分组、排序、限制等高级功能。
  • 查询可以多种方式编写,数据库系统负责优化执行。