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)


原文地址:https://www.cnblogs.com/java-oracle/p/5382207.html