Sql Server专题三:SQL操作与技巧
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建备份数据的device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_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)