AS
很多时候需使用AS为属性取别名;
SQL代码块开始。存储过程语句
create procedure 过程名
@[参数名] [类型],@[参数名] [类型](output) /*过程首部*/
As
Declare/*as下面对应的块为过程体*/
………
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分隔的语句都是独立的事务,一个语句执行失败不会影响其它语句执行。
BEGIN 和 END 语句必须成对使用。
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专门改变备份为差异备份。