三级数据库技术程序语句

  • AS
    很多时候需使用AS为属性取别名;
    SQL代码块开始。

  • 存储过程语句

create procedure 过程名
@[参数名] [类型],@[参数名] [类型](output)  /*过程首部*/
As
Declare/*as下面对应的<PL/SQL>块为过程体*/
………
begin
………
end

eg:

CREATE PROCEDURE PRODUCT @商品号 int,@年份 int,@毛利 int output
AS 
DECLARE @某商品销售量 int,@某商品进价 int,@某商品销售单价 int   /*中间变量定义*/
BEGIN
Select @某商品进价=单价 
from 商品表 
where @商品号=商品号
Select @某商品销售单价=销售单价,@某商品销售量=count(*)
from 销售表 
where @商品号=商品号 and 销售时间=@年份 
IF @某商品进价 is NULL THEN      /*判断该商品是否存在*/
  ROLLBACK;
  RETURN;
END IF
IF @某商品销售单价 is NULL THEN   /*判断该商品是否可卖*/
  ROLLBACK;
  RETURN;
END IF
SET @毛利=(@某商品销售单价-@某商品进价)*@某商品销售量
GO

 执行多个输入参数的存储过程时,参数的传递方式有两种:按照参数位置传递值和按参数名称传递值。
eg:

EXEC P1 @a=default, @b='a01';

AS用法
1 . 重命名:select id as systemId from table1;
2 . create table 或 procedure(存储过程),作为关键字:

create procedure name as (declare)
begin
end;

DECLARE用法
声明变量

COMMIT
提交事务的所有操作,即将事务中的所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。(成功)
ROLLBACK
恢复数据到修改之前,即系统将事务中对数据库的所有的已完成的操作全部撤销,回滚到事务开始之前的状态。(不成功)

RETURN
无条件终止查询、存储过程或批处理。存储过程或批处理中后面的语句都不执行。(IF后可接RETURN终止存储过程)

IF ...
END IF
判断语句

  • CASE WHEN语句
    能够实现分情况显示不同类型数据。

eg 1 :列名置于CASE之后

CASE sex 
When ′1′ THEN ′男′
When ′2′ THEN ′女′
ELSE ′其它′ 
END

eg 2 :列名置于WHEN之后判断语句

Case 

  When Grade between 90 and 100 THEN '优'

  When Grade between 80 and 89 THEN '良'

  When Grade between 70 and 79 THEN '中'

  When Grade between 60 and 69 THEN '及格'

  Else '不及格'
End
  • EXISTS判断语句
SELECT 姓名
FROM 学生表
WHERE EXISTS    
(
    SELECT * 
    FROM 选课表
    WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1' 
);

  执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。

  • GO语句:每个被GO分隔的语句都是独立的事务,一个语句执行失败不会影响其它语句执行。

  • BEGINEND 语句必须成对使用。

  • TOP
    (WITH TIES包括最后一行取值并列的结果)
     TOP n表示取查询结果的前n行数据;
     TOP n percent表示取查询结果的前n%行数据。

 SELECT TOP 3 WITH TIES 商品类别,COUNT(*) AS 商品数量
 FROM 商品表
 GROUP BY 商品类别 
 ORDER BY COUNT(*)DESC
  • 权限授予(4s 2d b p)

默认用户

  • dbo:
    数据库的创建者,创建该对象的用户,拥有所有的操作权限;
  • guest:
    能够访问数据库中对象的数据,一般有查看权限select;
    任何SQL Server登录账户都可以访问启用了guest用户的数据库;
    通过授权语句可以启用数据库中的guest用户。

服务器角色:(4s2dbp)

数据库角色:(abso2data2deny1ddl)

security 账户、角色

EXEC sp_addsrvrolemember ′log1′, ′ dbcreator ′  
//授予log1具有创建数据库的权限,EXEC execute执行

授权

GRANT <权限> , ... (ON <对象类型><对象名>) 
TO PUBLIC/<用户> , ...
[WITH GRANT OPTION];//无s

eg:

GRANT ALL PRIVILEGES ON TABLE A,B TO U1,U2;
GRANT UPDATE(学号) , SELECT ON 学生 TO 王平;

收权

REVOKE <权限> , ...(ON <对象类型><对象名>)
FROM PUBLIC/<用户> , ...
CASCADE;
//将该用户转授给其他用户的权限也一并回收,对应于GRANT语句中的WITH GRANT OPTION

eg:

REVOKE UPDATE(学号) ON 学生 FROM 王平:

拒绝访问

DENY ALL/PRIVILIGES ON <对象名> TO <用户>
  • CHECK
    当用CHECK进行约束条件限制时,若其只涉及对某一列的约束则可以放在该列后面,如果是约束条件中涉及两列或两列以上,则为对整个数据表的约束,放在表的最后面。

  • CONVERT(转换语句)

