一、一般操作都可以在SQL Server中通过界面点击鼠标完成。
二、表操作
增
CREATE TABLE UserTable(UserID INT NULL,UserName NVARCHAR(50) NULL)
修改
ALTER TABLE UserTable ADD NewClo INT NULL
删除
DROP TABLE UserTable
三、数据操作
增
INSERT INTO Student ( StuID, StuName, StuAge, ClassID ) VALUES ( 10, '名字10', 10, 10 )
INSERT INTO Student ( StuID, StuName, StuAge, ClassID ) select 8,'名字8',8,1 union all select 9,'名字9',9,9 union ALL select 10,'名字10',10,10
INSERT INTO Student ( StuID, StuName, StuAge, ClassID ) VALUES ( 10,'名字10',10,2 ), ( 11,'名字10',11,3 )
删除
DELETE FROM Student
DELETE FROM Student WHERE StuID=10
--数据无价 谨慎操作
truncate Student;
DROP TABLE Student;
更新
--数据无价谨慎操作 UPDATE Student SET StuName = '我更新了这个字段' WHERE StuID=10
--数据无价谨慎操作 UPDATE Student SET StuName = '我更新了这个字段' WHERE StuID IN (SELECT StuID FROM Student AS s WHERE s.StuID IN(10,11))
--更新
右键 编辑前两百行
查
http://www.cnblogs.com/wudequn/p/7090736.html
四、视图操作
增
--视图是基于 SQL 语句的结果集的可视化的表 --主意:COUNT(1)比如指定一个列名(co),否则报错 CREATE VIEW NewView AS SELECT s.StuAge,s.ClassID,COUNT(1) AS co FROM Student AS s GROUP BY s.ClassID,s.StuAge WITH CUBE GO
查
http://www.cnblogs.com/wudequn/p/7090736.html 和表查询一样
删除视图
DROP VIEW NewView
修改视图
ALTER VIEW NewView AS SELECT s.StuAge,s.ClassID,COUNT(1) AS co FROM Student AS s GROUP BY s.ClassID,s.StuAge WITH ROLLUP GO
--修改视图名称 EXEC sp_rename 'NewView', 'NewNewView';
注意: 更改对象名的任一部分都可能会破坏脚本和存储过程。
修改视图数据(不建议使用,视图只为呈现数据内容)
五、存储过程
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-procedure-transact-sql
语法
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ]
语法解释
1.procedure_name :存储过程的名称,在前面加#为局部临时存储过程,加##为全局临时存储过程。 2.; number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。 3.@parameter: 存储过程的参数。可以有一个或多个。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。 使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。 4.data_type:参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。 说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。 5.VARYING: 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。 6.default: 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。 7.OUTPUT :表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。 8.RECOMPILE: 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。 9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。 说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。 10.FOR REPLICATION :指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。 11.AS :指定过程要执行的操作。 12.sql_statement :过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。
优点
1、已经编译过,比直接自行sql t-sql要块。 2、减少网络传输。 3、绕过程序中过滤器。(安全性不强)
新增
CREATE PROCEDURE UserProcu AS SELECT * FROM Student AS s GO EXEC UserProcu
修改
ALTER PROCEDURE UserProcu AS SELECT * FROM Class AS c GO
删除
DROP PROCEDURE UserProcu
参数
CREATE PROCEDURE UserProcu @UserName NVARCHAR(50), @UserClassID INT =1, @UserAge INT AS SELECT * FROM Student AS s WHERE s.StuName LIKE @UserName AND s.StuAge<=@UserAge AND s.ClassID=@UserClassID RETURN @@ROWCOUNT GO DECLARE @return_value int EXEC @return_value = [dbo].[UserProcu] @UserName = N'%名%', @UserClassID = 1, @UserAge = 30 SELECT 'Return Value' = @return_value GO
CREATE PROCEDURE UserProcu @UserName NVARCHAR(50) ='%%', @ECount INT OUTPUT AS SELECT * FROM Student AS s WHERE s.StuName LIKE @UserName SET @ECount= @@ROWCOUNT GO DECLARE @return_value int, @ECount int EXEC @return_value = [dbo].[UserProcu] @ECount = @ECount OUTPUT SELECT @ECount as N'@ECount' SELECT 'Return Value' = @return_value GO
返回值
--没有指定返回,默认返回一个0 CREATE PROCEDURE UserProcu @UserName NVARCHAR(50) ='%%', @ECount INT OUTPUT AS SELECT * FROM Student AS s WHERE s.StuName LIKE @UserName SET @ECount= @@ROWCOUNT GO
CREATE PROCEDURE UserProcu @UserName NVARCHAR(50) ='%%', @ECount INT OUTPUT AS SELECT * FROM Student AS s WHERE s.StuName LIKE @UserName SET @ECount= @@ROWCOUNT RETURN @ECount GO
全局变量和局部变量
局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量被引用时要在其名称前加上标志“@”,而且必须先用DECLARE命令定义后才可以使用。 DECLARE @return_value int, @ECount int; DECLARE @t int; DECLARE @i int=1; SET @t=2; 全局变量是SQL Server系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些SQL Server的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是Transact-SQL命令执行后的状态值。 ①全局变量不是由用户的程序定义的,它们是在服务器级定义的。 ②用户只能使用预先定义的全局变量。 ③引用全局变量时,必须以标记符“@@”开头。 ④局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。 select @@ERROR; select @@IDENTITY ;
六、触发器
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-trigger-transact-sql
定义及信息
插入更新删除数据时会自动启动触发器,所以触发器可以用来实现对表实施复杂的完整性约束。
触发器中有两个临时表 Inserted表和Deleted表 由系统维护,存在内存中而不是数据库中,
触发器执行完以后,两个临时表会被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
类型分类
三种分类 1,for 如果只指定for关键字则,after是默认设置的。 2,after 之后出发。定义在表上,不能定义在视图上,可以为表的同意操作定义多个触发器。 a,insert(有Inserted) b,update(有Inserted和deleted) Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。 c,delete (有deleted) 3, instead of 之前触发。定义在表和视图上都可以,不用指定(insert,update,delete)操作。对一个表只能定义一个instead of触发器。
注意:如果触发器出错,则回滚,数据不能更新或者插入等操作。
inserted和deleted 这两个表是只读的,即只能运用select语句查看
所创建的触发器(insert、delete、update)是在原表数据行已经修改完成后再触发。所以,触发器是在约束检查之后才执行。
可以执行rollback transaction操作将整个触发器以及触发它的T-SQL语句一并回滚(不需显示声明begin transaction)。
作用
a、实现主外键关系所不能保证的复杂参照完整性和数据的一致性。 不过,通过“级联引用完整性约束”可以更有效地执行这些更改。 b、防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。 > 与 CHECK 约束不同(check约束只能引用自身表中的列),DML触发器可以引用其他表中的列; > 触发器可以完成所有约束的功能,但不一定是最佳方案; > 触发器能够使用自定义信息和较为复杂的错误处理; c、DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。 d、一个表中的同一个修改语句的DML触发器,允许被多个不同的操作(INSERT、UPDATE 或 DELETE)来响应;
准备表脚本
CREATE TABLE [dbo].[TragDesc]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [NameDesc] [nvarchar](250) NULL, CONSTRAINT [PK_TragDesc] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
新增
CREATE TRIGGER t_InsertStudent ON Student AFTER INSERT AS DECLARE @CURDType NVARCHAR(50)='新增'; DECLARE @CURDDetail NVARCHAR(500); SELECT @CURDDetail= 'stuID:'+CONVERT(NVARCHAR(50),t.StuID)+' StuName:'+ t.StuName+' StuAge:'+ CONVERT(NVARCHAR(50),t.StuAge)+' ClassID'+CONVERT(NVARCHAR(50),t.ClassID) FROM INSERTED AS t ; INSERT INTO TragDesc (Name,NameDesc)VALUES(@CURDType,@CURDDetail); GO
新增测试
INSERT INTO Student ( StuID, StuName, StuAge, ClassID ) VALUES ( 30, '触发器名字1', 30, 3 )
删除
DROP TRIGGER t_InsertStudent
七、方法
简介
标量函数
标量值函数可以返回基类型
表值函数
表值函数主要用于数据计算出来返回结果集,可以带参数(这是和视图的一个大的区别)
聚合函数
系统函数
标量函数创建
(1)必须使用两部分组成函数的名字来调用函数,即架构.对象名,如dbo.F3_GetMax(2,3) (2)所有的传入参数前必须加@ (3)不要写漏和写错关键字,如as,returns,return (4)returns后面不是跟一个变量,而是跟变量的返回值类型 (5)在begin/end语句块中,使用的是return
-- ================================================ -- Template generated from Template Explorer using: -- Create Scalar Function (New Menu).SQL -- -- Use the Specify Values for Template Parameters -- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in -- the definition of the function. -- ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date, ,> -- Description: <Description, ,> -- ============================================= CREATE FUNCTION [dbo].APlusB ( -- Add the parameters for the function here @a INT , @b INT ) RETURNS INT AS BEGIN -- Declare the return variable here DECLARE @C INT; -- Add the T-SQL statements to compute the return value here SET @C=@a+@b; -- Return the result of the function RETURN @C; END GO
表值函数
内联表值函数
返回中只有 一条SQL查询语句
1)只能返回Table,returns后边一定是table 2)as后面没有begin/end,只有一个return语句返回特定的记录
CREATE FUNCTION f_Student(@stuAge INT,@stuName NVARCHAR(50)) RETURNS TABLE RETURN( SELECT * FROM Student AS s ) SELECT * FROM dbo.f_Student(1,'')
多语句表值函数
多语句表值函数可以看做标量值函数与内联表值函数的结合体
1)returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。(实质上是定义了一个表变量) 2) 在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。 3) 最后只需要return,return后面不跟任何变量。(返回的是表变量里面的数据)
CREATE FUNCTION 函数名(参数)
RETURNS 表变量名称(表变量字段定义)
AS
BEGIN
SQL语句
RETURN;
END
CREATE FUNCTION f_M_Student(@StuName NVARCHAR(50)) RETURNS @table TABLE(StuName NVARCHAR(50),ClassName NVARCHAR(50)) AS BEGIN WITH tepTable AS ( SELECT s.StuName,c.ClassName FROM Class AS c INNER JOIN Student AS s ON s.ClassID = c.ClassID ) INSERT INTO @table SELECT * FROM tepTable; RETURN; END SELECT * FROM dbo.f_M_Student('')
八、 数据完整性
1、规则实施数据完整性
创建
CREATE RULE rule_name condition_expression
--condition_expression 就是规则的定义,可以是where条件自己的任何表达式,可以包含算术运算符,关系运算符和谓词(如in,like,between)。标量名字用@开头,变量最好和关联的列相同的名字,或者规则绑定到的用户自定义数据类型名字相同
CREATE RULE student_StudentName_Rule AS LEN( @stuName)>3
约束只对绑定以后的udpate insert操作有效,以前的老数据不检测。
查看
EXEC sp_helptext (规则,默认值,触发器,视图,未加密存储过程)
绑定 松绑
一个表 字段只能于一个规则绑定,一个用户自定义数据类型也只能于一个规则绑定。
用存储过程绑定
EXEC sp_bindrule student_StudentName_Rule,'Student.StuName'
1234567
EXEC sp_unbindrule 'Student.Name'
删除
--删除前,必须解除相应的所有绑定。
DROP RULE student_stuname_rule
2、默认值数据完整性
创建
CREATE TABLE Orders ( Id_O int NOT NULL, OrderNo int NOT NULL, Id_P int, OrderDate date DEFAULT GETDATE() )
查看
--查看规则
EXEC sp_helptext student_name_default
绑定 松绑
--将默认值绑定到列上 EXEC sp_bindefault student_name_default ,'Student.StuName'; --默认值解绑 EXEC sp_unbindefault 'Student.StuName';
删除
--删除默认值
DROP DEFAULT student_name_default
备注:
填写的时候直接填写,不用括号以及单引号。 填好后显示 字符类型的字段显示 ('N字符类型字段') 非字符类型字段显示 ((1233213)) 两种创建默认值方法 第一种: 创建在数据库上面( 位置 可编程性->默认值) --创建默认值对象 CREATE DEFAULT student_name_default AS '默认名字'; --将默认值绑定到列上 EXEC sp_bindefault student_name_default ,'Student.StuName'; 第二种: 直接表设计的时候填写默认值( 位置 具体表->约束)
规则和默认值在可编程性里面的。他们统称数据完整性。
3、约束数据完整性
主键约束
外键约束
(备注:数据库备份 在还原的时候不会出现问题。但是有时候考虑到数据库版本问题,会生成脚本,进行数据库生成,这种方案就会出现问题,会因为外键约束导致生成失败, 解决方案,第一次生成时不选择外键约束的脚本,第二次生成一个只有外键约束的脚本。具体操作)
唯一性约束
检查约束
默认约束
具体的看 http://blog.csdn.net/qq61394323/article/details/26091875
他们统称约束