SQL学习总结

本文主要是梳理总结一下这段时间以来在SQL第三章至第五章的学习。

1.基本定义

1.1域

域是一组具有相同数据类型的值得集合

1.2笛卡尔积

笛卡尔积是域上的一种集合运算

1.3关系

关系是笛卡尔积的有限子集

1.4关系模式

对关系的描述称为关系模式

1.5基本的关系操作

关系模型中常用的关系操作包括查询操作和插入操作、删除、修改操作两大部分

2.数据定义

数据定义语句

操作对象创建删除修改
模式create schemadrop schema
create tabledrop tablealter table
视图create viewdrop view
索引create indexdrop indexalter index

2.1模式的定义与删除

模式定义语句如下:

create schema <模式名>authorization <用户名>

当语句没有指定<模式名>时,<模式名>隐含为用户名。

在创建模式时可以同时在模式中创建基本表、视图:

create schema <模式名>authorization <用户名>[<表定义子句>|<视图定义>|
			  <授权定义子句>];

删除模式
删除语句如下:

drop schema<模式名><cascade|restrict>;

其中cascade和restrict两者二选一。cascade表示把该模式中所有数据库对象全部删除:restrict表示如果该模式中已定义下属数据库对象,则拒绝删除语句的执行。
但注意,在SQL中是无法识别CASCADE与RESTRICT的,但同时SQL又默认删除为RESTRICT,同时应注意创建类的代码只能运行一次,多次运行会报错。

2.2基本表的定义、删除与修改

创建基本表的语句如下:

create table<表名><列名><数据类型>[列级完整性约束条件];

修改基本表语句:

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

修改基本表语句:
当某个基本表不再需要时,可以使用drop table语句删除:

drop table<表名>[restrict|cascade];

基本表的删除与模式的删除条件基本相同。

附上数据类型表:

2.3索引的建立与删除

建立索引一般格式:

create [unique][cluster]index<索引名>
on<表名>(<列名>[<次序>]);

修改索引的一般格式:

alter index<旧索引名>rename<新索引名>;

删除索引的一般格式:

drop index <索引名>;

3.数据查询

数据查询一般格式:

select [all|distinct]<目标列表达式>
from <表名或视图>
[where<条件表达式>]
[group by<列名1>[having<条件表达式>]]
[order by<列名2>[asc|desc]];

常用的查询条件:

查询条件谓词
比较=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
确定范围BETWEEN AND,NOT BETWEEN AND
确定集合IN,NOT IN
字符匹配LIKE,NOT LIKE
空值IS NULL,IS NOT NULL
多重条件(逻辑运算)AND,OR,NOT

3.1单表查询

单表查询指仅涉及一个表的查询

例:查询全体学生的详细记录

select*
from student;

select sno,sname,ssex,sage,sdept
from student;

查询经过计算的值,select子句的<目标表达式>不仅可以是属性列,也可以是表达式。

select sname,2014-sage
from student;

3.1.1去重查询

两个本来并不完全相同的元组在投影到指定的某些列上后,可能会变成相同的行。可以用distinct消除。
例:查询选修了课程的学生学号

select distinct sno
from sc;

3.1.2order by子句

可以用order by子句对查询结果升序或降序,默认值为升序。
例:
降序

select sno,grade
from sc
where cno='3'
order by grade desc;

升序

select*
from student
order by sdept,sage desc

3.1.3聚焦函数

SQL提供了许多聚焦函数,主要有:

