SQL基础语句

一、一般操作都可以在SQL Server中通过界面点击鼠标完成。

二、表操作

   增

CREATE TABLE UserTable(UserID INT NULL,UserName NVARCHAR(50) NULL)

  修改

ALTER TABLE UserTable ADD NewClo INT NULL

 

View Code

   删除

DROP TABLE UserTable

三、数据操作

  增

INSERT INTO Student
(
    StuID,
    StuName,
    StuAge,
    ClassID
)
VALUES
(
    10,
    '名字10',
    10,
    10
)
View Code
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
View Code
INSERT INTO Student
(
    StuID,
    StuName,
    StuAge,
    ClassID
)
VALUES
(
    10,'名字10',10,2
),
(
11,'名字10',11,3
)
View Code

  删除

DELETE FROM Student
View Code
DELETE FROM Student WHERE StuID=10
View Code
--数据无价 谨慎操作
truncate Student;

DROP TABLE Student;
View Code

更新

--数据无价谨慎操作
UPDATE Student
SET
    StuName = '我更新了这个字段'
WHERE StuID=10
View Code
--数据无价谨慎操作
UPDATE Student
SET
    StuName = '我更新了这个字段'
WHERE StuID IN  (SELECT StuID FROM Student AS s WHERE s.StuID IN(10,11))
View Code
--更新

右键 编辑前两百行

View Code

   查

http://www.cnblogs.com/wudequn/p/7090736.html
View Code

四、视图操作

   增

--视图是基于 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
View Code

  查

http://www.cnblogs.com/wudequn/p/7090736.html
和表查询一样
View Code

  删除视图

DROP VIEW NewView
View Code

  修改视图

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
View Code
--修改视图名称
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 ]
View Code

  语法解释

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 语句。但有一些限制。
View Code

  优点

1、已经编译过,比直接自行sql  t-sql要块。
2、减少网络传输。
3、绕过程序中过滤器。(安全性不强)
View Code

   新增

CREATE PROCEDURE UserProcu AS 
SELECT * FROM Student AS s
GO
EXEC UserProcu
View Code

  修改

ALTER PROCEDURE UserProcu AS
SELECT * FROM Class AS c
GO
View Code

  删除

DROP PROCEDURE UserProcu
View Code

  参数

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
View Code
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
View Code

  返回值

--没有指定返回,默认返回一个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
View Code
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
View Code

全局变量和局部变量

局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量被引用时要在其名称前加上标志“@”,而且必须先用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 ;
View Code

六、触发器

https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-trigger-transact-sql

 定义及信息

插入更新删除数据时会自动启动触发器,所以触发器可以用来实现对表实施复杂的完整性约束。
触发器中有两个临时表 Inserted表和Deleted表 由系统维护,存在内存中而不是数据库中,
触发器执行完以后,两个临时表会被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
View Code

 类型分类

三种分类
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触发器。
View Code

 注意:如果触发器出错,则回滚,数据不能更新或者插入等操作。

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)来响应;
View Code

 准备表脚本

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
View Code

新增

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
View Code

新增测试

INSERT INTO Student
(
    StuID,
    StuName,
    StuAge,
    ClassID
)
VALUES
(
    30,
    '触发器名字1',
    30,
    3
)
View Code

删除

DROP TRIGGER t_InsertStudent
View Code

七、方法

 简介

标量函数
    标量值函数可以返回基类型
表值函数
    表值函数主要用于数据计算出来返回结果集,可以带参数(这是和视图的一个大的区别)
聚合函数

系统函数
View Code

标量函数创建

1)必须使用两部分组成函数的名字来调用函数,即架构.对象名,如dbo.F3_GetMax(2,3)

(2)所有的传入参数前必须加@

(3)不要写漏和写错关键字,如as,returns,return4)returns后面不是跟一个变量,而是跟变量的返回值类型

(5)在begin/end语句块中,使用的是return
View Code
-- ================================================
-- 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
View Code

表值函数

  内联表值函数

   返回中只有 一条SQL查询语句

1)只能返回Table,returns后边一定是table
2)as后面没有begin/end,只有一个return语句返回特定的记录
View Code
CREATE FUNCTION f_Student(@stuAge INT,@stuName NVARCHAR(50))
RETURNS TABLE
RETURN(
SELECT * FROM Student AS s    
)

SELECT * FROM dbo.f_Student(1,'')
View Code

  多语句表值函数

    多语句表值函数可以看做标量值函数与内联表值函数的结合体

1)returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。(实质上是定义了一个表变量)

2) 在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。

3) 最后只需要return,return后面不跟任何变量。(返回的是表变量里面的数据)
View Code
CREATE FUNCTION 函数名(参数)  
RETURNS 表变量名称(表变量字段定义)  
AS  
BEGIN  
    SQL语句  
    RETURN;  
END  
View Code
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('')
View Code

八、 数据完整性

  1、规则实施数据完整性

    创建

CREATE RULE rule_name condition_expression
--condition_expression 就是规则的定义,可以是where条件自己的任何表达式,可以包含算术运算符,关系运算符和谓词(如in,like,between)。标量名字用@开头,变量最好和关联的列相同的名字,或者规则绑定到的用户自定义数据类型名字相同
View Code
CREATE RULE student_StudentName_Rule
AS
LEN( @stuName)>3
View Code

       约束只对绑定以后的udpate insert操作有效,以前的老数据不检测。

    查看

EXEC sp_helptext (规则,默认值,触发器,视图,未加密存储过程)
View Code

    绑定  松绑

     一个表 字段只能于一个规则绑定,一个用户自定义数据类型也只能于一个规则绑定。

     用存储过程绑定

EXEC sp_bindrule student_StudentName_Rule,'Student.StuName'

1234567

View Code
EXEC sp_unbindrule 'Student.Name'
View Code

    删除

--删除前,必须解除相应的所有绑定。
DROP RULE student_stuname_rule
View Code

  2、默认值数据完整性

    创建

CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)

View Code

    查看

--查看规则
EXEC sp_helptext student_name_default
View Code

    绑定 松绑

--将默认值绑定到列上
EXEC sp_bindefault student_name_default ,'Student.StuName';
--默认值解绑
EXEC sp_unbindefault 'Student.StuName';
View Code

    删除

--删除默认值
DROP DEFAULT student_name_default
View Code

    备注:

填写的时候直接填写,不用括号以及单引号。
填好后显示
字符类型的字段显示 ('N字符类型字段')
非字符类型字段显示 ((1233213))

两种创建默认值方法
第一种: 创建在数据库上面( 位置 可编程性->默认值)
--创建默认值对象
CREATE DEFAULT student_name_default AS '默认名字';
--将默认值绑定到列上
EXEC sp_bindefault student_name_default ,'Student.StuName';
第二种: 直接表设计的时候填写默认值( 位置 具体表->约束)
View Code

规则和默认值在可编程性里面的。他们统称数据完整性。

3、约束数据完整性

    主键约束

    外键约束

(备注:数据库备份 在还原的时候不会出现问题。但是有时候考虑到数据库版本问题,会生成脚本,进行数据库生成,这种方案就会出现问题,会因为外键约束导致生成失败,  解决方案,第一次生成时不选择外键约束的脚本,第二次生成一个只有外键约束的脚本。具体操作)

View Code

    唯一性约束

    检查约束

    默认约束

      具体的看  http://blog.csdn.net/qq61394323/article/details/26091875

他们统称约束

原文地址:https://www.cnblogs.com/wudequn/p/7093963.html