数据库SQL总结

这篇博客全面概述了SQL,包括其动词、外模式、模式创建、表操作、索引、查询、嵌套查询、数据更新、视图、用户管理、角色、完整性约束和触发器等方面。详细讲解了SQL的各个核心概念,如数据查询、数据定义、数据操纵和数据控制,并提供了丰富的示例。

SQL,Structured Query Language,标准数据库标准语言。

集 DDL、DML、DCL于一体。

SQL的动词

数据查询:SELECT
数据定义:CREATE、DROP、ALTER
数据操纵:INSERT、UPDATE、DELETE
数据控制:GRANT、REVOKE

SQL外模式

外模式包括若干视图、部分基本表
在这里插入图片描述
数据库-模式-表,视图,索引

模式(架构)

创建

CREATE SCHEMA 模式名 AUTHORIZATION 用户名;
/*没有指定模式名,模式名隐含为用户名*/

删除

DROP SCHEMA 模式名 CASCADE|RESTRICT;
/*                 级联   |限制*/

创建表

CREATE TABLE 表名
(
 列名 数据类型 PRIMARY KEY(主码,不设主码不写),
 列名 数据类型,
 ……
)

例如创建一个学生表

CREATE TABLE Student
		(Sno CHAR(9) PRIMARY KEY,
		 Sname CHAR(20) UNIQUE,
		 Ssex CHAR(2),
		 Sage SMALLINT,
		 Sdept CHAR(20)
		 );

修改表

增加列

ALTER TABLE Table_Name
ADD 列名 数据类型;

删除列

DROP [ COLUMN ] <列名> [CASCADE| RESTRICT]
/*这里的CASCADE RESTRICT 上面由介绍*/

修改基本表的一般格式

ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;

索引

创建索引

例子

CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course (Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

修改索引

ALTER INDEX SCno RENAME TO SCSno;
/*          旧索引名        新索引名*/

删除索引

DROP INDEX Stusname;

查询

可以在选择的列名后加上想要在结果表格中的别名,中间需要用空格隔开。
大写函数 UPPER 小写函数 LOWER
在这里插入图片描述

一般格式

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句) [AS]<别名> 
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] 
[ ORDER BY <列名2> [ ASC|DESC ] ];

group by是按照<列名>的值进行分组,在组里面用聚集函数。
查询数据括号里

查询经过计算的值:

select Sname,2021-Sage
from student;

查询列的别名

select Sname,'出生月份:',2021-Sage,LOWER(Sdept)
from student;

查询加条件(WHERE)

select Sname , Sdept,Sage
from student
where Sage between 18 and 23;
 WHERE + IN 
 				+ BETWEEN AND
 				+ LIKE
 				+ NOT LIKE

LIKE 后面加%(百分号)代表任意长度(长度可为0)的字符串。
_(下划线)代表任意单个字符。

ORDER BY

asc升序;desc降序,默认为asc

连接查询

自身连接 外连接 多表连接
就是在FROM 后面写上要连接的表,自身连接需要对自己的表 进行定义两个名字,外连接 表 LEFT OUTER JOIN 表 ON(……) 左外连接
还有又外连接

嵌套查询

在WHERE后的IN里面进行SELECT查询
上层叫外层查询或父查询,下层查询叫内层查询或者子查询。
不相关子查询:由里向外,子查询不依赖父查询
相关子查询:由外向里,子查询依赖

例3.62 查询选修了全部课程的学生姓名。

SQL中没有全称量词 all但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词

在这里插入图片描述
先把所有转换成用存在量词的谓词,再用EXISTS进行查询。

SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno
AND Cno=Course.Cno));

带有EXISTS谓词的子查询

只返回true或者false;
当内层查询里有数据时,为true,否则为false;
相当于存在量词。
一般内层查询的列只用*,他只返回一个true 或者 false。
not exists 相当于exist取反。

集合查询

select返回的是一个集合,集合操作就是普通的集合操作,交 并 差 union intersect except。

