数据库系统概念 王珊版 重要章节总结

第五章总结的思路
01:用户自定义完整性的时候, 我们可以在一个属性后面 同时加上 not null 和 unique 和 check语句。
并且 他们之间并没有 符号 而是空格隔开。

02:我们 针对 一个属性 定义完整性约束的时候 , 一般仅仅针对当前的一个属性 来写 check子句, 当然了 写的时候也可以包含 其他属性,但是一般不建议这么做,因为我们可以使用 针对元素 定义的 check子句。

03:当我们使用 check 子句 定义约束的时候,
我们可以使用
in
加减乘除操作符
Between … and
逻辑操作符 and or
比较大小的操作符
Like not like
% 和 _ 通配符

04:当我们 使用 完整性约束命名子句 的时候 如何定义 一个字段 唯一? 如何定义一个字段 非空呢? 书上没有说明,但是写法如下:
CREATE TABLE student(
sno CHAR(9) ,
sname CHAR(20) ,
CONSTRAINT csn UNIQUE(sname , sno) ,
CONSTRAINT css CHECK( sno IS NOT NULL) ,
ssex CHAR(4) ,
sage SMALLINT ,
sdept CHAR(20) ,
ssalary SMALLINT ,
sfee INTEGER ,
CONSTRAINT csno PRIMARY KEY (sno),
CONSTRAINT cssex CHECK(ssex IN (‘男’, ‘女’))
);
//此时 unique 跟 primary key 是一个级别 使用括号 将字段填入其中,就表示 填入其中的字段 是唯一的。
//当我们使用 完整性约束子句(constraint) 的时候 结合使用 check 子句 ,且在子句中 填入 不能为空 的 字段的名字 后面 写上 is not null 子句。

02:unique 和 primary key是一个级别的 我们依然单独的一行的使用 unique(属性,属性)的形式。也可以直接在一个 属性的后面直接写上 unique 的形式。 如果是第一种写法的话 ,就是一个表级别的约束条件 , 第二种是属性级别的约束条件。 但是not null 只可以是 属性级别的约束。
CREATE TABLE student(
sno CHAR(9) ,
sname CHAR(20) ,
CONSTRAINT css CHECK( sno IS NOT NULL) ,
ssex CHAR(4) ,
sage SMALLINT ,
sdept CHAR(20) ,
ssalary SMALLINT ,
sfee INTEGER ,

UNIQUE(sno , sname),

PRIMARY KEY (sno),

CONSTRAINT csno PRIMARY KEY (sno),
CONSTRAINT csn UNIQUE(sname , sno) ,

CONSTRAINT cssex CHECK(ssex IN ('男', '女'))

);

03: mysql不支持 删除 constraint 约束 ,因此下面的写法是错误的。
ALTER TABLE student DROP CONSTRAINT csno
但是oracle支持 这样的写法。

04:当表 跟 表之间存在外键约束关系的时候,要删除其中一张表的时候 , mysql会提示删除不成功的提示, 此时要执意删除的话, 先关掉外键约束,然后删除指定的表,然后在打开外键约束 , 那么操作之后, 存在外键约束的表 不会因为 另一张被删除的表被删除,而外键就不存在了,此时另一张表的外键的值 保持不变 跟之前的一样。 这个是mysql的情况。

05:Select短语中也可以有子查询,这个子查询的执行思路的底层 依然还是按照固定的执行思路:先根据 where中的条件,然后带上这些个条件 去检索 from表中合适的元组组合,然后预备返回组合元组的所有的属性,此时具体返回组合元组的那个属性,视select写法的具体情况而定,也就是说select是针对每个符合条件的组合元组的,返回一条针对一条,返回一条针对一条。
那么此时在select短语中使用子查询的话,依然是接着上边的思路执行的。所以说大多数是 相关查询 ,也有少数情况是不相关查询。比如:
SELECT s.student_id,s.student_name,(SELECT class_name FROM t_class c WHERE c.class_id=s.class_id) FROM t_student s GROUP BY s.student_id; //相关
SELECT sno , sname , (SELECT 1/2)AS val FROM student ; // 不相关
//但是它要求返回的必须是一个值,而不是一个集合,也不是一个元组,因为要符合select的检索的规范:只可以输出一个值 要不后面如何使用as 起一个别名呢!
//select子句的意思就是 选择性的输出的意思;

Where 子句中可以有子查询:
比如使用 in 谓词的时候,后面返回的是 不重复 的 单值的集合。不可以是元组的集合。是不是相关查询 还是不相关查询 视具体情况而定。

使用 > = < <> 符号后面都可以用子查询 ,但是要求返回的是一个具体的值,而不是一个元组,或者多个值 ,仔细体会 。是相关查询 还是不相关查询 视具体情况而定。
//但是它要求返回的必须是一个值,而不是一个集合,也不是一个元组,要满足 比较运算符的规范(只可以跟一个值比 较)。

Exists 十有八九就是 相关查询, 子查询依赖父查询。

having子句也 可以有子查询:
HAVING子句 此时子查询返回的都是 单行单列数据,主要是配合 聚合统计函数的使用。
此时having子句中的 子查询是 相关查询 还是 不相关查询 视具体情况而定,都有可能。
//但是它要求返回的必须是一个值,而不是一个集合,也不是一个元组,要满足 having后面跟的聚合函数 的规范(只 可以跟一个值比较)。

From子句也可以有子查询,这个一定不是 相关性查询的。因为没办法写成相关性查询。

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

15737443266

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值