eg:

convert(char(20),openDate,120)

char(20):值类型。要转换成的目标数据类型及长度;
openDate:值内容;
120:值格式。对日期格式进行格式化的编码。

  • JOIN ON

INNER JOIN:连接组合两个表中的字段记录。
LEFT JOIN:连接组合两个表中的字段记录,并将包含了LEFT JOIN左边表中的全部记录。
RIGHT JOIN:连接组合两个表中的字段记录,并将包含了RIGHT JOIN右边表中的全部记录。

FROM 表1  JOIN 表2 ON 表1.字段1 (= > < etc.) 表2.字段2
  • 建表语句(CREAT)

IDENTITY
将T1表的C1列(int类型)定义为标识列,初值和增量值均为1。

CREATE TABLE T1 (C1 int IDENTITY (1,1),
                 …);
  • 触发器(TRIGGER)

前触发器:操作前触发执行,而不再执行该更新操作;
后触发器:只有在引发触发器执行的语句中指定的操作都已成功执行,并且所有的约束检查也成功完成后才执行触发器。

INSERTED表 用于存储INSERT和UPDATE语句所影响行的新值的副本;
DELETED表 用于存储DELETE和UPDATE语句所影响行的旧值的副本。


CREATE TRIGGER [Schema-name.(架构名)]trigger-name ON {table / view}
    {FOR / AFTER / INSTEAD OF} {ON}(某表)
//FOR、AFTER 为后触发器,INSTEAD OF 为前触发器
   ({[INSERT][,][UPDATE][,][DELETE]})
//只说明对某某类型操作(修改、更新、删除)的触发
   (FOR (EACH ROW)//对(行)触发)
真考题库试卷7
    AS{Sql-statement}
   [;]

eg:

CREATE TRIGGER calcu_product
AFTER INSERT ON 销售表
FOR EACH ROW
AS BEGIN
DECLARE @PurchasePrise float   /*对应商品的进价的参数*/
SELECT @PurchasePrise=进货价格 FROM 商品表 WHERE 商品号=new.商品号 
UPDATE 销售表 SET 本次利润=new.销售数量*(new.销售价格-@PurchasePrise)
 WHERE 商品号=new.商品号AND 销售时间=new.销售时间 
/*因为是行级触发器,所以可以使用更新后的新值,用new*/ 
END

eg:

CREATE TRIGGER tric_zc
ON 教师表
AFTER INSERT,UPDATE//只表示某种操作,不带有数值及变量
AS
BEGIN
DECLATE@zc varchar(10),@dept varchar(30)
SET @zc = (select 职称 FROM inserted)//利用inserted表
IF @zc = '教授'  or  '副教授'
UPDATE 部门表
SET 高级职称人数 = 高级职称人数 + 1
WHERE 部门号 = @dept//UPDATE可用WHERE,INSERT INTO 可用SELECT
END
  • 用户自定义函数主要包括标量函数表值函数两类。
  • 标量函数
    返回一个确定类型的标量值。
CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS]参数数据类型
[ = default 默认值] } 
[ ,...n ] 
] 
)
RETURNS return_data_type//returns,return_data_type 用户定义函数的返回类型
[ AS ]
BEGIN
function_body
RETURN scalar_expression//return, 函数返回 scalar_expression 表达式的值
END

eg:

Create FUNCTION dbo.GetTotal(@GoodID char(6))
    Returns int //returns
      AS 
      BEGIN
      Return(SELECT SUM(销售价格) FROM 销售表 WHERE 商品号 = @GoodID)//return
      END

eg:

CREATE FUCNTION BOOK_PROFIT (@year int)
RETURNS @ f_ BOOK_PROFIT TABLE(书号 varchar(50),销售总额 int)
AS//注意AS
BEGIN
INSERT INTO @ f_ BOOK_PROFIT//插入变量表
SELECT a.书号,SUM(单价*销售数量)
FROM 图书表 a JOIN 销售表 b ON a.书号=b.书号
WHERE year(销售时间)=@year
GROUP BY a.书号
RETURN
END

  • 表值函数
    二表链接是只有主码连接才可用=,主码与次码的关系考虑IN等
    eg:
CREATE FUNCTION f_Profit (@lb char(10))  
RETURNS @ProfitTable TABLE(商品号 char(10),总利润 int )
//@ProfitTable为返回的数据变量,table 为返回的类型
AS
BEGIN
INSERT INTO @ProfitTable//插入返回变量
SELECT a.商品号,SUM(销售数量*(销售单价-进货单价)) AS总利润
//SELECT可用表达式,注意多使用AS更名
FROM 销售表 a JOIN 商品表 b
ON a.商品号=b.商品号
WHERE a.商品号 IN(SELECT 商品号 FROM 商品表 WHERE 类别=@lb) 
//商品号有多样,注意IN的使用可求域 ,不能=由于商品号不是主键
GROUP BY a.商品号
ORDER BY 总利润 DESC
RETURN @ProfitTable//不带S