例3.64 查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept='CS'
UNION SELECT *
FROM Student
WHERE Sage<=19;

这就是查询的两个结果进行并集。
注意:参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。

派生表

子查询不仅可以在WHERE子句中,在FROM里也可以,这个时候叫做 临时派生表。

数据更新

INSERT插入 UPDATE修改数据 DELETE删除
INSERT
INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;

UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];

DELETE FROM <表名>
[WHERE <条件>];

视图

子查询可以是任意的SELECT语句
组成视图的属性列名或者全部省略或者全部指定,没有第三种方法。
在下列三种情况下必须明确指定组成视图的所有列名。
(1)某个目标列不是单纯的属性名,而是聚集函数或者列表达式
(2)多表连接时选出了几个同名列作为视图的字段
(3)需要在视图中为某个列启用新的更合适的名字
例如:

CREATE VIEW CS_S1(Sno,Sname,Grade)
AS
	SELECT Student.Sno,Sname,Grade
	FROM Student,sc
	WHERE Student.Sno=sc.Sno AND Cno='1' AND Sdept='CS';

删除视图

如果视图上还导出了其他视图,则使用CASCADE级联删除语句把该视图和由他导出的所有视图一起删除。

创建用户

先创建登录名,然后再右键创建的登录名,点击属性,找到用户映射,选择要映射的数据库确认,再返回数据库找到用户就会看到映射的用户创建成功了,断开sa连接,输入刚刚创建的登录名和密码,登陆成功会发现在映射的那个数据库中的用户里面只会出现登录名映射的用户名。

授权:授予和收回

GRANT语句向用户授予权限,REVOKE语句收回权限。
如果指定WITH GRANT OPTION,则获得某种权限的用户可以把这种权限再授予其他用户,没有则不能授予。
例4.5 把对表SC的INSERT权限授予U5用户,并允许将此权限再授予其他用户。

GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;

例4.9 收回所有用户对表SC的查询权限。

REVOKE SELECT
ON TABLE SC
FROM PUBLIC;

角色

角色其实就是一个集合,相当于一类人,权限的集合。使用角色来管理数据库权限可以简化授权的过程。

创建角色

CREATE ROLE<角色名>

给角色授权

GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…

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

GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]

角色权限收回

REVOKE <权限>[,<权限>]…
ON <对象类型><对象名>
FROM <角色>[,<角色>]…

创建角色

CREATE ROLE R1;
GRANT SELECT,UPDATE,INSERT
ON TABLE Student
TO R1;
GRANT R1
TO U1,U2,U3;–包含全部权限
–如果要收回权限
REVOKE R1
FROM U1;
TSQL赋予角色应该用

EXEC sp_addrolemember ‘角色名’,‘用户名’
删除用户U1的R1角色,并尝试进行修改操作,显示没有权限,则证明U1不属于R1类角色,并且没有了R1相关的权限。

EXEC sp_droprolemember ‘R1’, ‘U1’;

角色的权限修改。

例:
–使角色R1增加了DELETE权限
GRANT DELETE
ON TABLE Student
TO R1;

视图机制

对用户对试图的使用进行权限定义,间接实现支持存取谓词的用户权限定义,从而自动对数据提供一定程度的安全保护。
进行授权权限,换用户登录时,需要把建立的查询全部关闭,不然会造成错误,例4.14,UPDATE就报错了。

审计

审计功能就是数据库管理系统达到C2以上安全级别必不可少的一项指标。
审计功能把用户对数据库的所有操作自动记录下来放进审计日志中。人管理员可以通过这个文件,找出是否存在可疑行为。

AUDIT语句和NOAUDIT语句

audit alter ,update
on sc
noaudit alter ,update
on sc

取消对SC表的一切审计。

NOAUDIT ALTER,UPDATE
ON SC;

alter server audit MyFileAudit with(state=off)
给用户某角色权限
TSQL用EXEC sp_addrolemember ‘角色名’,‘用户名’

