数据库基本语法复习

一、创建表

语法

create table 表名(
列名 数据类型 约束条件
列名 数据类型 约束条件

....
表级约束条件
);

如,定义一个学生表

create table student(
Sno char(9) primary key,
Sname char(20) unique,
Ssex char(2),
Sage smallint,
Sdept char(20)
);

注意 括号里最后一行不加逗号

二、修改基本表

1.添加列

alter table 表名 add [column] 新列名 数据类型 [完整性约束];

2.添加表级约束

alter table 表名 add 表级约束;

3.添加列约束条件

alter table 表名 modify 列名 数据类型 约束条件

4.删除列

alter table 表名 drop 列名 [cascade|restrict];

使用cascade关键字会自动删除引用了该列的其他对象,如视图;如果使用restrict,如果该列被其他对象引用,则拒绝删除该列

默认条件下是restrict

 

5.删除约束 

1.通过modify 来删除not null default check等约束

alter table 表名 modify 列名 数据类型 不加约束条件

原理:原来有约束条件 现在修改它,不加约束条件,覆盖掉原有数据定义

alter table 表名 drop 约束名

注意:删除主键、外键、unique只能用这种方法

6.修改列名、数据类型

alter table 表名 change 列名 新列名 数据类型

change不可修改约束条件

 

alter table 表名 modify 列名 数据类型 约束条件

modify可以修改 数据类型 约束条件

7。完整性约束命名子句

constraint 完整性约束条件名 完整性约束条件

例如
alter table 表名 add constraint 约束名 约束条件;

给外键 以及 unique等约束起名 便于删除这些约束 

三、删除基本表

drop table 表名 [cascade|restrict];

默认是restrict,要删除的表不能被其他表的约束应用,不能有视图,不能有触发器,不能有存储过程或函数

使用cascade 将删除与该表有联系的所有对象

 

四、建立索引

create [unique|cluster] index 索引名 on 表名(列名[次序],...);

unique指唯一索引

cluster 表示要建立的索引是聚簇索引

如SC表按学号升序 课程号降序建立索引表

create unique index SCno on SC(Sno asc,Cno desc);

五、修改索引

alter index 旧索引名 rename to 新索引名

六、删除索引

drop index 索引名

七、数据查询

1.基本语法

select [all|destinct] 目标列表达式
from 表名或视图
where 条件表达式
group by 分组
having 分组条件
order by 排序条件

destinct 是将查询结果去重

2.注意事项

select 后面的目标表达式是指 有关相关列参与的表达式

如查询出全体学生姓名及其出生年份

select name,2020-age
from student;

这个2020-age就是目标列表达式,select会将运算的结果展示出来

还可以起别名

select name,2020-age [as] 出生年份

注意 如果别名中有空格 需要加引号将整个别名包含

3.选取表中的若干元组

使用where条件进行筛选

使用between and 或者 not between and 前者包含边界 后者不包含边界

使用in关键字,如 where Sdept in(‘CS’,'MA','IS'); 也有not in

字符匹配

[not] like '匹配串' [escape '转码字符'];

默认的转码字符有 % _

前者是代表任意长度的字符串 如 a%b 表示以a开头以b结尾的任意长度的字符串

后者则表示任意单个字符,如a_b表示以a开头以b结尾的 长度为3的字符串

若要筛选的字符串中有% 或者 _ 则需要使用转码字符  escape后面定义转码字符 然后在字符串的%或_前面加上这个转码字符

4.order by 子句

默认升序 如需降序可使用desc关键字

对于空值,若升序则含空值的元组最后显示,若降序则含空值的元组最先显示

5.聚集函数

count(*) 统计元组个数 不跳过空值
count([all|dinstinct]列名) 统计对应列的元组个数 去除空值
count(1) 也是统计元组个数  相当于给表添加了一列1 然后计算1的个数
sum([all|dinstinct]列名) 计算一列数值的总和 (该列必须是数值列)
avg([all|dinstinct]列名) 计算一列数值的平均值 (该列必须是数值列)
max([all|dinstinct]列名) 计算最大值
min([all|dinstinct]列名) 计算最小值

 

6.连接查询