删除用户自定义的函数:

DROP FUNCTION {[schema_name.]function_name}[,…n]

修改函数定义:

ALTER FUNCTION 
  • 游标

定义游标命令

EXEC SQL DECLARE CURSOR(光标) [游标名]
FOR 子查询
(FOR UPDATE OF 字段1,...)//允许游标更新

声明游标

DECLARE 游标名 CURSOR FOR SQL语句

利用游标删除和修改

WHERE CURRENT OF 游标名

打开/关闭游标命令

EXEC SQL OPEN/CLOSE 游标名;

将打开的游标向前推进

EXEC SQL FETCH 游标名
INTO :...,:... ;//主变量组
FETCH [[NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n|@nvar } | RELATIVE { n | @nvar }]  FROM]

NEXT:紧跟当前行返回结果行,并且当前行递增为返回行。
PRIOR:搜索返回紧邻当前行前面的结果行,并且当前行递减为返回行。
FIRST:返回游标中的第一行并将其作为当前行。
LAST:返回游标中的最后一行并将其作为当前行搜索。
ABSOLUTE { n | @nvar}:如果 n 或 @nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。(-n)
RELATIVE { n | @nvar}:如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。

  • DATEDIFF() 函数
    可以返回两个日期之间的天数。
DATEDIFF (datepart,startdate,enddate)
//datepart() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等
//startdate和enddate参数是合法的日期表达式
SELECT DATEDIFF(day,′2008-12-30′,′2008-12-29′) AS DiffDate;
  • 分区函数及实现方案

创建分区表可通过以下几个步骤实现:
①创建分区函数
②创建分区方案
③使用分区方案创建表

分区方案实现:

CREAT PARTITION SCHEME 方案名
AS PARTITON FUNCTION 函数名
(ALL) TO (文件1,2,...);

创建分区表后加ON 方案名。

  • 数据库增加新文件
    eg:
ALTER DATABASE DB1(数据库名) ADD FILE (
     NAME = filex,//文件的逻辑名
     FILENAME = 'D:\DB1\filex.ndf',//文件物理文件名
//FILENAME对应的代码需要带上 单引号
    FILEGROWTH = 20% )
//FILEGROWTH如果加上%则为百分比,如果省略%,数据库系统则默认采用增加单位是MB,
  • HAVING
    条件中若有SQL函数,则必放在HAVING 语句中;
    HAVING必跟在GROUP BY后。

  • ORDER BY
    ORDER BY语句只能作为其他子句之后的最后一个子句出现;
    子查询语句中是不能使用ORDER BY子句的。

  • Sysobjects系统表
    字段:
    SysObjects (
    Name sysname, --object 名称
    id int, --object id
    )
    eg:

SELECT name FROM Sysobjects//查询(是否)存在某名字
  • 备份日志
BACKUP LOG database_name(数据库名) TO backup_device(备份的地方)
  • 开窗函数:可为每组返回多个值
    ORDER BY不能与聚合开窗函数一同使用;
    很多聚合函数都可以用作窗口函数的运算,如SUM,AVG,MAX,MIN,COUNT。
COUNT(*)  OVER(PARTITION BY T1.学号)
  • 定义索引视图
    通过对视图创建唯一聚集索引的方式可将视图的结果集保存到数据库中,建有唯一聚集索引的视图被称为索引视图,也称为物化视图
CREATE UNIQUE CLUSTERED INDEX 索引名 ON 视图名
  • SELECT语句永久存储
    使用SELECT语句查询数据时,产生的结果是保存在内存中的。如果希望将查询结果永久保存下来,比如保存在一个表中,则可以通过在SELECT语句中使用INTO子句实现。
SELECT 查询列表序列 INTO <新表名> FROM 数据源
  • 在查询语句里加入FOR XML子句实现以XML格式返回查询结果。

  • 在T-SQL中恢复数据库使用RESTORE DATABASE语句,恢复事务日志使用RESTORE LOG语句。

  • 公用表表达式
    将查询语句产生的结果集指定一个临时命名的名字,这些命名的结果集就称为公用表表达式。命名后的公用表表达式可以被多次引用。

WITH 公用表表达式标识符(列表1……列表n) AS (SELECT 语句 )
  • 在T-SQL中,实现查询结果差运算的运算符是EXCEPT

  • 在备份语句(BACKUP)中默认情况下使用完整数据库备份,而关键字DIFFERENTIAL专门改变备份为差异备份。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容