count(*count([distinct|all]<列名>)
sum([distinct|all]<列名>)
avg([distinct|all]<列名>)
max([distinct|all]<列名>)
min([distinct|all]<列名>)

如果指定distinct语句,则在计算时要取消指定列中的重复值。如果不指定,则默认为all短语。

3.1.4group by子句

group by子句将查询结果分组,对查询结果分组的目的是为了细化聚焦函数的作用对象。

例:求各个课程号及对应的选课人数

select cno,count(sno)
from sc
group by cno;

3.2连接查询

3.2.1等值连接

当连接运算符为=时,称为等值连接,使用其他运算符的称为非等值连接。
查询学生及其选修课程的信息,该查询涉及两个表,此处通过其公共属性Sno来实现

select Student.*,SC.*
from Student,SC
WHERE Student.Sno=SC.Sno;

在本例中,WHERE子句中的属性名都加上了前缀,这是为了避免混淆,如果属性名在参与连接的各表中是唯一的,则可以省略,但在SQL Server中显示结果时前缀不会被显示。

使用自然连接来实现上述例子(在等值连接中吧目标列中重复的属性列去掉则为自然连接):

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student,SC
WHERE Student.Sno=SC.Sno;

3.2.2自身连接

连接操作不仅可以在两个表中进行,也可以一个表与自己进行连接,这就是自身连接。

查询每门课的间接选修课(即先修课的先修课),为此,我们要为该表去两个别名(可辨认即可)

select first.Cno,second.Cpno
from Course first,Course second
WHERE first.Cpno=second.Cno;

3.2.3外连接

当想查询的信息中有某项信息为空时,如想要查询每个学生的基本情况及其选课情况,存在某些学生没选课的情况但仍要显示该学生为空的信息时就可以使用外连接。

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
/*也可以使用USING来去掉结果中的重复值:FROM Student LEFT OUTER JOIN SC USING(Sno);*/

3.2.4多表连接

连接操作除了可以是两表连接,自身连接外,还可以是两个以上的表进行连接,该连接称为多表连接。

查询每个学生的学号、姓名、选修的课程名及成绩

select Student.Sno,Sname,Cname,Grade
from Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

3.3嵌套查询

在SQL语音中,一个select-from-where语句称为一个查询块。将一个查询块嵌套在另一个查询块的where子句或HAVING短语的条件中的查询称为嵌套查询。在嵌套查询中上层的查询块称为外层查询或父查询,下层的查询块称为内层查询或子查询。
SQL语言允许多层嵌套查询,即一个子查询还可以嵌套其他子查询。需要特别指出的是,子查询的select语句不能使用order by子句,order by子句只能对最终查询结果排序

3.3.1带有IN谓词的子查询

将完成一个查询的两个语句合在一起,将第一步查询嵌套在第二个查询中,构成嵌套查询。

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
	  (select Sdept
	   FROM Student
       WHERE Sname='刘晨');

该查询也可通过自身连接来完成:

select S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept=S2.Sdept AND S2.Sname='刘晨';

由此可知实现同一个查询有多种方法,只是不同方法的效率不同。
涉及三个属性的查询

SELECT Sno,Sname
FROM Student
WHERE Sno IN
	  (select Sno
	   FROM SC
       WHERE Cno IN
			 (SELECT Cno
				FROM Course
				WHERE Cname='信息系统'
				)
		);

上诉两个例子中子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询,与之相反的子查询称为相关子查询,整个查询语句称为相关嵌套查询。

3.3.2带有比较运算符的子查询

带有比较运算符的子查询是指父查询于子查询之间用比较运算符进行连接,当能知道内层查询返回的是单个值时,可以用>、<、=、>=、<=、!=或<>等比较运算符。
例:找出学生超过自己选修课平均成绩的课程号

select Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade)
			  FROM SC y
			  WHERE y.Sno=x.Sno);

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

子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。而使用ANY或ALL谓词时则必须同时使用比较运算符。语义如下:

ANY 大于子查询结果中的某个值
ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
= ANY 大于等于子查询结果中的某个值
= ALL 大于等于子查询结果中的所有值
<= ANY 小于等于子查询结果中的某个值
<= ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
= ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或<>) ANY 不等于子查询结果中的某个值
!=(或<>) ALL 不等于子查询结果中的任何一个值

例:查询非计算机系中比计算机系任意学生年龄小的学生姓名和年龄

select Sname,Sage
FROM Student
WHERE Sage<ANY(SELECT Sage
			   FROM Student
			   WHERE Sdept='CS')
AND Sdept<>'CS';  /*此为父查询块中的条*/

3.3.4带有EXISTS谓词的子查询

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
例:查询所有选修了1号课程的学生姓名:

select Sname,Sage
FROM Student
WHERE EXISTS
	  (SELECT*
	   FROM SC
	   WHERE Sno=Student.Sno AND Cno='1');

3.4集合查询

SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT。(注意参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。)
例:查询计算机系的学生及年龄不大于19岁的学生:

select*
from Student
WHERE Sdept='CS'
UNION
SELECT*
FROM Student
WHERE Sage<=19;

