SQL 总结

【摘要】 模式的定义与删除 在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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享