实体完整性

实体完整性在CREATE TABLE中用PRIMARY KEY定义,就是定义码。

参照完整性

在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照了哪些表的主码。
在这里插入图片描述

用户定义完整性

列值非空 NOT NULL
列值唯一 UNIQUE
检查列值是否满足一个条件 CHECK短语

定义表时,说明一些属性不允许空值。

CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT NOT NULL,
PRIMARY KEY (Sno,Cno),
……);
这里设置的Sno,Cno,Grade都不能为空值,就是在定义的时候,在数据类型后面加上 NOT NULL。

CHECK()

这个括号里面如果填列值区间,就直接填列值的条件表达式,要是在几个选项之间选择,就用列值IN(,,,)。
往表中插入或修改元组的时候,如果不满足元组的约束条件,就会被拒绝执行。

完整性约束命名子句

CONSTRAINT<完整性约束条件名><完整性约束条件>
完整性约束条件就是NOT NULL、UNIQUE、PRIMARY、FOREIGN KEY、CHECK短语等。
这个是嵌入在CREATE里面的。
例:

建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄不能小于30,性别只能是“男”或“女”。

CREATE TABLE Student
(
Sno NUMERIC(6)
CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),
Sname CHAR(20)
CONSTRAONT C2 NOT NULL,
Sage NUMERIC(3)
CONSTRAINT C3 CHECK (Sage<30),
Ssex CHAR(2)
CONSTRAINT C4 CHECK(Ssex IN (‘男’,‘女’)),
CONSTRAINT StudentKey PRIMARY(Sno)
);

删除原来的约束条件

ALTER TABLE Student
DROP CONSTRAINT C1;

断言

创建断言

CREATE ASSERTION <断言名><CHECK 子句>
CHECK 子句中的约束条件与WHERE子句的条件表达式相似。

删除断言

DROP ASSERTION <断言名>

触发器

定义触发器

CREATE TRIGGER <触发器名>
{BEFORE|AFTER}<触发事件>ON<表名>
REFERENCING NEW|OLD ROW AS<变量>
FOR EACH{ROW|STATEMENT}
[WHEN<触发条件>]<触发动作体>

删除触发器

DROP TRIGGER <触发器名> ON <表名>;
在这里插入图片描述

存储过程

创建存储过程

CREATE OR REPLACE PROCEDURE 过程名([参数1,参数2,...]) 
AS  <过程化SQL块>;

执行

CALL/PERFORM  PROCEDURE
 过程名([参数1,参数2,...]);

修改存储过程

ALTER PROCEDURE 过程名1 RENAME TO 过程名2;

删除存储过程

DROP PROCEDURE 过程名();
TSQL使用方法
DROP PROCEDURE 过程名;

函数

函数和存储过程类似,都是持久性存储模块。不同之处是函数必须指定返回的类型。
函数的定义语句格式

CREATE OR REPLACE FUNCTION 函数名 ([参数1,参数2,…]) RETURNS <类型>  
AS <过程化SQL块>;

函数的执行语句格式

CALL/SELECT 函数名 ([参数1,参数2,…]);

修改函数

