dbsc 第三章 SQL
3.1 SQL查询语言概览
- DDL,用来定义关系模式,删除关系以及修改关系模式的命令
- DML,用来从数据库中查询信息,插入,删除,修改元组等
- 完整性,在DDL中定义了完整性越苏的命令。保持在数据库中的数据必须满足DDL中定义的完整性约束
- 视图定义,DDL包括定义视图的命令
- 事务控制,SQL包括定义事务的开始和事务的结束
- 嵌入式SQL和动态SQL,嵌入式和动态SQL定义SQL语句如何嵌入到通用编程语言
- 授权,DDL包括定义对关系(table)和视图访问权限的命令
3.2 SQL数据定义
- DDL可以定义每个关系中的信息:
- 每个关系的模式
- 每个属性的取值类型
- 完整性约束
- 每个关系维护的索引集合
- 每个关系的安全性和权限信息
- 每个关系在磁盘上的物理存储结构
3.2.1 基本类型
- char,固定长度的字符串
- varchar,可变长度的字符串
- int,整数类型(和机器相关的整数有限子集)
- smallint,小整数类型(和机器相关的整数类型的子集)
- numeric(p, d), 定点数,精度由用户指定。表示这个数由p位数字(加上一个符号位),其中d位在小数点右边。比如,numeric(3, 1)可以精确存储44.5,但是不能够精确存储444.5,0.32
- real,double percision,浮点数与双精度浮点数
- float(n),精度至少位n位的浮点数
3.2.2 基本模式定义
create_table
的基本用法create_table
的一个例子- 实体完整性是指,主码不能够为空值
- 参照的完整性是指,外码在“外表”上不能够不存在
- 用户定义的完整性是指,如果用户定义了某些属性not null,或者某些属性域的范围,那么关系中的tuple就必须满足
- alter命令修改table的属性
3.3 SQL查询的基本结构
3.3.1 单关系查询
- select,from,where
3.3.2 多关系查询
- select, from, where的执行顺序是先是from,之后是where,最后是select
- from子句是从多个关系中获取tuple,形参笛卡尔积,得到新的关系
- from子句得到的笛卡尔积过于庞大,可以通过where中的谓词来缩小笛卡尔积的tuple数目
- 最后使用select子句来输出其指定的属性(或者表达式的结果)
3.3.3 自然连接
- 自然连接
natural join
是指,对于两个关系中连接tuple,只考虑在两个关系模式中都出现的属性上取值相同的元组对。 - join using运算是一种自然连接的构造形式
3.4 附加的基本运算
3.4.1 更名运算
as
是更名子句
3.4.2 字符串运算
- 字符串中存在模式匹配,用
like
预算符来实现模式匹配
3.4.3 select子句中的属性说明
3.4.4 排列元组的显示次序
3.4.5 where 子句谓词
3.5 集合运算
3.5.1 并运算(union)
3.5.2 交运算(intersect)
3.5.3 差运算(except)
3.6 空值
- SQL将涉及空值的任何比较运算的结果视为unknown,它不是is null也不是is not null
- 在谓词中对待空值的方式,与select distinct不同。前者将对于
null = null
返回unknown,而不是true;而后者认为{('A', null), ('A', null)}两者是相等的
3.7 聚集函数
3.7.1 基本聚集
- all和distinct不是相反的意思吗?
3.7.2 分组聚集(group by)
3.7.3 having 子句
- from, select,group by,having, where子句执行顺序:
- 先是from
- where,where子句中的谓词将应用到from子句中
- group by,满足where子句谓词的元组通过group by子句形成分组。如果没有group by子句,那么where谓词的整个元组集被当作一个分组
- 如果出现了having,having子句是应用在每个分组之上,不满足having谓词的分组将被丢弃
3.7.4 对空值和布尔值聚集
3.8 嵌套子查询
3.8.1 集合成员资格
in
和not in
连接词- 集合是由select子句产生的一组值构成
3.8.2 集合的比较
not in
是完全不相等,它等价与<>all
,<>some
是指只要不和其中任意一个相等即可<>all
等价于not in,但=all
并不等价于in,=all
表示与子查询集合中的每一个tuple都相等
3.8.3 空关系测试
exist
结构,在作为参数的子查询非空时返回true值。来自外层查询的一个相关名称可以用在where子句的子查询中,使用了来自外层查询相关的子查询被称为相关子查询- 可以使用not exists结构模拟集合包含(即超集)的操作: 我们可以将"关系A包含关系B"写成not exists (B except A)
3.8.4 重复元组存在性测试
unique
结构- 两个tuple中只要某个域为空时,判断t1 = t2为假
3.8.5 from子句中的子查询
3.8.6 with子句
- with子句用于建立临时的关系
- 之后再转换?
3.8.7 标量子查询
- 这里的结果的执行流程是什么?
3.9 数据库的修改
3.9.1 删除
3.9.2 插入
3.9.3 更新
- update中的case结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!