zoukankan      html  css  js  c++  java
  • 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

    他们统称约束

  • 相关阅读:
    javascript获取url地址问好后面的值,包括问号
    给Object扩展新方法
    关于hasOwnProperty()方法的应用
    javascript if 与 if else 的一点小认识
    express中路由设置的坑-----1
    javascript数组顺序-----1冒泡的另一种比较好理解的写法
    进程的控制与状态细化
    进程的定义与控制
    进程的定义与控制
    进程引入
  • 原文地址:https://www.cnblogs.com/wudequn/p/7093963.html
Copyright © 2011-2022 走看看