数据库理论 02 SQL——基于《数据库系统概念》第七版

本文介绍了SQL数据定义语言(DDL)的基本概念,包括关系模式、属性取值范围、完整性约束等,并详细阐述了SQL查询的基本结构及各种子句的使用方法。

SQL数据定义

SQL数据定义语言(DDL)可以定义每个关系的信息

  1. 关系模式
  2. 属性取值范围、属性域
  3. 完整性约束(主外码)
  4. 关系的安全性和权限信息
  5. 其他信息
    1. 关系维护的索引集合
    2. 关系在磁盘上的物理存储结构

基本类型

声明意义
char(n)固定长度的字符串,用户指定长度n
varchar(n)可变长度字符串,用户指定最大长度n
int整数类型 (4字节)
smallint小整数类型 (2字节)
numeric(p,d)定点数,精度由用户指定。这个数有p位数字,其中,d位数字在小数点右边
real, double precision浮点数与双精度浮点数,精度与机器相关
float(n)精度至少为n位的浮点数

定义
create table命令定义SQL关系

create table r(
	A1,D1,
	...,
	An,Dn,
	<完整性约束1>,
	<完整性约束2>;

r是关系名,AiA_iAi是关系rrr模式中一个属性名,DiD_iDi是属性AiA_iAi的域(取值类型、范围)

create table instructor (
		ID char(5) ,
		name varchar(20) ,
		dept_name varchar(20) ,
		salary numeric(8,2),
		primary key (ID))

完整性约束

  1. not null
  2. primary key(A1,...,An)(A_1,...,A_n)(A1,...,An)
  3. foreign key(Am,...,An)(A_m,...,A_n)(Am,...,An)
create table instructor (
		ID char(5),
		name varchar(20) not null,
		dept_name varchar(20),
		salary numeric(8, 2),
		primary key (ID),
		foreign key (dept_name) references department )

PS:primary key声明属性自动为not null

更多的例子

create table student (
		ID varchar(5),
		name varchar(20) not null,
		dept_name varchar(20),
		tot_cred numeric(3,0),
		primary key (ID),
		foreign key (dept_name) references department);

SQL进制破坏完整性约束的数据库更新,如

  1. 新插入元组主码attribute为null,或取值与零一关系中的另一 tuple主码属性相同
  2. 新插入的student的tuple所在dept_name未出现在department关系中,破坏外码约束
create table course (
	course_id varchar(8) primary key,
	title varchar(50),
	dept_name varchar(20),
	credits numeric(2,0),
	foreign key (dept_name) references department);

主键定义可以和属性声明相结合

修改、删除表
drop table student
删除表和其中内容
delete from student
删除表里的内容,但是保留表(关系模式)
alter table 增加、删除属性
alter table r add A D
• 其中 A 是要被添加到关系 r 的属性的名称,并且 D 是 A 的域
• 关系中所有元组使用 null 作为新的属性值
alter table r drop A
• 其中,A 是关系 r 的属性的名称
许多数据库都不支持删除属性,但支持drop整个表

查询基本结构

select A_1, A_2, ..., A_n from r_1, r_2, ..., r_m
where P_1 and (or, not) P_n;

AiA_iAi表示属性,rir_iri关系实例,PiP_iPi谓词-限定条件
一个sql语句结果是一个关系
末尾需要有分号

select子句

选择列出需要的属性,对应投影操作Π\PiΠ

select name from instructor;

sql语句不区分大小写

name == Name == NAME

SQL查询结果和关系中默认允许重复
消除重复使用distinct

找出所有老师所在系名、无重复名字

select distinct dept_name from instructor;

all则指定不消除重复

select all dept_name from instructor

所有属性*

select * from instructor

可包含算术表达式,可以有+,-,*,/运算符对常量和属性的操作

select ID, name, salary/12 from instructor;

select还可以包含其他特殊数据类型如日期,算术函数

where 和 from

Ø where子句表示结果必须满足的限定条件
Ø 对应关系代数的选择操作(元组的选择)

select name from instructor where dept_name = 'comp.Sci.' and salary > 80000

可以用比较运算符>,<,>=,<=,=,<>比较字符串,算术表达式和日期

Ø from分句列出了查询中用到的关系
Ø 对应关系代数中笛卡尔积操作

select * from instructor, teaches;

生成每一个可能的instructor-teaches对
存在相同属性需要在子句做区分,如instructor.ID

连接

select name, course_id from instructor, teaches
where instructor.ID = teaches.ID; (限制条件)

一个SQL查询的含义可以理解如下:

  1. 为from子句中列出的关系产生笛卡尔积
  2. 在步骤1的结果上应用where子句中指定的谓词
  3. 对于步骤2结果中的每个元组,输出select子句中指定的属性(或表达式的结果

注意:这个不是SQL查询语句执行顺序,实际上是查询优化过的

省略where 则谓词P为ture
与关系代数表达式不同,sql查询结果可出现重复元组

自然连接

自然连接会匹配两个关系中所有共同属性的相同值的元组, 去掉重复属性列
Ø 自然连接结果=共同属性+第一个关系属性+第二个关系属性
在这里插入图片描述

注意:小心两两无关的属性重名
在这里插入图片描述
当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USING 语法来简化 ON 语法,格式为:USING(column_name)。

附加的基本运算

更名操作

oldName as newName

距离

select id,name,salary/12 as monthly_salary from instructor
select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Comp. Sci.'

此处as可以省去(ORacle必须省)

上文的T,S称为

  1. 相关名词
  2. 表别名
  3. 相关变量
  4. 元组变量

字符串运算

  1. 百分号%匹配任意字符串
  2. 下划线_匹配任意一个字符
  3. sql用单引号,关系代数字符串用双引号
  4. 匹配模式大小写敏感,但有些数据库不区分大小写

例子

  1. ‘intro%’ 以intro为开头的字符串
  2. ‘%a%’ 任意包含a子串的字符串
  3. ‘—’只有三个字符的字符串
  4. ‘—%’ 至少三个
select name from instructor where name like '%dar%'

特殊字符需要转意,准确搜寻%在字符串中要写%

sql额外字符串操作
串联 — ||
大小写 lower(), upper()
长度length()
字串substr

次序
order by

select distinct name from instructor order by name desc;

desc降序,asc升序,默认升序
可以每个属性都设置asc和desc

between

select name from insturctor where salary between 9000 and 10000

也可以用元组运算
where (instructor.ID, dept_name) = (teaches.ID, biology)

集合运算

union 并
intersect 交
except, 减
上面三个操作自动消除冗余

要保留冗余要使用
union all
intersect all
excpet all
在这里插入图片描述

空值

null表示
未知值或不存在

任何涉及null算术表达式为null
5+null返回null

用null谓词检测空(is null, is not null)

select name from instructor where salary is null

涉及null的比较运算返回unknown
null<null返回unknown

三值逻辑
在这里插入图片描述

空值相同 比较 “=”
如果元组在所有属性上取值相等,那么它们就被当作是相同元组,即使某些值为空
例如:{(‘A’, null), (‘A’, null)}
在去除重复元组时,只包留上述元组的一个拷贝

But,(‘A’, null) = (‘A’, null) 逻辑判断结果为unknown
NOTES:distinct子句和谓词中对待空值方式不同

聚集函数

以值的一个集合(集或多重集)为输入、返回单个值的函数

  1. ave
  2. min
  3. max
  4. sum
  5. count

找出course 关系中的元组数

select count(*) from course;

分组聚集 group by

select dept_name, ave(salary) from instructor group by dept_name;

在这里插入图片描述
规定
出现在select语句但没有被聚集的属性只能是出现在group by子句的属性

也就是说,select子句中出现、但没有在group by子句中的属性,只能出现在聚集函数的内部

比如select C from A group by B
B和A中都没有C该语句无意义

having

having: 分组限定条件
在分组的情况下再限定

where: 元组限定条件

找出所有教师平均工资超过42000美元的系的名字与平均工资

select dept_name, avg(salary) from instructor group by dept_name having avg(salary) > 42000

having在行成分组后才起作用,可使用聚集函数。任何出现在having子句中但没聚集的属性,要出现在group by子句中

空值和聚集

select sum(salary) from instructor

在进行sum运算的时候忽略null值

处理空值规则如下

  1. 除了 count(*)外,所有聚集函数都忽略空值
  2. 如果只有空值(空集
    count函数返回0
    其他函数返回null

聚集函数一般在select、having子句中使用

where、having、聚集运算顺序

  1. 根据from计算关系
  2. 应用where的谓词
  3. 满足where谓词的元组通过group by子句形成分组
  4. having存在则作用于每个分组,不满足having则抛弃
  5. 剩余分组被select子句应用聚集函数产生结果

嵌套子查询

子查询是嵌套在另一个查询中select-from-where表达式
对于成员资格、集合比较、集合基数比较

select distinct course_id from section
where semester = 'fall' and year = 2009 and course_id in 
(select course_id from section where semester = 'spring' and year = 2010);

2009秋季与2010春季同时开课的所有id

2009秋季开设但不在2010春季开课的所有id
上式in改为not in

找出选修ID位10101教师讲授课程段的学生的总数

select count(distinct ID)
from takes
where (course_id, sec_id, semester, year) in 
(select course_id, sec_id, semester,year from teaches where teaches.ID = 10101)

空关系测试

测试子查询结果是否为空集(是否存在元组
使用exists
子查询非空返回ture

“找出在
2009年秋季学期和2010年春季学期同时开课的所有课程”

select course_id from section as S
where semester = 'Fall' and year = 2009
and exists
(
	select *
	from section as T
	where semester = 'Spring' and year = 2010
	and S.course_id = T.course_id
);

相关子查询:使用了来自外层查询中出现的表的列的子查询

相关名称作用域:在一个子查询中,可以使用此子查询本身定义的、或者包括此子查询的任何查询中定义的相关名称;类似于编程语言中的变量作用域

Not Exist

使用not exists (B except A)表示关系A中原足迹和包含关系B的元组集合
B−A=∅  ⟺  B⊆AB-A = \empty \iff B\sube ABA=BA

找出选修了Biology系开设的所有课程的学生

select distinct S.ID, S.name
from student as S
where not exists
(
	(
		select course_id
		from course
		where dept_name = 'Biology'
	)
	except
	(
		select T.course_id
		from takes as T
		where S.ID = T.ID
	)
)

集合比较

所有比biology某一个教师工资高的老师姓名
在这里插入图片描述

在这里插入图片描述
改成每个的话,要把some改成all

在这里插入图片描述

From

除了where,SQL允许再from子句中使用子查询表达式

找出系平均工资超过42000系的老师的平均工资

select dept_name, avg_salary
from 
(
	select dept_name, avg(salary) as avg_salary
	from instructor
	group by dept_name
)where ave_salary > 42000;
# 这里 使用了where不需要再次使用having

select dept_name, ave salary
from 
(
	select dept_name, avg(salary) 
	from instructor
	group by dept_name
)
as dept_avg(dept_name, avg_salary)
where avg_salary > 42000;

lateral关键字

使得from子句中的子查询使用来自其他关系的
相关变

select name, salary, avg_salary
from instructor as I1, lateral 
(
	select avg(salary) as avg_salary
	from instructor as I2
	where I2.dept_name = I1.dept_name
);

标量子查询

标量子查询:该子查询返回包含单个属性的单个元组(count、max)

select dept_name , #后面这一部分也是输出的部分
(
	select count(*) #这个系的老师数量
	from instructor
	where department.dept_name = instructor.dept_name
	as num_of_instructors
)
from department

➢标量子查询可以出现在select、where、having子句中
➢ 如果子查询被执行后其结果中有不止一个元组,则产生一个运行错

不带from子句标量

➢ 某些查询语句需要计算,无需引用任何关系
➢ 例如:查询平均每位教师所讲授(无论是学年还是学期)的课程段数,其中由多位教师所讲授的课程段对
每位教师计数一次

(select count(*) from teches) / (select count(*) from instrucot)

可以除法前×1.0减少精度损失
或者使用cast类型转换

数据库修改

delete from instructor

删除所有

delete from instructor
where dept_name =
‘Finance’;

删除一个系

删除再waston大楼系工作的老师

delete from instructor
where dept_name in
(
select dept_name
from departmen
where building - 'waston'
);
delete from instructor
where salary < 
(
	select avg (salary)
	from instructor
);

插入

insert into course
values (’CS-437,Database Systems’,’Comp. Sci.,4);

#等价
insert into course (course_id, title, dept_name, credits)
values (’CS-437,Database Systems’, ’Comp. Sci., 4);

# keyi

将所有的教师元组插入student 关系中,同时使tot_creds置为0

insert into student
select ID, name, dept_name, 0
from instructor

在执行插入之前先执行完 select from where 语句非常重要,
否则会出现错误

更新

update instrucotr
set salary = salary * 1.03
where salary > 100000;

update instructor
set salary = salary * 1.05
where salary <= 100000;

精度问题会影响顺序不能替换。否则工资略少于100000美元的老师会涨8.15%

case语句更新

update instructor
	set salary = case
		when salary <= 100000 then salary * 1.05
		else salary * 1.03
	end

格式如下

case
	when pred1 then result1
	when pred2 then result2
	…
	when predn then resultn
	else result0
end

标量子查询的更新

为学生计算更新tot_creds

update student S
set tot_cred = 
(
	select sum(credits)
	from takes natural join course
	where S.ID = takes.ID
	and takes.grade <> 'F'
	and takes.grade is not null
);
# 如果一个学生没有成功学完任何课程,则将 tot_creds 置空

# 若需要空值改成零
update student S
set tot_cred = 
(
	select case
	when sum(credits) is not null 
		then sum(credits)
	else 0
	end
	from takes natural join course
	where S.ID = takes.ID
	and takes.grade <> 'F'
	and takes.grade is not null
); 
目 录 译者序 第7版序言 第一部分 基础知识 第1章 数据库管理概述 1 1.1 引言 1 1.2 什么是数据库系统 3 1.3 什么是数据库 6 1.4 为什么用数据库 10 1.5 数据独立性 12 1.6 关系系统及其他 15 1.7 小结 17 练习 17 参考文献和简介 19 部分练习答案 19 第2章 数据库系统体系结构 22 2.1 引言 22 2.2 三级体系结构 22 2.3 外模式 24 2.4 概念模式 26 2.5 内模式 26 2.6 映象 27 2.7 数据库管理员 27 2.8 数据库管理系统 28 2.9 数据通信管理器 31 2.10 客户/服务器体系结构 31 2.11 工具 33 2.12 分布式处理 33 2.13 小结 35 练习 35 参考文献和简介 36 第3章 关系数据库介绍 38 3.1 引言 38 3.2 关系模型概述 38 3.3 关系和关系变量 41 3.4 关系的含义 42 3.5 优化 44 3.6 数据字典 45 3.7 基本关系变量和视图 46 3.8 事务 49 3.9 供应商和零件数据库 49 3.10 小结 51 练习 52 参考文献和简介 53 部分练习答案 54 第4章 SQL概述 55 4.1 引言 55 4.2 综述 56 4.3 目录 58 4.4 视图 59 4.5 事务 59 4.6 嵌入式SQL 59 4.7 SQL是不完美的 66 4.8 小结 66 练习 67 参考文献和简介 68 部分练习答案 73 第二部分 关系数据模型 第5章 域、关系和基本关系变量 77 5.1 引言 77 5.2 域 79 5.3 关系值 86 5.4 关系变量 90 5.5 SQL的支持 93 5.6 小结 96 练习 97 参考文献和简介 98 部分练习答案 101 第6章 关系代数 106 6.1 引言 106 6.2 关系封闭性 107 6.3 语法 109 6.4 语义 110 6.5 举例 117 6.6 关系代数的作用 119 6.7 附加的操作符 120 6.8 分组与分组还原 125 6.9 关系比较 127 6.10 小结 128 练习 129 参考文献和简介 131 部分练习答案 133 第7章 关系演算 140 7.1 引言 140 7.2 元组演算 141 7.3 举例 147 7.4 关系演算与关系代数的比较 149 7.5 计算能力 152 7.6 域演算 153 7.7 SQL语言 155 7.8 小结 162 练习 163 参考文献和简介 165 部分练习答案 167 第8章 完整性 179 8.1 引言 179 8.2 类型约束 180 8.3 属性约束 181 8.4 关系变量约束 182 8.5 数据库约束 182 8.6 黄金法则 183 8.7 静态约束和动态约束 184 8.8 码 185 8.9 SQL对完整性的支持 191 8.10 小结 194 练习 194 参考文献和简介 196 部分练习答案 201 第9章 视图 209 9.1 引言 209 9.2 视图的用途 211 9.3 视图检索 213 9.4 视图更新 214 9.5 快照 225 9.6 SQL对视图的支持 226 9.7 小结 227 练习 228 参考文献和简介 229 部分练习答案 232 第三部分 数据库设计 第10章 函数依赖 238 10.1 引言 238 10.2 基本概念 239 10.3 平凡的函数依赖和非平凡的函数 依赖 241 10.4 依赖集的闭包 241 10.5 属性集的闭包 242 10.6 最小函数依赖集 244 10.7 小结 245 练习 246 参考文献和简介 247 部分练习答案 249 第11章 进一步规范化Ⅰ:1NF、2NF、 3NF和BCNF 252 11.1 引言 252 11.2 无损分解和函数依赖 254 11.3 第一、第二和第三范式 257 11.4 保持函数依赖 262 11.5 BOYCE/CODD范式 264 11.6 具有关系值属性的关系变量 268 11.7 小结 270 练习 270 参考文献和简介 272 部分练习答案 274 第12章 进一步规范化Ⅱ:高级范式 282 12.1 引言 282 12.2 多值依赖与第四范式 282 12.3 连接依赖与第五范式 285 12.4 规范化过程小结 289 12.5 逆规范化 291 12.6 正交设计 292 12.7 其他的规范化形式 295 12.8 小结 296 练习 296 参考文献和简介 297 部分练习答案 302 第13章 语义建模 306 13.1 引言 306 13.2 总体方法 307 13.3 E/R模型 309 13.4 E/R图 312 13.5 基于E/R模型的数据库设计 313 13.6 简单分析 317 13.7 小结 319 练习 320 参考文献和简介 321 第四部分 事务管理 第14章 恢复 333 14.1 引言 333 14.2 事务 334 14.3 事务恢复 335 14.4 系统恢复 337 14.5 介质恢复 338 14.6 两阶段提交 338 14.7 SQL对事务的支持 339 14.8 小结 340 练习 341 参考文献和简介 341 部分练习答案 345 第15章 并发 347 15.1 引言 347 15.2 三个并发问题 347 15.3 锁 349 15.4 重提三个并发问题 350 15.5 死锁 352 15.6 可串行性 353 15.7 隔离级别 354 15.8 意向锁 355 15.9 SQL的支持 357 15.10 小结 358 练习 359 参考文献和简介 360 部分练习答案 365 第五部分 高级专题 第16章 安全性 369 16.1 引言 369 16.2 自主存取控制 371 16.3 强制存取控制 375 16.4 统计数据库 377 16.5 数据加密 381 16.6 SQL的支持 384 16.7 小结 386 练习 387 参考文献和简介 388 部分练习答案 390 第17章 优化 394 17.1 引言 394 17.2 一个启发性的例子 395 17.3 查询处理概述 396 17.4 表达式变换 399 17.5 数据库统计信息 403 17.6 分而治之的策略 404 17.7 关系操作的实现算法 406 17.8 小结 410 练习 411 参考文献和简介 413 部分练习答案 430 第18章 信息空缺 432 18.1 引言 432 18.2 3VL方法概述 433 18.3 上述方案所造成的某些结果 437 18.4 空值和码 440 18.5 外连接 442 18.6 特殊值 444 18.7 SQL的支持 444 18.8 小结 447 练习 448 参考文献和简介 449 部分练习答案 452 第19章 类型继承 454 19.1 引言 454 19.2 类型的层次结构 457 19.3 多态性和可置换性 459 19.4 变量与赋值 462 19.5 约束特化 465 19.6 比较 467 19.7 操作、版本和签名 470 19.8 一个圆是一个椭圆吗 473 19.9 约束特化—再次讨论 476 19.10 小结 478 练习 479 参考文献和简介 480 部分练习答案 481 第20章 分布式数据库 484 20.1 引言 484 20.2 一些预备知识 484 20.3 十二个目标 487 20.4 分布式系统面对的问题 493 20.5 客户/服务器系统 502 20.6 DBMS独立性 504 20.7 SQL的支持 508 20.8 小结 509 练习 509 参考文献和简介 510 第21章 决策支持 518 21.1 引言 518 21.2 决策支持的特征 519 21.3 决策支持的数据库设计 520 21.4 数据准备 525 21.5 数据仓库和数据集市 527 21.6 联机分析处理 530 21.7 数据挖掘 535 21.8 小结 536 练习 537 参考文献和简介 538 部分练习答案 540 第22章 时态数据库 541 22.1 引言 541 22.2 时态数据 542 22.3 问题是什么 544 22.4 时间间隔 548 22.5 间隔类型 549 22.6 间隔上的标量操作符 551 22.7 间隔上的聚集操作符 551 22.8 与间隔有关的关系操作符 552 22.9 间隔上的约束 557 22.10 间隔上的更新操作符 559 22.11 关于数据库设计 560 22.12 小结 562 练习 563 参考文献和简介 563 部分练习答案 565 第23章 基于逻辑的数据库 567 23.1 引言 567 23.2 综述 567 23.3 命题演算 569 23.4 谓词演算 572 23.5 数据库的证明理论观点 577 23.6 演绎数据库系统 580 23.7 递归查询过程 583 23.8 小结 588 练习 589 参考文献和简介 590 部分练习答案 596 第六部分 对象和对象/关系数据库 第24章 对象数据库 599 24.1 引言 599 24.2 对象、类、方法和消息 602 24.3 进一步的分析 605 24.4 一个详实的例子 611 24.5 混合性问题 618 24.6 小结 624 练习 626 参考文献和简介 627 部分练习答案 634 第25章 对象/关系数据库 637 25.1 引言 637 25.2 第一个根本性错误 639 25.3 第二个根本性错误 644 25.4 实现上的问题 645 25.5 真正融合的好处 647 25.6 小结 648 参考文献和简介 649 附 录 附录A SQL表达式 657 附录B SQL3概览 666 附录C 缩略语和符号 678
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值