连接分为内连接 和 外连接

在内连接中只有满足条件的元组才会输出,有时候 我们需要将不满足条件的元组也输出,这意味着不满足条件的元组的某些列是NULL,这时需要使用外连接才可以。

1.等值连接

sql 92语法 使用where作为连接条件

select 列名表达式
from 表1 别名,表2 别名
where 表1连接属性 = 表2连接属性;

sql99语法

select 列名表达式
from 表1 别名 [inner] join 表2 别名
on 条件;

 注意 当表与自己连接时 要使用不同的别名

2.外连接

sql99语法才有

使用outer join 即可

具体还可分为左外连接和右外连接

左外连接 left join 将左边的表当作主表 右边的表当作从表  null只会出现在从表中

右外连接 right join 将右边的表当作主表 右边的表当作从表  null只会出现在从表中

3.多表连接

sql92语法

select 列名表达式
from 表一 别名,表二 别名, 表三 别名
where 表一连接属性 = 表二连接属性 and 表二连接属性 = 表三连接属性;

sql99语法

select 列名表达式
from 表一 别名 join 表二 别名 on 条件 join 表三 别名 on 条件;

4.嵌套查询

带in谓词的子查询

如查询和刘晨一个系学习的学生信息

select *
from student
where sdept in(
select sdept
from student
where name = '刘晨'
);

本例中 子查询的查询条件不依赖于父查询,称为不相关子查询

如果子查询的查询条件不依赖于父查询,称为相关子查询

相关子查询

找出每个同学超过他自己选修课平均成绩的课程号

select Sno,Cno
from SC x
where grade>=(
select avg(grade)
from SC y
where x.Sno = y.Sno
);

执行步骤如下

  1. 从外层循环中取SC的一个元组x,将x的Sno值传给内层查询
  2. 执行内层查询,得到值,用该值代替内层查询,返回给外层查询
  3. 执行外层查询

带ANY(SOME)或 ALL谓词的子查询

这个就是在where后加一个any谓词,只要子查询的返回结果任意一个符合where中的条件即可输出当前元组

ALL就是所有结果都符合才可以输出当前元组

 

七、数据更新

 

1.插入数据

insert into 表名(属性列,..)
values(要插入的对应列的数据,..);

也可以

insert into values(所有列依次对应的数据)

 

2.插入子查询的结果

insert into 表名(属性列)
子查询;

例如,将每个系学生的平均年龄保存到数据库中

insert into Dept_age(Sdept,Avg-age)
select Sdept,avg(Sage)
from Sdudent
group by Sdept;

 

3.修改数据

语法

update 表名
set 列名 = 表达式,...
where 条件表达式;

 

可以带子查询

4.删除数据

语法

delete
from 表名
where 条件表达式;

 

可以带子查询

注意truncate也可以删除表,但是它也会删除表的结构。

语法

truncate 表名;

 

  1. TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
  2. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
  3. TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
  4. 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
  5. TRUNCATE TABLE 不能用于参与了索引视图的表。
  6. 对用TRUNCATE TABLE删除数据的表上增加数据时,要使用UPDATE STATISTICS来维护索引信息。
  7. 如果有ROLLBACK语句,DELETE操作将被撤销,但TRUNCATE不会撤销。

 

八、空值的处理

 

判断一个值是否为空值 不能使用= 可以使用 is null 或者 <=>(只有在mysql里才有) 来判断

(还有一个<>,这个时不等于的意思)

空值与另一个值的算数运算为空值,空值与另一个值的比较运算为unkonwn

 

九、视图

1.定义视图

create or replace view 视图名 [列名]
as 子查询
[with check option]


在with check option的选项下,可以总结为
1.update,要保证数据update之后能被视图查询出来,也就是要符合where的条件
2.insert,保证insert的数据能被视图查询出来
3.delete,有无 with check option都一样4.      对于没有where字句的视图,使用with check option是多余的

 

例如

create view is_student
as
select sno,sname,sage
from student
where sdept='IS'
with check option;

 

由于加上了with check option ,以后对该视图进行插入 修改 删除的时候,关系数据库管理系统会自动加上sdept = 'IS'的条件

 

