数据定义语言
基本类型:
char(n):固定长度的字符串 若属性A类型为char(10),并存入“Avi”,在此字符串后会追加7个空格 ,当比较2个不同长度的char类型的字符串时会在短值后面加空格
varchar(n):可变长度的字符串,n为指定最大长度,推荐使用
int:整数类型
smallint:小整数类型
numeric(p,d):定点数,这个数有p位数字,小数点后有d位 numeric(3,1)可以 精确存储33.3
real,double precision:浮点数与双精度浮点数,精度与机器相关
float(n):精度至少为n位浮点数
完整性约束:
主码约束primary key(A1,A2,A3...):表示属性A1,A2,A3...构成关系的主码,必须非空且唯一
外码约束foreign key(A1,A2,A3...) references s:表明关系中任意元组在属性A1,A2,A3...必须对应于关系s中某元组在主码属性上的取值,防止该属性取到不存在的值
举例:
非空约束not null:表明在该约束上不允许空值
sql禁止破坏完整性约束的任何更新
delete from student;
删除student关系中的所有元组,仅仅删除元组
drop table student;
从数据库中删除关于被去掉关系的所有信息,不仅删除student中的所有元组,还删除关系
alter table r add A D为已有关系增加属性,关系中所有元组在新属性上的取值被设为null
alter table r drop A从关系中去掉属性
sql查询的基本结构
select distinct dept_name from instructor
distinct删除重复元组,select语句默认保留重复元组,等同于all
自然连接natural join:只考虑在2个关系模式上都出现的属性上取值相等,则匹配,
输出结果2个关系模式上都出现的属性上只出现一次
当2个关系模式上,都出现的属性有多个的时候可能会产生危险
为避免不必要相等属性带来的危险,sql提供了另一种自然连接的方式join...using
join...using当2个关系模式上,都出现的属性有多个的时候,可以指定那些属性匹配
as子句 更名运算 既可出现在select子句中,也可出现在from语句中
mysql默认在比较字符串时不区分大小写
字符串上可以使用like操作符来实现模糊匹配,模式是大小写敏感的
%:匹配任意字符
_:匹配任意一个字符
‘%comp%’匹配任何包含'comp'子串的字符串
在like比较运算中使用escape关键词定义转义字符,转义字符表示特殊字符被当成普通字符
使用not like比较运算符搜索不匹配项
'*'可以用在select子句中表示所有属性
order by 定义元组的排列顺序,默认升序,desc降序,asc表示升序
where子句谓词
between/not between比较运算符
sql允许我们用记号(v1,v2,v3...,vn)来表示一个分量值v1,v2,v3..的n维元组,在元组上可以运用比较运算符
集合运算
并运算union 交运算intersect 差运算except
集合运算前提是具有相同的属性,属性个数,以及属性对应位置相同
结果默认去除重复 ,若要保留重复元组,在关键词后 加all
逻辑值分为true,false,unknown 布尔运算and,or,not
如果where子句谓词对一个元组计算出false或unknown,那么该元组不能被加入到结果集中
谓词中对待空值的方式"null=null"会返回unknown,而在元组中当比较2个元组的对应属性时,当2个值都是非空并且值相等或者都是空,那么他们是相同的
聚集函数
是以值的一个集合为输入返回单个值的函数
平均值avg,最小值min,最大值max,总和sum,计数count
使用select cout(*) from course计算元组的个数 cout(*)中不能使用distinct
group by分组聚集,将聚集函数作用到一组元组集上,在group by子句中所有属性上取值相同的元组将被分在一个组中,任何没有出现在group by子句中的属性如果出现在select中,它只能出现在 聚集函数内部
having子句 该条件不针对单个元组,而是针对group by构成的分组,having子句在形成分组后才起作用
任何出现在having子句中,没有被聚集的属性必须出现在group by中
除了count(*)外所有的聚集函数都忽略输入集合中的空值,但规定空集的count运算为0,而其他所有聚集运算输入为空集时返回一个空集
嵌套子查询
in/not in
也可用于枚举集合
也可用于测试任意关系
=some等于in 然而<>some不等于not in
<>all等于not in 然而=all不等于in
exists可测试一个子查询中是否存在元组
重复性元组存在性测试 unique/not unique
from子查询
子查询的结果属性可以在外层查询中使用
一般from子句中的子查询中不能使用来自from子句其他关系的相关变量,如果子查询用lateral作为前缀则可以访问
with子句
提供定义临时关系的方法,只对包含with子句的查询有效
查出所有工资总额大于所有系平均工资总额的系
标量子查询
该子查询只返回包含单个属性的单个元组
数据库的修改
delete删除,只能删除整个元组,不能只删除某些属性上的值
delete from r where p;首先从r中找出所有使p为真的元组,然后把他们从r中删除,如果省略where,则r中所有元组将被删除
delete首先测试instructor关系中的每一个元组,然后删除所有符合条件的元组
insert 插入
插入单个元组
在查询结果的基础上插入元组集
在执行插入之前先执行select语句
若待插入元组中只给出了模式中部分属性的值,那么其余属性被赋为空值
update更新
首先检查关系中的所有元组,看他们是否应该被更新,然后才执行更新,省略where将对所有的元组进行更新
case结构,可避免更新次序引发的问题
等同于
case结构
运用标量子查询执行更新操作