使用UNION将多个查询结果合并起来时,系统会自动去掉重复元组。如果要保留重复元组则用UNION ALL操作符。

3.4.1基于派生表的查询

子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象。
找出每个学生超过他自己选修课程平均成绩的课程号该例也可以用该查询完成

select Sno,Cno
from SC,(SELECT Sno,Avg(Grade)FROM SC GROUP BY Sno)
		 AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno=Avg_sc.avg_sno and SC.Grade>=Avg_sc.avg_grade

如果子查询没有聚焦函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其默认属性。
而且通过FROM子句生成派生表时,AS关键字可以省略,但必须为派生关系指定一个别名。而对于基本表,别名是可选择项。

数据查询的内容较多,是SQL语言学习中比较重要的部分,就目前所学的SQl中,这部分用的最多也是涉及比较广的。

4.数据更新

数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。在SQL中有对应的三类语句。

4.1插入数据

4.1.1插入元组

SQL的数据插入语句INSERT通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组。
例:将一个新学生元组插入Student表中

INSERT
INTO Student (Sno,Sname,Ssex,Sage,Sdept)
VALUES('201215128','陈冬','男',18,'CS');

插入元组的功能是将新元组插入指定表中,INTO子句中没有出现的属性列,新元组在这些列上将取空值。但必须注意在表定义是说明了NOT NULL的属性名不能取空值,否则会出错。
如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。

4.1.2插入子查询结果

子查询不仅可以嵌套在select语句中用以构造父查询的条件,也可以嵌套在insert语句中用以生成要插入的批量数据
插入子查询结果的insert语句格式为:

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

4.2修改数据

修改操作又称为更新操作,其功能是修改指定表中满足WHERE子句条件的元组,其中SET子句给出的值用于取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。
例:修改某一个元组的值(修改一个学生的年龄):

UPDATE Student
SET Sage=22
WHERE Sno='201215121';

4.2.1带子查询的修改语句

子查询也可以嵌套在update语句中,用以构造修改的条件。

UPDATE SC
set Grade=0
where sno in
	(select sno
	 from student
	 where sdept='CS');

4.3删除数据

DELETE 语句的功能是指从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句则表示删除表中全部元组,但表中的定义仍在字典中。也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义。

4.3.1删除某一个元组的值

DELETE
from Student
WHERE Sno='201215128';

4.3.1删除多个元组的值

DELETE
from sc;

4.3.1带子查询的删除语句

子查询同样也可以嵌套在DELETE语句,用以构造执行删除操作的条件

DELETE
from SC
WHERE Sno in
		(select Sno
		 from Student
		 where sdept='cs');

应注意对某个基本表中数据的增、删、改操作有可能会破坏参照完整性。

5.空值的处理与视图

5.1空值

所谓空值就是“不知道”或“不存在”或“无意义”的值。SQL语言中允许某些元组的某些属性在一定情况下取空值。一般有以下几种情况:
1.该属性应该有一个值,但目前不知道它的具体值。
2.该属性不应该有值
3.由于某种原因不便于填写。
因此,空值是一个很特殊的值,含不确定性,对关系运算带来特殊的问题,需要做特殊的处理
空值的产生:插入为空的数据或者将某一数据改为空,外连接也会产生空值,空值的关系运算也会产生空值。

空值的判断:判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示

空值的约束条件:属性定义(或者域定义)中有NOT NULL约束条件的不能取空值,加了UNIQUE限制的属性不能取空值,码属性不能取空值

5.2视图

视图是从一个或几个基本表(或视图)导出的表。与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

5.2.1定义视图

建立视图
例:建立学生的视图

create view is_student
as
select sno,sname,sage
from student
where sdept='is';

在另一个视图上建立视图:

create view is_s2
as
select Sno,sname,grade
from is_s1
where grade>=90;

5.2.2删除视图

删除视图的格式为:

drop view <视图名>[cascade];

例:

drop view bt_s;
drop view is_s1;

5.2.3查询视图

视图的查询与表的查询差别不大,查询语句基本可以转换过来,建立的视图中数据不足,其余查询省略。
例:

select sno
from is_student;

5.2.4更新视图

更新视图是指通过视图插入、删除和修改数据。因为视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作。

例:修改信息

update is_student
set sname='刘辰'
where sno='201215122';

5.2.5视图的作用

