SQL Server 语句整理

时间:2022-09-08 21:13:59

1. 创建数据库

create database dbName

2. 删除数据库  

drop database dbName

3. 备份sql server   

--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack

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. 基本sql语句

-- 选择:
select * from table1 where 范围
-- 插入:
insert into table1(field1,field2) values(value1,value2)
-- 删除:
delete from table1 where 范围
-- 更新:
update table1 set field1=value1 where 范围
-- 查找:
select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
--分组
  一张表,一旦分组 完成后,查询后只能得到组相关的信息。
  组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准
  在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
  在select统计函数中的字段,不能和普通的字段放在一起;
  group by 子句中的表达式可以包含from子句中表、派生表或视图的列。这些列不必显示在select子句<select>列表中
<select>列表中任何非聚合表达式中的每个表列或视图列都必须包括在group by列表中:
  --允许:
  select colA,colB from tb1 group by colA,colB;
  select colA + colB from tb1 group by colA,colB;
  select colA + colB from tb1 group by colA + colB;
  select colA + colB + constant from tb1 group by colA,colB; --constant表示常量
  --不允许
  select colA,colB from tb1 group by colA + colB;
  select colA + constant + colB from tb1 group by colA + colB;

    - 如果 select 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每组的汇总值。这些函数称为矢量聚合。
    - 执行任何分组操作之前,不满足 where子句中条件的行将被删除。
    - having 子句与 group by 子句一起用来筛选结果集内的组。
    - 如果组合列包含 null 值,则所有的 null 值都将被视为相等,并会置入一个组中。
    - 不能使用带有别名的 GROUP BY 来替换 AS 子句中的列名,除非别名将替换 FROM 子句内派生表中的列名。
    - 将不删除 GROUPING SETS 列表中的重复分组集。在以下情况下可能会生成重复分组集:多次指定一个列表达式,或者在 GROUPING SETS 列表中列出同样由 CUBE 或 ROLLUP 生成的列表达式。
    - ROLLUP、CUBE 和 GROUPING sets 支持区分聚合,例如,avg(distinct column_name)、count(distinct column_name) 和 SUM (DISTINCT column_name)。
    - 不能在索引视图中指定 ROLLUP、CUBE 和 GROUPING SETS。
    - 不能直接针对具有 ntext、text 或 image 的列使用 GROUP BY 或 HAVING。这些列可以在返回其他数据类型的函数(如 SUBSTRING() 和 CAST())中用作参数。
    - 不能直接在 <column_expression> 中指定 xml 数据类型方法。相反,可引用内部使用 xml 数据类型方法的用户定义函数,或引用使用这些数据类型方法的计算列。
    - 对于 GROUPING SETS、ROLLUP 和 CUBE 的 GROUP BY 限制
-- 排序:
select * from tb1 order by field1,field2 [desc]
-- 总数:
select count as totalcount from table1
-- 求和:
select sum(field1) as sumvalue from table1
-- 平均:
select avg(field1) as avgvalue from table1
-- 最大:
select max(field1) as maxvalue from table1
-- 最小:
select min(field1) as minvalue from table1
-- in
select * from tb_user where a [not] in ('v1','v2','v3','v4')
-- between ; between限制查询数据范围时包括了边界值,not between不包括
select * from tb1 where time between t1 and t2
select a,b,c, from tb1 where a not between v and v
-- top
select top 10 * from tbName where id < 5
--注意: n到结尾数据
select top n * from tbName order by id desc

11. 查询运算符

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

12. 外连接

-- 1. left (outer) join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。SQL: 
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
-- 2. right (outer) join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
-- 3. full/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

13. 数据库操作

-- 1. 分离数据库:
exec sp_detach_db dbName;
-- 2. 附加数据库:
exec sp_attach_db --附加需要完整的路径名
@dbName = N'Test',   --要附加数据库的名字
@filename1 = N'E:\xms-work\vs-test\Test.mdf',
@filename2 = N'E:\xms-work\vs-test\Test_log.ldf';
-- 3. 修改数据库名称 exec sp_renamedb 'oldName','newName'

14. 表操作

-- 1. 复制表结构
  -- 1.1
    select * into tbNew from tbOld where 1<>1
  -- 注:"where 1=1"表示全选,"where 1=2"表示全不选
  -- 1.2
    select top 0 * into tbNew from tbOld
-- 2. 拷贝表数据(同数据库)
    insert into tbNew(a,b,c) select d,e,f from tbOld

15. 在线视图查询

select* from(select id,username from tb_user)T where t.id<10

16. 两张关联表,删除主表中已经在副表中没有的信息

delete from tb1 where not exists (
  select * from tb2 where tb1.field1=tb2.field1 )

17. 随机取出10条数据

select top 10 * from tablename order by newid()
-- 随机选择记录
select newid()

18. 删除重复记录

delete from tbName where id not in (
select max(id) from tbName group by col1,col2,...)

19. 列出数据库中所有的表名

select name from sysobjects where type='U' // U代表用户

20. 列出数据库中所有的列名

1. select name from syscolumns where id=object_id('tbName')
2. select name from syscolumns where id in (
    select id from sysobjects where type = 'u' and name = '表名')

21. 初始化表

truncate table tbName

22. 查看与某一个表相关的视图、存储过程、函数

select a.* from sysobjects a, syscomments b 
where a.id = b.id and b.text like '%tbName%'
-- 注: type='P',表示存储过程;type='FN',表示函数

23. 选择10到15的记录

1. select top 5 * from (select top 15 * from taName order by id asc) A order by id desc
2. select top 5 * from tbName where id in(select top id from tbName) order by id desc