zoukankan      html  css  js  c++  java
  • Sql Server专题三:SQL操作与技巧

    一、基础

    1、说明:创建数据库 

    CREATE DATABASE database-name
    

    2、说明:删除数据库

    drop database dbname

    3、说明:备份sql server

    --- 创建备份数据的device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dak'
    --- 开始备份
    BACKUP DATABASE pubs TO testBack
    *bak文件在SQLServer 中只需要还原即可;挺好用的。
    

    4、说明:创建新表

    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    

    5、说明:删除新表

    drop table tabname
    

    6、说明:增加一个列

    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    

    7、主键

    添加主键: Alter table tabname add primary key(col)
    删除主键: Alter table tabname drop primary key(col)

    8、索引

    创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    

    9、视图

    创建试图:create view viewname as select statement
    删除视图:drop view viewname
    

    10、几个高级查询运算词

    A: UNION 运算符
    
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    
    B: EXCEPT 运算符
    
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    
    C: INTERSECT 运算符
    
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    
    注:使用运算词的几个查询结果行必须是一致的。

    11、连接

    实例
    ==========================
    a表                      b表
    name sex              name age
    张三 男                李四 30
    李四 女                王五 23 
    ==========================
    交叉链接:
    张三 男 李四 30
    李四 女 王五 23
    张三 男 王五 23
    李四 女 李四 30
    
    左联结:
    selece * from a left join b on a.name=b.name
    张三 男  null null
    李四 女  李四 30 
    
    内链接  selece * from a inner  join b on a.name=b.name
    李四 女  李四 30 
    
    外链接 select *  from   a full outer join  b on a.name=b.name
    张三 男 NULL NULL
    李四 女 李四 30
    NULL NULL 王五 23

    12、对数据库进行操作:

    分离数据库: sp_detach_db;  附加数据库:sp_attach_db 后接表名,附加需要完整的路径名
    
    如何修改数据库的名称:sp_renamedb 'old_name', 'new_name'
    

     13、存储过程使用事务 

    CREATE PROCEDURE YourProcedure    
    AS
    BEGIN
        SET NOCOUNT ON;
    
        BEGIN TRY---------------------开始捕捉异常
           BEIN TRAN------------------开始事务
            UPDATE A SET A.names = B.names FROM T1 AS A INNER JOIN T2 AS B ON A.id = B.id
    
            UPDATE A SET A.names = B.names FROM T1 AS A INNER JOIN T2 AS B ON A.TEST = B.TEST
    
        COMMIT TRAN -------提交事务
        END TRY-----------结束捕捉异常
        BEGIN CATCH------------有异常被捕获
            IF @@TRANCOUNT > 0---------------判断有没有事务
            BEGIN
                ROLLBACK TRAN----------回滚事务
            END 
            EXEC YourLogErrorProcedure-----------记录存储过程执行时的错误信息,自定义
        END CATCH--------结束异常处理
    END
    
    
    *捕获错误的常用函数 
    
    1、ERROR_NUMBER()  返回错误号。
    
    2、ERROR_SEVERITY()  返回严重级别。
    
    3、ERROR_STATE()  返回错误状态号。
    
    4、ERROR_PROCEDURE()  返回出现错误的存储过程或触发器的名称。
    
    5、ERROR_LINE()  返回导致错误的行号。
    
    6、ERROR_MESSAGE()  返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。

      二、技巧

    --通过t-sql语句来创建约束
    --新建一张表:员工信息表
    create table Employees(
    EmpId int identity(1,1),
    EmpName varchar(50),
    EmpGender char(2),
    EmpAge int,
    EmpEmail varchar(100),
    EmpAddress varchar(500)
    )
    
    create table Department(
    DepId int identity(1,1) ,
    DepName varchar(50)
    )
    -----------------------手动删除、修改、增加 列-----------------------------------------------
    --手动删除一列(删除EmpAddress列)
    alter table Employees drop column EmpAddress
    --手动增加一列(增加一列EmpAddr varchar(1000))
    alter table Employees add EmpAddr nvarchar(1000)
    --手动修改一下EmpEmail的数据类型(varchar(200))
    alter table Employees alter column EmpEmail varchar(200)
    ---------------------------------手动增加、修改、删除 约束-----------------------------------
    --为EmpId增加一个主键约束
    alter table Employees add constraint PK_Employees_EmpId primary key(EmpId)
    --非空约束,为EmpName增加一个非空约束 not null(修改列)
    alter table Employees alter column EmpName varchar(50) not null
    --为EmpName增加一个唯一约束
    alter table Employees add constraint UQ_Employees_EmpName unique(EmpName)
    --为性别增加一个默认约束,默认为'男'
    alter table Employees add constraint DF_Employees_EmpGender default('男') for EmpGender
    --为性别增加一个检查约束,要求性别只能是:'男' or '女'
    alter table Employees add constraint CK_Employees_EmpGender check(EmpGender='男' or EmpGender='女')
    --为年龄增加一个检查约束:年龄必须在-120岁之间,含岁与岁。
    alter table Employees add constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120)
    
    
    --创建一个部门表,然后为Employee表增加一个DepId列。
    alter table Employees add EmpDepId int not null
    --为Department表设置主键。主键列是:DepId
    alter table Department add constraint PK_Department_DepId primary key(DepId)
    --增加外键约束 
    alter table Employees add constraint FK_Employees_Department foreign key(EmpDepId) references Department(DepId) on delete cascade
    --增加外键约束 ,同时 添加级联删除
    alter table Employees add constraint FK_Employees_Department foreign key(EmpDepId) references Department(DepId) on delete cascade
    --删除单个约束
    alter table Employees drop constraint FK_Employees_Department
    --一次删除多个约束
    alter table Employees drop constraintFK_Employees_Department,CK_Employees_EmpAge,CK_Employees_EmpGender,DF_Employees_EmpGender,UQ_Employees_EmpName
    --一次增加多个约束
    alter table Employees add
    constraint FK_Employees_Department foreign key(EmpDepId) references Department(DepId),
    constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120),
    constraint CK_Employees_EmpGender check(EmpGender='男' or EmpGender='女')
    
    ---创建表的同时就为表增加约束
    create table Employees(
    EmpId int identity(1,1) primary key,
    EmpName varchar(50) not null unique check(len(EmpName)>2),
    EmpGender char(2) default('男'),
    EmpAge int check(EmpAge>0 and EmpAge<120),
    EmpEmail varchar(100) unique,
    EmpAddress varchar(500) not null,
    EmpDepId int foreign key references Department(DepId) on delete cascade
    )
    
    create table Department(
    DepId int identity(1,1) primary key,
    DepName varchar(50) not null unique
    )

      

    ---批量更新表
     update #data set insertorupdate_bz ='1',insertorupdate_yy ='1'
     from #data a inner join jc..jcjc_tb_fwxmxx_bz b (nolock)on a.standardCode = b.fwxmxx_bz_bmchr 
     and a.serviceitemCode=a.standardCode

    ---批量删除表
    delete jc..jcjc_tb_lczlxmmx  from jc..jcjc_tb_lczlxmmx a inner join #data c on a.lczlxmmx_lczlxmbmchr = c.clinicalProjectCode 
    --将查询结果插入另一个表   Select distinct a.zyh,a.rycs,a.yzlx,b.yzbh,b.yzxh,b.yzlbbh  Into #temp_brycy_jbxx  From zy..dr_yzxx a,zy..dr_yzxm b  where a.zyh='"+row1.inpNo +"' and a.rycs='"+row1.inpFreq +"' And a.yzbh = b.yzbh And a.yzlx = b.yzlx

      insert into jc..jcjc_ta_zy (zy_mcchr ,zy_pymchr,zy_sybzchr,zy_echovin_mc,zy_echovin_id )
      select 'ceshi','cs','1','ceshi','11'

      查询结果插入新表
      select * into tableA from tableB where …

      查询结果插入已经存在的表
      insert into tableA
      select * from tableB where…

      查询结果跨数据库
      insert into schemaA.tableA
      select * from schemaB.tableB where…

      查询结果加上新字段插入已经存在的表
      insert into tableA
      select *,NULL from tableB where… 


    --SQLServer查询排序

      select cast(ROW_NUMBER() OVER ( ORDER BY zy_echovin_id ) as int)+@max as xh ,* 

      from (select
      vd_item_define_name as zy_mcchr ,
      vd_item_define_name_pinyin as zy_pymchr ,
      '-1' as zy_sybzchr,
      vd_item_define_name as zy_echovin_mc ,
      id as zy_echovin_id
      from openquery([155ORCL],'select * from METADATA_VD_ITEM where VD_TYPE_ID=''081D829E8BFD45FC9A7C8D358DF43D60''')) a
      where a.zy_echovin_id not in (select zy_echovin_id from jc..jcjc_ta_zy where zy_echovin_id is not null)

    
    
  • 相关阅读:
    centos : 创建交换分区
    用法记录
    mysql日志清理
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    [WPF 自定义控件]Window(窗体)的UI元素及行为
    [WPF 自定义控件]为Form和自定义Window添加FunctionBar
    [WPF 自定义控件]让Form在加载后自动获得焦点
    [WPF 自定义控件]简单的表单布局控件
    [WPF 自定义控件]以Button为例谈谈如何模仿Aero2主题
    [WPF 自定义控件]自定义控件的代码如何与ControlTemplate交互
  • 原文地址:https://www.cnblogs.com/java-oracle/p/5382207.html
Copyright © 2011-2022 走看看