1.视图能够简化用户的操作
2.视图使用户能以多种角度看待同一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护
5.适当利用视图可以更清晰地表达查询

SQL可以分为数据定义、数据查询、数据更新、数据控制四大部分,有时把数据更新为数据操纵,或把数据查询与数据更新合称为数据操纵。

其实总体来看对视图的操作与对表的操纵基本具有相似性,只是在某些操作上有一些限制。

6.数据库完整性

数据库完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反映当前实际情况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。为维护数据库的完整性,数据库管理系统必须能够实现如下功能:
1.提供定义完整性约束条件的机制。
2.提供完整性检查的方法。
3.进行违约处理

6.1实体完整性

6.1.1定义实体完整性

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。
例:

create table Student
	(sno char(9)PRIMARY KEY,
	 sname char(20)NOT NULL,
	 ssex char(2),
	 sage smallint,
	 sdept char(20)
	 );

6.1.2实体完整性检查和违约处理

用PRIMARY KEY短语定义了关系的主码后,每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系数据库管理系统将按照实体完整性规则自动进行检查。
(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。
(2)检查主码的各个属性是否为空,只有有一个为空就拒绝插入或修改,从而保证了实体完整性

6.2参照完整性

6.2.1定义参照完整性

定义sc中的参照完整性
例:

create table sc
	(sno char(9) not null,
	 cno char(4) not null,
	 grade smallint,
	 primary key (sno,cno),
	 foreign key(sno)references student(sno),
	 foreign key(cno)references course(cno)
	 );

6.2.2参照完整性检查和违约处理

参照完整性将两个表中的相应元祖联系起来了。因此,对呗参照表进行增、删、改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性。

被参照表参照表违约处理
可能破坏参照完整性插入元组拒绝
可能破坏修改外码值拒绝
删除元组可能破坏参照完整性拒绝、级联删除、设置为空值
修改主码值可能破坏参照完整性拒绝、级联修改、设置为空值

参照完整性的违约处理实例:

create table sc
(sno char(9),
cno cahr(4),
grade smallint,
primary key (sno,cno),
foreign key(sno)references student(sno)
	 on delete cascade
	 on update cascade

foreign key(cno)references course(cno)
	 on delete no action
	 on update cascade
);

注意:大部分代码在T-SQL 中与标准SQL有差别。

6.3用户定义的完整性

用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。

6.3.1属性上的约束条件

在create table中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制,包括:
1.列值非空(NOT NULL)
2.列值唯一(UNIQUE)
3.检查列值是否满足一个条件表达式(CHECK短语)

在定义表时,应说明属性不允许取空值:

create table sc
	(sno char(9)not null,
	 cno char(4)not null,
	 grade smallint not null,
	 primary key(sno,cno)
	 );

6.3.2元组上的约束条件

与属性上的约束条件类似,在create table语句中可以用check短语定义元组上的约束条件,即元组级的限制条件。
例:名字不能以Ms.打头

create table student
	(sno char(9),
	 sname char(8)not null,
	 ssex char(2),
	 sage smallint,
	 sdept char(20),
	 primary key (sno),
	 check (ssex='女' or sname not like 'Ms.')
	 );

6.4断言

在SQL中可以使用数据定义语音中的create assertion 语句,通过声明性断言来指定更具一般性的约束.可以定义涉及多个表或聚焦操作的比较复杂的完整性约束。
例:限制数据库课程最多选修学生人数

create assertion asse_sc_db_num
	 check(60>=(select count(*)
				from course,sc
				where sc.cno=course.cno and
				 course.cname='数据库')
		   );

删除断言

删除断言的一般语句格式:

drop assertion<断言名>;

应注意尽量简化断言,复杂的断言维护成本高。

6.5触发器

触发器时是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将被保存在数据库服务器中,触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力。

6.5.1定义触发器

触发器又叫做事件—条件—动作规则。当特定的系统事件(如表的增、删、改操作,事务的结束等)发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作。规则中的动作体可以很复杂,可以涉及其他表和其他数据库对象,通常是一段SQL存储过程。
SQL使用create trigger命令建立触发器,其一般语法格式为:

create trigger<触发器名>
{before|after}<触发事件>on <表名>
referencing new|old row as<变量>
for each{row|statement}
[when<触发条件>]<触发体动作>

例:

create trigger Student_Count
after insert ON student
referencing
	new table as delta
for each statement
	insert into studentinsertlog(numbers)
	select count(*)from delta

6.5.2激活触发器

触发器的执行是由触发事件激活,并由数据库服务自动执行。一个数据表上可能定义了多个触发器,同一个表上的触发器激活时遵循如下的执行顺序;
1.执行该表上的before触发器
2.激活触发器的SQL语句
3.执行该表上的after触发器

对于一个表上的多个触发器,遵循“谁先创建谁先执行”的原则。

6.5.3删除触发器

删除触发器的一般语法格式如下:

drop trigger<触发器名>on<表名>;

7.数据库安全性

数据库的主要不安全因素:

1.非授权用户对数据库的恶意存取和破坏。
2.数据库中重要或敏感的数据被泄露。
3.安全环境的脆弱性

7.1数据库安全性控制

用户身份鉴别:
1.静态口令鉴别。
2.动态口令鉴别。
3.生物特征鉴别。
4.智能卡鉴别。

存取控制:
1.自主存取控制。
2.强制存存取控制。

7.2授权:授予与收回

SQL中用GRANT和REVOKE语句向用户授予或收回对数据的操作权限。GRANT语句向用户授予权限,REVOKE语句收回已经授予用户的权限。

7.2.1GRANT

向一个用户授予权限:

GRANT select
on  Student
TO U1;

对一个用户授予权限并允许将此权限再授予其他用户:

GRANT INSERT
on  SC
to u5
WITH GRANT OPTION;

7.2.2REVOKE

收回用户权限:

REVOKE update(Sno)
on student
from U4;

收回所有用户的查询权限:

REVOKE select
on table sc
from public;

将用户对表的权限收回:

REVOKE insert
on  sc
from U5 CASCADE;

7.3数据库角色

数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。因此,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。
1.角色的创建:
create role <角色名>

2.给角色授权
GRANT<权限>
ON <对象类型>
TO <角色>

3.将一个角色授予其他的角色或用户
GRANT<角色1>[,<角色2>]···
TO <角色3>[,<用户1>]···
[WITH ADMIN OPTION]

4.角色权限收回
REVOKE<权限>[,<权限>]···
ON<对象类型><对象名>
FROM <角色>[,<角色>]···

7.4强制存取控制方法

1.在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类

(1)主体是系统中的活动实体

(2)客体是系统中的被动实体

2.敏感度标记

对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记,主体的敏感度标记称为许可证级别,客体的敏感度标记称为密级
3.强制存取控制规则
(1)仅当 主体 的许可证级别 大于 或 等于 客体 的密级时,该主体才能 读 相应的客体
(2)仅当 主体 的许可证级别 小于 或 等于 客体 的密级时,该主体才能 写 相应的客体

简记为:向下读,向上写

7.5视图机制

不同的用户可以定义不同的视图,把数据对象限制在一定范围内。也就是说,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全防护。
视图机制间接地实现支持存取谓词的用户权限定义
例:
建立视图,把视图权限授予其他用户:
先建立视图:

create view cs_student
as
select*
from student
where sdept='cs';

只授予单个权限:

grant select
on cs_student
to 王平;

授予所有权限:

grant all privileges
on cs_student
to 张明;

7.6审计

用户身份鉴别、存取控制是数据库安全保护的重要技术,但不是全部。为了使数据库管理系统达到一定的安全级别,还需要在其他方面提供相应的支持。审计功能就是数据库管理系统达到C2以上安全级别必不可少的一项安全指标。
1.审计事件
审计事件有多个类别,列如,服务器事件、系统权限、语句事件、模式对象事件等

2.审计功能
审计功能主要包括:基本功能、提供多套审计规则、提供审计分析和报表功能、审计日志管理功能、系统提供的专门视图。

3.AUDIT语句和NOAUDIT语句
AUDIT语句用来设置审计功能,NOAUDIT语句取消审计功能

例:

对修改表结构或数据的操作进行审计:

AUDIT ALTER,UPDATE
on sc;

取消对SC表的一切审计:

NOAUDIT ALTER,UPDATE
ON SC;

经过这段时间的学习,对SQL也有了一定的了解,对学习的内容做一个总结也算是对自己这段时间的学习有所肯定,以后再想用SQL的时候也有个地方可以快速浏览。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值