2.带表达式的视图

create view BT_S(Sno,Sname,Sbirth)
as
select Sno,Sname,2020-Sage
from student;

3.删除视图

drop view 视图名[cascade];

默认不使用 cascade

4.查询视图

视图定义完后,用户就可以像对基本表一样使用他了

注意事项

含有group by的视图,在进行筛选时,不能使用where 而要使用 having

 

5.更新视图

视图是不实际存储数据的虚表,因此对视图的跟新最终要转换为对基本表的更新。

注意事项

并不是所有的视图都可以更新

若视图是由两个以上基本表导出的,则此视图不允许更新

1,如果更新视图的字段来自字段表达式或者是常数,则不允许对视图进行Insert、update操作(但可以进行delete操作)。因为,假设用字段表达式或者是常数对视图进行了更新,那么视图的相关行或列就与基本表中的相关行或列不一致,或者在基本表中根本找不到,对视图的更新实质上是对基本表的更新,因此和基本表的不一致的视图是毫无意义的。(不允许Insert操作也是同样的道理)
​2,如果更新字段来自库函数,则不允许对视图进行Insert、update操作(但可以进行delete操作)。举个例,如果当前视图只是某个基本表中的一部分,而现在要用sum函数对视图进行更新,那么sum就会将基本表中满足条件的值都相加,而其实视图中只包含满足条件的一部分,这样就会出现错误。
3,更新字段包含group by,distinct等函数,这跟2的解释是一样的。
4,​若视图来自两个及以上的基本表,则不允许更新。这是因为如果要更新这样的视图,那么就会涉及到多个基本表的同时修改,这会导致数据库的存取非常复杂,因此,在现有的关系数据库系统中,只支持来自单个表的视图的更新。
5,在一个不允许更新的视图上定义的视图​不允许更新。

 

九、安全性控制

 

1.授权

grant 权限
on 对象类型 对象名
to 用户
[with grant option];

使用了with grant option 后 用户可以将该权限授权给其他用户

如,把查询student表的权限授予给用户UI

grant select
on table student
to UI;

把查询student表的权限授予给全体用户

grant select
on table student
to public;

把查询student表和修改学生学号的权限授予给UI

grant update(Sno),select
on table student
to UI;

 授予增删改查所有权限

grant all privileges
on table student
to UI;

 2.回收权限

revoke 权限
on 对象类型 对象名
from 用户[cascade|restrict];
默认是restrict
使用cascade后 收回该用户的权限以及该用户授权出去的该权限

 

3.创建数据库模式的权限

 

只有系统的超级用户才能创建一个新的数据库用户

有三种权限 DBA|RESOURCE|CONNECT,默认为CONNECT

CONNECT:不能创建新用户,不能创建模式、基本表,只能登录数据库

RESOURCE:可以创建基本表和视图,不能创建模式和新的用户,可以使用grant授予权限

DBA:超级用户,可以创建新的模式,新的用户,新的表,新的视图。

 

4.数据库角色

数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合

创建角色

create role 角色名

给角色授权

grant 权限
on 对象类型 对象名
to 角色;

将一个角色授予其他的角色或用户

grant 角色
to 角色名
[with admin option]; 
with admin option
与with grant option 一样的效果

 

5.审计 

对修改SC的表结构以及SC的数据的操作进行审计

audit alter,update
on SC;

对修改SC的表结构以及SC的数据的操作进行审计

noaudit alter,update
on SC;

十、断言

通过声明断言来指定更具一般性的约束。可以定义涉及多个表或者聚集操作的比较复杂的完整性约束

1.创建断言

create assertion 断言名 断言子句

如,限制每一门课程最多60名学生选修

create assertion SC_CNUM1
check (60>=all(select count(*) from SC group by con));

2.删除断言 

drop assertion 断言名;

 

 

十一、触发器

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。

任何用户对标的增删改操作都由服务器自动激活触发器,在关系数据库管理系统核心层进行集中的完整性控制。

1.定义触发器

create trigger 触发器名
[BEFORE|AFTER] 触发事件 on 表名
REFERENCIG NEW|OLD ROW as 变量
[when 触发条件] 触发动作体

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章