数据库作业14:SQL总结
本文可分为以下几个内容
模式的定义与删除
定义模式
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>;
- 如果没有指定<模式名>,那么<模式名>隐含为<用户名>。
删除模式
DROP SCHEMA <模式名><CASCADE|RESTRICT>;
- CASCADE是级联,表示在删除模式的同时把该模式中所有的数据库对象全部删除
- RESTRICT是限制,表示如果模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。
基本表的定义、删除与修改
定义基本表
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
[<列名><数据类型>[列级完整性约束条件]]
...
[,<表级完整性约束条件>]);/*表级写在最后*/
- 建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由关系数据库管理系统自动检查该才做是否违背这些完整性约束条件。如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
修改基本表
ALTER TABLE <表名>
[ADD[COLUMN]<新列名><数据类型>[完整性约束]]
[ADD<表级完整性约束>]
--增加新列、新的列级完整性约束条件和新的表级完整性约束条件
[DROP [COLUMN]<列名>[CASCADE|RESTRICT]]
--用于删除表中的列
[DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]
--用于删除指定的完整性约束条件
[ALTER COLUMN<列名><数据类型>]
--修改原有的列定义,包括修改列名和数据类型。
删除基本表
DROP TABLE<表名>[RESTRICT|CASCADE];
- T-SQL中不支持级联删除,应先查询外键将外键删除
SELECT NAME
FROM SYS.FOREIGN_KEY_COLUMNS F JOIN SYS.OBJECTS O ON F.CONSTRAINT_OBJECT_ID=O.OBJECT_ID
WHERE F.PARENT_OBJECT_ID=OBJECT_ID(<表名>)
- 然后删除外键约束名:
ALTER TABLE <表名> DROP CONSTRAINT <外键名>
详情可查看:数据库作业3:第三章例题实践
索引的建立与删除
建立索引
CREATE [UNIQUE][CLUSTER]INDEX<索引名>
ON<表名>(<列名>[<次序>][,<列名>[<次序>]]...);
- 每个<列名>后面还可以用<次序>指定索引值的排列次序,可选ASC(升序)或DESC(降序),默认值为ASC。
修改索引
ALTER INDEX <旧索引名>RENAME TO<新索引名>;
在T-SQL中与标准SQL仍有差别,详情可查看:数据库作业4:插入数据、单表查询以及整体实现!
删除索引
在SQL中,删除索引使用DROP INDEX语句,其一般格式为:
DROP INDEX <索引名>;
- 在T-SQL中,语句必须为其设置表名和索引名:
DROP INDEX <索引名> ON <表名>;
详情可查看:数据库作业4:插入数据、单表查询以及整体实现!
数据查询
SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM<表名或视图名>[,<表名或视图名>...]|(<SELECT语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
- 如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP
BY子句带HAVING短语,则只有满足指定条件的组才予以输出。
如果有ORDER BY子句,则结果表还要按<列名2>的值的升序或降序排序。
WHERE子句常用的查询条件
查询条件 | 谓词 |
---|---|
比较 | =, >, <, >=, <=, !=, <>, !>, !<; NOT+上述比较运算符 |
确定范围 | BETWEEN AND, NOT BETWEEN AND |
确定集合 | IN, NOT IN |
字符匹配 | LIKE, NO |
空值 | IS NULL, IS NOT NULL |
多重条件(逻辑运算) | AND, OR, NOT |
字符匹配
谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:
[NOT] LIKE '<匹配串>' [ESCAPE'<换码字符>']
- <匹配串>可以是一个完整的字符串,也可以含有通配符%和_。其中:
- %代表任意长度的字符串。
- _代表任意单个字符。
ORDER BY子句
用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排序,默认值为升序。
聚集函数
COUNT * --统计元组个数
COUNT([DISTINCT|ALL]<列名>) --统计一列中值的个数
SUM([DISTINCT|ALL]<列名>) --计算一列值的总和(此列必须时数值型)
AVG([DISTINCT|ALL]<列名>) --计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列名>) --求一列值的最大值
MIN([DISTINCT|ALL]<列名>) --求一列值的最小值
- 如果指定DISTINCT短语,则表示在计算时要取消置顶列中的重复值。如果不指定DISTINCT短语或指定ALL短语,则表示不取消重复值。
连接查询
等值与非等值连接查询
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:
[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
此外连接谓词还可以使用下面形式:
[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>
- 当连接运算符为=时,称为等值连接。使用其他运算符称为非等值连接。
嵌套查询
在SQL语言中,一个SELCECT-FROM-WHERE语句成为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询成为嵌套查询。例如:
SELECT Sname --外层查询或父查询
FROM Student
WHERE Sno IN
(SELECT Sno--内层查询或子查询
FROM SC
WHERE Cno='2');
- 本例中,下层查询块是嵌套在上层查询块条件中的。上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。
带有ANY(SOME)或ALL谓词的子查询
子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL为此修饰符。而是用ANY或ALL谓词时必同时使用比较运算符。
> ANY 大于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
>=ANY 大于等于子查询结果中的某个值
>=ALL 大于等于子查询结果中的所有值
<=ANY 小于等于子查询结果中的某个值
<=ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
= ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或<>) ANY 不等于子查询结果中的某个值
!=(或<>) ALL 不等于子查询结果中的任何一个值
带有EXISTS谓词的子查询
EXISTS代表存在量词。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”;
集合查询
集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT。
ps:参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这是子查询生成的临时派生表成为主查询的查询对象。
SELECT语句的一般格式
SELECT语句时SQL的核心语句,从前面的例子可以看到其语句成分丰富多样,总结一下他们的一般格式。
SELECT语句的一般格式:
SELECT[ALL|DISTINCT]<目标列表达式>[别名][,<目标列表达式>[别名]]...
FROM<表名或视图名>[别名][,<表明或视图名>[别名]...]|(<SELECT语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
数据更新
插入数据
插入元组
插入元组的INSERT语句格式为:
INSERT
INTO<表名>[<属性列1>[,<属性列2>]...)]
VALUES(<常量1>[,<常量2>]...);
插入子查询结果
子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,也可以嵌套在INSERT语句中用以生成要插入的批量数据。
格式如下:
INSERT
INTO<表名>[(<属性列1>[,<属性列2>...])]
子查询;
修改数据
修改操作又称为更新操作,其语句的一般格式为:
UPDATE<表名>
SET<列名>=<表达式>[,<列名>=<表达式>]...
[WHERE<条件>];
删除数据
删除语句的一般格式为:
DELETE
FROM<表名>
[WHERE<条件>];
空值的处理
所谓空值就是“不知道”或“不存在”或“无意义”的值。
取空值一般有以下几种情况:
- 该属性应该有一个值,但目前不知道它的具体值。
- 该属性不应该有值。
- 由于某种原因不便于填写。
空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊的处理。
视图
视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
定义视图
建立视图
SQL语言用CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW <视图名>[(<列名>[,<列名>]...)]
AS<子查询>
[WITH CHECK OPTION];
- 子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则取决于具体系统的实现。
删除视图
该语句的格式为:
DROP VIEW<视图名>[CASCADE];
- 视图删除后视图的定义将从数据字典中删除。如果该视图上还导出了其他视图,则使用CASCADE级联删除语句把该视图和由它导出的所有视图一起删除。
查询视图
视图定义后,用户就可以像对基本表一样对视图进行查询了。
更新视图
- 是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)。
- 由于试图是不实际存储数据的虚表,因此对视图的更新最终瑶转换为对基本表的更新。
授权:授予与收回
SQL中使用GRANT和REVOKE语句向用户授予或收回对数据的操作权限。GRANT语句向用户授予权限,REVOKE语句收回已经授予的用户权限。
GRANT
GRANT语句的一般格式为:
GRANT <权限>[,<权限>]...
ON<对象类型><对象名>[,<对象类型><对象名>]...
TO<用户>[,<用户>]...
[WITH GRANT OPTION];
- "[WITH GRANT OPTION];"是指被授权用户还可以授予其他用户权限,但不允许循环授予;
REVOKE
授予用户的权限可以由数据库管理员或其他授权者用REVOKE语句收回,REVOKE语句的一般格式为:
REVOKE<权限>[,<权限>]...
ON<对象类型><对象名>[,<对象类型><对象名>]...
FROM<用户>[,<用户>]...[CASCADE|RESTRICT];
数据库角色
角色的创建
创建角色的SQL语句格式是:
CREATE ROLE<角色名>
给角色授权
GRANT<权限>[,<权限>]...
ON<对象类型>对象名
TO<角色>[,<角色>]...
- 数据库管理员和用户可以利用GRANT语句将权限授予某一个或几个角色。
将一个角色授予其他的角色或用户
GRANT<角色1>[,<角色2>]...
TO<角色3>[,<用户1>]...
[WITH ADMIN OPTION]
- 授予或者是角色的创建者,或者拥有在这个角色上的ADMIN OPTION。 如果制定了WITH ADMIN
OPTION子句,则获得某种权限的角色或用户还可以把这种权限再授予其他角色。
视图机制
[例4.14]建立计算机系学生的视图,把对该视图的SELECT 权限授予王平,把该视图上的所有操作权限授予张明。
GO
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept='CS';
GRANT SELECT
ON CS_Student
TO 王平;
GRANT ALL PRIVILEGES
ON CS_Student
TO 张明;
GO
审计
审计功能就是数据库管理系统达到C2以上安全级别必不可少的一项指标。
审计日志是将用户对数据库的所有操作记录在上面。
完整性约束命名子句
SQL还在CREATE TABLE语句中提供了完整性约束命名子 CONSTRAINT,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件。
完整性约束命名子句
CONSTRAINT<完整性约束条件名><完整性约束条件>
- <完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语等。
域中的完整性限制
SQL支持域的概念,并可以用CREATE DOMAIN语句建立一个域以及该域应该满足的完整性约束条件,然后就可以用域来定义属性。
断言
在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。
创建断言的语句格式
CREATE ASSERTION<断言名><CHECK 子句>
- 每个断言都被赋予一个名字,<CHECK 子句>中的约束条件与WHERE子句的条件表达式类似。
触发器
- 任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在关系数据库管理系统核心层进行集中的完整性控制。
- 触发器类似于约束,但是比约束更加灵活,可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
定义触发器
SQL使用CREATE TRIGGER命令建立触发器,其一般格式为:
CREATE TRIGGER<触发器名>
{BEFORE|AFTER}<触发事件>ON<表名>
REFERENCING NEW|OLD ROW AS<变量>
FOR EACH{ROW|STATEMENT}
[WHEN<触发条件>]<触发动作体>
存储过程和函数
存储过程是由过程化SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。
存储过程
创建存储过程
CREATE OR REPLACE PROCEDURE 过程名 ([参数1,参数2,...])
AS<过程化SQL语言>;
执行存储过程
CALL/PERFORM PROCEDURE 过程名([参数1,参数2,...]);
修改存储过程
使用ALTER PROCEDURE 重命名一个存储过程:
ALTER PROCEDURE 过程1 RENAME TO 过程2;
删除存储过程
DROP PROCEDURE 过程名();
函数
函数的定义语句格式
CREATE OR REPLACE FUNCTION 函数名 ([参数1,参数2,...])RETURNS<类型>
AS <过程化SQL块>;
函数的执行语句格式
CALL/SELECT 函数名 ([参数1,参数2,...]);
修改函数
可以使用ALTER FUNCTION重命名一个自定义函数;
ALTER FUNCTION 过程名1 RENAME TO 过程名2;
可以使用ALTER FUNCTION重新编译一个函数:
ALTER FUNCTION 函数名 COMPILE;
有关触发器,存储过程和函数的T-SQL语句请查看:数据库作业12:第五章例题(5.1~5.20)
至此,SQL总结已全部完成!在过往的学习中,经历了不少困难,解决困难之后还是有很大收获!在以后的学习中也应该更加努力!
感谢阅读~