SQL Server 语句整理
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 子句一起用来筛选结果集内的组。
- 执行任何分组操作之前,不满足 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)。
- 不能使用带有别名的 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())中用作参数。
- 不能直接针对具有 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 v1 and v2
-- 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 15 id from tbName) order by id desc