zoukankan      html  css  js  c++  java
  • SQL常用语句

    1、数据库约束为了保证数据的完整性(正确性)而实现的一套机制
    2、非空约束
    3、主键约束(pk)唯一且不为空
    4、默认约束(df)唯一,允许为空,但只能出现一次
    5、检查约束(ck)范围以及及格式限制
    6、外键约束(fk)表关系
    7、增加外键约束时,设置级联更新,级联删除:
    
    主键就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都
    要设定主键
    主键有两种选用策略:业务主键和逻辑主键,业务主键是使用没有业务意义上的字段做主键,比如身份证号,银行账号,逻辑
    主键是没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据,因此很难保证业务主键不会重复,(身份证号重复)
    不会变化(身份证重复)、不会变化(账号升位),因此推荐用逻辑主键
     ----------------------------------------------------------- -----------------------------------------------------------
    sql(SqlServer)编程基本语法
     一、定义变量
     --简单赋值
    declare @a int
    set @a=5
    print @a
      -----------------------------------------------------------
    --使用select语句赋值
    declare @user1 nvarchar(50)
    select @user1='张三'
    print @user1
    declare @user2 nvarchar(50)
    select @user2 = Name from ST_User where ID=1
    print @user2
      -----------------------------------------------------------
    --使用update语句赋值
    declare @user3 nvarchar(50)
    update ST_User set @user3 = Name where ID=1
    print @user3
     -----------------------------------------------------------
    二、表、临时表、表变量
    --创建临时表1
    create table #DU_User1
    (
         [ID] [int]  NOT NULL,
         [Oid] [int] NOT NULL,
         [Login] [nvarchar](50) NOT NULL,
         [Rtx] [nvarchar](4) NOT NULL,
         [Name] [nvarchar](5) NOT NULL,
         [Password] [nvarchar](max) NULL,
         [State] [nvarchar](8) NOT NULL
    );
     -----------------------------------------------------------
    --向临时表1插入一条记录
    insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊');
      -----------------------------------------------------------
    --从ST_User查询数据,填充至新生成的临时表
    select * into #DU_User2 from ST_User where ID<8
      -----------------------------------------------------------
    --查询并联合两临时表
    select * from #DU_User2 where ID<3 union select * from #DU_User1
      -----------------------------------------------------------
    --删除两临时表
    drop table #DU_User1
    drop table #DU_User2
      -----------------------------------------------------------
    --创建临时表
    CREATE TABLE #t
    (
        [ID] [int] NOT NULL,
        [Oid] [int] NOT NULL,
        [Login] [nvarchar](50) NOT NULL,
        [Rtx] [nvarchar](4) NOT NULL,
        [Name] [nvarchar](5) NOT NULL,
        [Password] [nvarchar](max) NULL,
        [State] [nvarchar](8) NOT NULL,
    )
      -----------------------------------------------------------
    --将查询结果集(多条数据)插入临时表
    insert into #t select * from ST_User
    --不能这样插入
    --select * into #t from dbo.ST_User
     -----------------------------------------------------------
    --添加一列,为int型自增长子段
    alter table #t add [myid] int NOT NULL IDENTITY(1,1)
    --添加一列,默认填充全球唯一标识
    alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())
     
    select * from #t
    drop table #t
    
    ---------------------------------------------------------------------------
    
    --给查询结果集增加自增长列
     
    --无主键时:
    select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User
    select * from #t
     
    --有主键时:
    select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID
    ---------------------------------------------------------------------------
    
    --定义表变量
    declare @t table
    (
        id int not null,
        msg nvarchar(50) null
    )
    insert into @t values(1,'1')
    insert into @t values(2,'2')
    select * from @t
    ---------------------------------------------------------------------------
    三、循环
    
    --while循环计算1到100的和
    declare @a int
    declare @sum int
    set @a=1
    set @sum=0
    while @a<=100
    begin
        set @sum+=@a
        set @a+=1
    end
    print @sum
    ---------------------------------------------------------------------------
    四、条件语句
    --if,else条件分支
    if(1+1=2)
    begin
        print ''
    end
    else
    begin
        print ''
    end
     
    --when then条件分支
    declare @today int
    declare @week nvarchar(3)
    set @today=3
    set @week=case
        when @today=1 then '星期一'
        when @today=2 then '星期二'
        when @today=3 then '星期三'
        when @today=4 then '星期四'
        when @today=5 then '星期五'
        when @today=6 then '星期六'
        when @today=7 then '星期日'
        else '值错误'
    end
    print @week
    ---------------------------------------------------------------------------
    五、游标
    
    declare @ID int
    declare @Oid int
    declare @Login varchar(50)
     
    --定义一个游标
    declare user_cur cursor for select ID,Oid,[Login] from ST_User
    --打开游标
    open user_cur
    while @@fetch_status=0
    begin
    --读取游标
        fetch next from user_cur into @ID,@Oid,@Login
        print @ID
        --print @Login
    end
    close user_cur
    --摧毁游标
    deallocate user_cur
     
    ---------------------------------------------------------------------------
    六、触发器
    触发器中的临时表:
    
      Inserted 
      存放进行insert和update 操作后的数据 
      Deleted 
      存放进行delete 和update操作前的数据
    
    --创建触发器
    ---------------------------------------------------------------------------
    Create trigger User_OnUpdate 
        On ST_User 
        for Update
    As
        declare @msg nvarchar(50)
        --@msg记录修改情况
        select @msg = N'姓名从“' + Deleted.Name + N'”修改为“' + Inserted.Name + '' from Inserted,Deleted
        --插入日志表
        insert into [LOG](MSG)values(@msg)
         
    --删除触发器
    drop trigger User_OnUpdate
    ---------------------------------------------------------------------------
    七、存储过程
    --创建带output参数的存储过程
    CREATE PROCEDURE PR_Sum
        @a int,
        @b int,
        @sum int output
    AS
    BEGIN
        set @sum=@a+@b
    END
     
    --创建Return返回值存储过程
    CREATE PROCEDURE PR_Sum2
        @a int,
        @b int
    AS
    BEGIN
        Return @a+@b
    END
         
    --执行存储过程获取output型返回值
    declare @mysum int
    execute PR_Sum 1,2,@mysum output
    print @mysum
     
    --执行存储过程获取Return型返回值
    declare @mysum2 int
    execute @mysum2= PR_Sum2 1,2
    print @mysum2
    ---------------------------------------------------------------------------
    八、自定义函数
    
      函数的分类:
    
        1)标量值函数
    
        2)表值函数
    
            a:内联表值函数
    
            b:多语句表值函数
    
        3)系统函数
    
      --新建标量值函数
    create function FUNC_Sum1
    (
        @a int,
        @b int
    )
    returns int
    as
    begin
        return @a+@b
    end
     
    --新建内联表值函数
    create function FUNC_UserTab_1
    (
        @myId int
    )
    returns table
    as
    return (select * from ST_User where ID<@myId)
     
    --新建多语句表值函数
    create function FUNC_UserTab_2
    (
        @myId int
    )
    returns @t table
    (
        [ID] [int] NOT NULL,
        [Oid] [int] NOT NULL,
        [Login] [nvarchar](50) NOT NULL,
        [Rtx] [nvarchar](4) NOT NULL,
        [Name] [nvarchar](5) NOT NULL,
        [Password] [nvarchar](max) NULL,
        [State] [nvarchar](8) NOT NULL
    )
    as
    begin
        insert into @t select * from ST_User where ID<@myId
        return
    end
     
    --调用表值函数
    select * from dbo.FUNC_UserTab_1(15)
    --调用标量值函数
    declare @s int
    set @s=dbo.FUNC_Sum1(100,50)
    print @s
     
    --删除标量值函数
    drop function FUNC_Sum1
     
    ---------------------------------------------------------------------------
    谈谈自定义函数与存储过程的区别:
    
    一、自定义函数:
    
      1. 可以返回表变量
    
      2. 限制颇多,包括
    
        不能使用output参数;
    
        不能用临时表;
    
        函数内部的操作不能影响到外部环境;
    
        不能通过select返回结果集;
    
        不能update,delete,数据库表;
    
      3. 必须return 一个标量值或表变量
    
      自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
    
    二、存储过程
    
      1. 不能返回表变量
    
      2. 限制少,可以执行对数据库表的操作,可以返回数据集
    
      3. 可以return一个标量值,也可以省略return
    
       存储过程一般用在实现复杂的功能,数据操纵方面。
    ---------------------------------------------------------------------------
    
    请在地址栏内输入 about:config,然后将项 signed.applets.codebase_principal_support 值该为true
    
    ---------------------------------------------------------------------------
    
    修改列类型
    alter table 表名
    alter column 列名 要修改的类型
    
    添加列
    alter table 表名
    add 要添加列名 类型
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    1、基本操作
    关于列类型
        文本类型:区分var前缀、n前缀
        对于不带var的情况、表示不可变长度,如果赋的值不够指定的位数,则末尾使用空格补齐
        对于带var的情况,表示可变长度,如果赋的值不够指定的位数,以实际赋的值为准
    ---------------------------------------------------------------------------
    对于unicode这个编码格式
        如果是带了n的,则每个字符占2个字节
        如果不带n的,则英文字符占1个字节,中文字节占两个字节
    
    ---------------------------------------------------------------------------
    2、表的创建
    做主键
    做标识:由系统自己维护这个列的值
    做非空约束
    ---------------------------------------------------------------------------
    
    
    
    ---------------------------------------------------------------------------
    
    Employee eID:员工对应ID
    Task tID:任务表
    外键
    对应关系:1对1,1对多,多对多
    1对1的关系:这种数据存储到双方任一表里面都行
    1对多的关系:将关系的数据存储到多的一方的表里面
    多对多的关系:讲关系的数据存储到多的一方的表里
    多对多的关系,单独建立一个表,用于存储关系
    根据关系创建出来的列所存储的信息,需要你满足第3NF
        示例:部门-员工的关系是1:n
    只要在员工表中建立了eDId这个列,就已经存储了部门与员工的关系
    外键只是一个约束,保证数据的有效性
    外键需要建立在关系列上
    
    多对多练习
        新建工作任务表Task:工作名称
        经分析,员工表-任务表的对应关系是m:n
    ---------------------------------------------------------------------------
    约束:
    主键约束:(PK)primary key constraint唯一且不为空
    唯一约束:(UQ)unique constraint唯一,允许为空,单只能出现一次
    默认约束: (DF)default constraint默认值
    检查约束: (CK)check constraint范围及格式限制
    外键约束: (FK)foregin key constraint 表关系
    ------------------------------------------------------
    增加外键约束时,设置级联更新,级联删除:
    [on update {no actino|cascade|set null|set default} ]
    [on delete {no actino|cascade|set null|set default} ]
    ------------------------------------------------------
    sql结构化查询语言,是关系数据库管理系统的标准语言。
    sql语言是和dbms"交谈"专用的语句,不同的dbms都对应sql语句。
    sql语句中字符串用单引号表示,单等号。
    sql主要分3中:
    DDL(数据定义语言)、
    DML(数据操作语言)、
    DCL(数据库控制语言)、
    ------------------------------------------------------
    DDL包含:
    创建表 create table,
    删除表 drop table,
    修改表 alter table------------------------------------------------------
    添加约束(constraint )
    格式:
        alter table 表名
        add constraint  约束种类 
    修改列类型
        alter table 表名
        alter column 列名 类型9
    ------------------------------------------------------
    脚本一:DDL
    create创建 alter约束 drop删除
    database table column
    约束关键字
    脚本二:DML  数据操作
    insert into 表名(列名1,列名2...)values(值1,值2)
    delete 表名 set 列名1= 值1,列名2=值2,...[where]
    update [from]表名 [where ...]
        注意:一般不使用物理删除,一旦删除不可恢复
        建议使用逻辑删除,即为表加一个表示"是否删除"的bit类型的列
        删除后,编号继续向后排,不会恢复到种子值
        truncate table 表名:清空表,将所有数据删除的执行效率要比delete高
        使用这种方法删除后,再插入数据时,标识会恢复到种子值
    select
    
    -----------------------------------------------------------------------------
    数据库的名词有哪些?
         数据库管理系统DBMS
         表table
         列column
         字段field
         行row
         范式:
         第一范式:列的原子性
         第二范式:不可重复性
         第三范式:引用其他表的主键信息
    约束:
        问:包含哪些约束
        主键约束:primary key
        唯一约束:uniqun
        外键约束:foreign key
        默认约束:default
        非空约束:not null
        检查约束:check
        
        
    存储过程:可以理解为方法
    if object_id('up_dent','p')is not null
    
    create procecure dent
    as
    select * from dent
    go
    exec dent
    
    
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    
    ---------------------------------------------------------------------------
    
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
    ---------------------------------------------------------------------------
  • 相关阅读:
    命令行环境下简单实用的工具——重定向&管道
    阿里2014校招笔试题(南大)——利用thread和sleep生成字符串的伪随机序列
    Pooled Allocation(池式分配)实例——Keil 内存管理
    modelsim数据导出用于matlab绘图
    顺序块和并行块
    初入博园
    数字图像处理实验(7):PROJECT 04-03 , Lowpass Filtering 标签: 图像处理MATLAB 2017-05-25 09:30 109人
    杭电acm刷题(3):1062,Text Reverse 标签: 杭电acm 2017-05-15 08:26 126人阅读 评论(0)
    杭电ACM刷题(2):1005,Number Sequence 标签: 杭电acmC语言 2017-05-11 22:43 116人阅读
    数字图像处理实验(6):PROJECT 04-02,Fourier Spectrum and Average Value 标签: 图像处理MATLABfft 2017-05-07 23:1
  • 原文地址:https://www.cnblogs.com/xiaz/p/5324251.html
Copyright © 2011-2022 走看看