【摘要】 模式的定义与删除 在SQL 中,模式定义语句如下:
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>;
1
定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引
SQL SERVER不支持<CASCADE | RESTRICT>,所以直接Drop,默认是RESTRICT。
基本表的定义…
模式的定义与删除
在SQL 中,模式定义语句如下:
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>;
定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义该模式包含的数据库对象,例如基本表、视图、索引
SQL SERVER不支持<CASCADE | RESTRICT>,所以直接Drop,默认是RESTRICT。
基本表的定义、删除与修改
SOL语言使用CREATE TABLE 语句定义基本表,其基本格式如下:
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
参照表和被参照表可以是同一个表,不论基本表中原来是否已有数据,新增加的列一律为空值。若表上建有视图,使用RRESTRICT时表不能删除;使用CASCADE时可以删除表,视图也自动删除.
## 索引的建立与删除
在SQL语言中,建立索引使用CREATE INDEX语句,其一般格式为
CREATE [UNIQUE][CLUSTER] INDEX<索引名>
ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…);
其中,<表名>是要建索引的基本表的名字。索引可以建立在该表的一列或多列上,各列名之间用逗号分隔。每个<列名>后面还可以用<次序>指定索引值的排列次序,可选 ASC(升序)或DESC(降序),默认值为 ASC
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
对于已经建立的索引,如果需要对其重新命名,可以使用ALTER INDEX语句。其一
般格式为
ALTER INDEX<旧索引名>RENAME TO<新索引名>;
在SQL中,删除索引使用DROP INDEX语句,其一般格式为
DROP INDEX<索引名>;
例:向Student表中增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;
例:删除Student表:
DROP TABLE Student CASCADE;
其中CASCADE是级联的意思,在删除该基本表的同时,相关的依赖对象比如视图,都将一并被删除。
2.查询
数据查询是数据库的核心操作,SQL所提供的是SELECT语句。
经常搭配FROM WHERE GROUP BY语句使用。
例:查询学生表中全体学生的学号
SELECT Sno,
FROM Student;
例:查询Student整表
SELECT *,
FROM Student;
其中,*表示所有属性,也可改成,罗列出所有属性,Sname,Sno,Sage,Ssex等,但是肯定麻烦一些。
可以用DISTINCT来消除重复行
例:
SELECT DISTINCT Sno
FROM SC;
GROUP BY:
对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排序,默认值为升序…
连接查询:
即涉及到两个及两个以上的表的查询。
一般使用连接运算符,分为等值查询(使用=连接的)和非等值查询(不使用等号连接的)
SELECT Student,Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND
SC.Cno='2' AND SC.Grade>90;
嵌套查询:
和C语言中的嵌套差不多意思。
例:
SELECT Sname/*外层查询或父查询*/
FROM Student
WHERE Sno IN
(SELECT Sno/*内层查询或子查询*/
FROM SC
WHERE Cno='2');
需要注意的是:子查询的条件不依赖父查询,叫做不相关子查询,也可以理解为由里向外,而由外向里的叫做相关子查询。
不相关子查询
即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname= ' 刘晨 ');
相关子查询
子查询的查询条件依赖于父查询
由外向里
①取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
②再取外层表的下一个元组
③重复这一过程,直至外层表全部检查完为止
模糊查询
% (百分号) 代表任意长度(长度可以为0)的字符串
例如a%b表示以a开头,以b结尾的任意长度的字符串
_ (下横线) 代表任意单个字符。
例如a_b表示以a开头,以b结尾的长度为3的任意字符串
--查询所有姓刘学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘%'; --查询名字中第2个字为"阳"字的学生的姓名和学号。 SELECT Sname,Sno FROM Student WHERE Sname LIKE '_ _阳%';
-----查询第一个名字是刘,最后一个是阳的人
SELECT * FROM Student WHERE Sname LIKE '刘%_阳'; -查询DB_Design课程的课程号和学分。 SELECT Cno,Ccredit FROM Course WHERE Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
第二个例子中对于不同的数据库软件可能会有不同的结果,比如在SQl server 中一个下划线即可,有的需要两个下划线。
因为_是通配符所以我们名字中有的需要用到escape,也就是转移字符,escape+a表示a是转换字符,那么a+_表示的就不再是通配符
涉及空值的查询
SELECT Sno,Cno FROM SC WHERE Grade IS NULL;
注意一定不能写成=null
带有EXISTS谓词的子查询
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
若内层查询结果非空,则外层的WHERE子句返回真值
若内层查询结果为空,则外层的WHERE子句返回假值
SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno= ' 1 ');
i:所有带IN谓词、比较运算符、ANY和ALL谓词的子查询
都能用带EXISTS谓词的子查询 等价替换 详见
集合查询
查询的本来就是一个集合 所以巧用以下语句可以更方便的查询
并-UNION
交-INTERSECT
差-EXCEPT
SELECT *
FROM Student
WHERE Sdept= 'CS' --条件1 UNION SELECT * FROM Student WHERE Sage<=19; --条件2
基于派生表的查询
子查询不仅可以出现在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
); --为临时派生表
2.insert
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
插入到表
--将学生张成民的信息插入到Student表中。 INSERT INTO Student VALUES ('201215126','张成民','男’,18,'CS');
1.插入时 insert 后什么都不写 那么values 括号内信息的顺序 必须和表中属性顺序一致
2.插入时注意表中不能为空和有外码约束的属性
3.alter
ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;
ADD 子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN 子句用于删除表中的列
• 如果指定了 CASCADE 短语,则自动删除引用了该列的其他对象
• 如果指定了 RESTRICT 短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列
DROP CONSTRAINT 子句用于删除指定的完整性约束条件
ALTER COLUMN 子句用于修改原有的列定义,包括修改列名和数据类型
修改表
--ADD
ALTER TABLE Student ADD S_entrance DATE; --不管基本表中原来是否已有数据,新增加的列一律为空值 --ALTER
ALTER TABLE Student ALTER COLUMN Sage INT;
修改索引
ALTER INDEX SCno RENAME TO SCSno;
--将SC表的SCno索引名改为SCSno
4.select
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句) [AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
关于数据库安全性
授予权限
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
WITH GRANT OPTION子句: 指定:可以再授予 没有指定:不能传播
收回权限
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型><对象名>]…
FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
角色
1.角色的创建
CREATE ROLE <角色名>
2.给角色授权
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
3.
将一个角色授予其他的角色或用户
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]
指定了WITH ADMIN OPTION则获得某种权限的角色或用户还可以把这种权限
授予其他角色
4.角色权限的收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…
敏感度
敏感度标记(Label)
对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)
敏感度标记分成若干级别
绝密
机密
可信
公开
TS>=S>=C>=P
主体的敏感度标记称为许可证级别
客体的敏感度标记称为密级
规则:主体(操作者)的密级别=客体的密集时,可读可写。
主体>客体,只读不写。
主体<客体,只写不读。
Audit(审计)
AUDIT ALTER,UPDATE --对修改SC表结构或修改SC表数据的操作进行审计
ON SC;
-----------------------
NOAUDIT ALTER,UPDATE --取消对SC表的一切审计
ON SC;
函数
1. 函数的定义语句格式
CREATE OR REPLACE FUNCTION 函数名 ([参数1,参数2,…]) RETURNS <类型> AS <过程化SQL块>;
2. 函数的执行语句格式
CALL/SELECT 函数名 ([参数1,参数2,…]);
3. 修改函数
重命名
ALTER FUNCTION 过程名1 RENAME TO 过程名2;
**重新编译**
ALTER FUNCTION 过程名 COMPILE;
是标准sql和tsql有差异,难点感觉在于查询(主要是用exist实现全称和蕴含那个),还有存储过程,存储过程就类似函数(没有返回值的函数,就是执行这个过程,主要是语法和之前学的语言差异很大);还有触发器,触发器就是自动执行,类似qt里面的槽函数。
文章来源: blog.csdn.net,作者:HBU 北纬三七,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/IHuskY/article/details/116139557