ALTER FUNCTION 过程名1 RENAME TO 过程名2;--重命名一个函数
ALTER FUNCTION 过程名 COMPILE;--重新编译一个函数
一、首先你要确认你的鉴别模式: WIN NT鉴别模式呢还是混合模式,其中混合模式包括WIN NT鉴别模式和SQL SERVER 鉴别模式 实施鉴别模式的步骤 1、核实采用了可信连接 2、设置鉴别模式 3、关闭和重启MSSQLServer服务程序 4、创建WIN NT分组和用户 5、授权WIN NT分组和用户可存取SQL Server 6、为用非可信任连接的用户创建SQL Server登录帐号 二、为用户和角色分配登录帐号 三、给角色分配登录权 四、为用户和角色分配许可权限 在改进SQL Server 7.0系列所实现的安全机制的过程中,Microsoft建立了一种既灵活又强大的安全管理 机制,它能够对用户访问SQL Server服务器系统和数据库的安全进行全面地管理。按照本文介绍的步骤,你 可以为SQL Server 7.0(或2000)构造出一个灵活的、可管理的安全策略,而且它的安全性经得起考验。 一、验证方法选择 本文对验证(authentication)和授权(authorization)这两个概念作不同的解释。验证是指检验用户 的身份标识;授权是指允许用户做些什么。在本文的讨论中,验证过程在用户登录SQL Server的时候出现, 授权过程在用户试图访问数据或执行命令的时候出现。 构造安全策略的第一个步骤是确定SQL Server用哪种方式验证用户。SQL Server的验证是把一组帐户、密 码与Master数据库Sysxlogins表中的一个清单进行匹配。Windows NT/2000的验证是请求域控制器检查用户身 份的合法性。一般地,如果服务器可以访问域控制器,我们应该使用Windows NT/2000验证。域控制器可以是 Win2K服务器,也可以是NT服务器。无论在哪种情况下,SQL Server都接收到一个访问标记(Access Token)。 访问标记是在验证过程中构造出来的一个特殊列表,其中包含了用户的SID(安全标识号)以及一系列用户所 在组的SID。正如本文后面所介绍的,SQL Server以这些SID为基础授予访问权限。注意,操作系统如何构造访 问标记并不重要,SQL Server只使用访问标记中的SID。也就是说,不论你使用SQL Server 2000、SQL Server 7.0、Win2K还是NT进行验证都无关紧要,结果都一样。 如果使用SQL Server验证的登录,它最大的好处是很容易通过Enterprise Manager实现,最大的缺点在于 SQL Server验证的登录只对特定的服务器有效,也就是说,在一个多服务器的环境中管理比较困难。使用SQL Server进行验证的第二个重要的缺点是,对于每一个数据库,我们必须分别地为它管理权限。如果某个用户 对两个数据库有相同的权限要求,我们必须手工设置两个数据库的权限,或者编写脚本设置权限。如果用户数 量较少,比如25个以下,而且这些用户的权限变化不是很频繁,SQL Server验证的登录或许适用。但是,在几 乎所有的其他情况下(有一些例外情况,例如直接管理安全问题的应用),这种登录方式的管理负担将超过它 的优点。 二、Web环境中的验证 即使最好的安全策略也常常在一种情形前屈服,这种情形就是在Web应用中使用SQL Server的数据。在这 种情形下,进行验证的典型方法是把一组SQL Server登录名称和密码嵌入到Web服务器上运行的程序,比如 ASP页面或者CGI脚本;然后,由Web服务器负责验证用户,应用程序则使用它自己的登录帐户(或者是系统管 理员sa帐户,或者为了方便起见,使用Sysadmin服务器角色中的登录帐户)为用户访问数据。 这种安排有几个缺点,其中最重要的包括:它不具备对用户在服务器上的活动进行审核的能力,完全依 赖于Web应用程序实现用户验证,当SQL Server需要限定用户权限时不同的用户之间不易区别。如果你使用的 是IIS 5.0或者IIS 4.0,你可以用四种方法验证用户。第一种方法是为每一个网站和每一个虚拟目录创建一 个匿名用户的NT帐户。此后,所有应用程序登录SQL Server时都使用该安全环境。我们可以通过授予NT匿名 帐户合适的权限,改进审核和验证功能。 第二种方法是让所有网站使用Basic验证。此时,只有当用户在对话框中输入了合法的帐户和密码,IIS 才会允许他们访问页面。IIS依靠一个NT安全数据库实现登录身份验证,NT安全数据库既可以在本地服务器 上,也可以在域控制器上。当用户运行一个访问SQL Server数据库的程序或者脚本时,IIS把用户为了浏览 页面而提供的身份信息发送给服务器。如果你使用这种方法,应该记住:在通常情况下,浏览器与
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值