sql server 常用命令总结
(1) 数据记录筛选: sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]" sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" sql="select * from 数据表 where 字段名 in ('值1','值2','值3')" sql="select * from 数据表 where 字段名 between 值1 and 值2" (2) 更新数据记录: sql="update 数据表 set 字段名=字段值 where 条件表达式" sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" (3) 删除数据记录: sql="delete from 数据表 where 条件表达式" sql="delete from 数据表" (将数据表所有记录删除) (4) 添加数据记录: sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)" sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个表格栏最小的值 SUM(字段名) 把数据栏的值相加 引用以上函数的方法: sp_helpdb 查看数据库 go use 数据库名 go select * from sysobjects where xtype='u' 查看数据库中有什么数据表 go sp_help 数据表名 查看数据表的结构 go sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" set rs=conn.excute(sql) 用 rs("别名") 获取统的计值,其它函数运用同上。 (5) 数据表的建立和删除: CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) 例:CREATE TABLE tab01(name varchar(50),datetime default now()) DROP TABLE 数据表名称 (永久性删除一个数据表) 4. 记录集对象的方法: rs.movenext 将记录指针从当前的位置向下移一行 rs.moveprevious 将记录指针从当前的位置向上移一行 rs.movefirst 将记录指针移到数据表第一行 rs.movelast 将记录指针移到数据表最后一行 rs.absoluteposition=N 将记录指针移到数据表第N行 rs.absolutepage=N 将记录指针移到第N页的第一行 rs.pagesize=N 设置每页为N条记录 2、更改表格 ALTER TABLE table_name ADD COLUMN column_name DATATYPE 说明:增加一个栏位(没有删除某个栏位的语法。 ALTER TABLE table_name ADD PRIMARY KEY (column_name) 说明:更改表得的定义把某个栏位设为主键。 ALTER TABLE table_name DROP PRIMARY KEY (column_name) 说明:把主键的定义删除。 3、建立索引 CREATE INDEX index_name ON table_name (column_name) 说明:对某个表格的栏位建立索引以增加查询时的速度。 4、删除 DROP table_name DROP index_name 二、的资料形态 DATATYPEs smallint 16 位元的整数。 interger 32 位元的整数。 decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数 点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。 float 32位元的实数。 double 64位元的实数。 char(n) n 长度的字串,n不能超过 254。 varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。 graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为 了支援两个字元长度的字体,例如中文字。 vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。 date 包含了 年份、月份、日期。 time 包含了 小时、分钟、秒。 timestamp 包含了 年、月、日、时、分、秒、千分之一秒。 三、资料操作 DML (Data Manipulation Language) 资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法: 1、增加资料: INSERT INTO table_name (column1,column2,...) valueS ( value1,value2, ...) 说明: 1.若没有指定column 系统则会按表格内的栏位顺序填入资料。 2.栏位的资料形态和所填入的资料必须吻合。 3.table_name 也可以是景观 view_name。 INSERT INTO table_name (column1,column2,...) SELECT columnx,columny,... FROM another_table 说明:也可以经过一个子查询(subquery)把别的表格的资料填入。 2、查询资料: 基本查询 SELECT column1,columns2,... FROM table_name 说明:把table_name 的特定栏位资料全部列出来 SELECT * FROM table_name WHERE column1 = xxx [AND column2 > yyy] [OR column3 <> zzz] 三)交叉连接 交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 于6*8=48行。 SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为: select_statement UNION [ALL] selectstatement [UNION [ALL] selectstatement][…n] 其中selectstatement为待联合的SELECT查询语句。 ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 行。 联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 型,系统将低精度的数据类型转换为高精度的数据类型。 在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 查询1 UNION (查询2 UNION 查询3) INSERT语句 用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句: INSERT INTO EMPLOYEES valueS ('Smith','John','1980-06-10', 'Los Angles',16,45000); 通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。 我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。 如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。 回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。 同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。 对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd) --设置用户访问数据库的形式 Alter database TestAA set SINGLE_USER with rollback immediate --设置单用户访问数据库 Alter database TestAA set RESTRICTED_USER with rollback immediate RESTRICTED_USER 只允许 db_owner 固定数据库角色成员以及 dbcreator 和 sysadmin 固定服务器角色成员连接到数据库,不过对连接数没有限制。在 ALTER DATABASE 语句的终止子句所指定的时间范围内,所有数据库连接都将被断开。在数据库转换到 RESTRICTED_USER 状态后,不合格用户所做的连接尝试将被拒绝。 Alter database TestAA set MULTI_USER with rollback immediate --设置用户正常访问 --设置数据库恢复模式 sql 2008 不支持nolog 和 truncate_only 如果要截断日志的话,需要先把数据库搞成简单模型,然后在收缩日志,在改成完全模式。备份一次数据库。 Alter database set recovery {simple/full/bulk_logged} dbcc shrinkfile('filename',10) --导出数据到文本 --EXEC master..xp_cmdshell 'bcp "Select cdoc_id,csubject from cmsdbquery..tbl_article" queryout c:\DT.txt -c -SXXXXX -Usa -PXXXXX' --跟踪脚本需要打开的选项 set statistics io on set statistics profile on set statistics time on --释放过程高速缓存将导致重新编译某些部分 DBCC FREEPROCCACHE --从缓冲池中删除所有清除缓冲区 不用关闭和重启服务器或者服务 DBCC DROPCLEANBUFFERS --以报表形式显示有关过程高速缓存的信息 DBCC PROCCACHE --显示指定表上的指定目标的当前分布统计信息 DBCC SHOW_STATISTICS ( table , target ) --从远程服务器打开数据库连接取数据 SELECT top 20 * FROM OPENDATASOURCE( 'SQLOLEDB', 'Data Source=xxx.xxx.xx.x,port;User ID=sa;Password=xxxxxxx' ).[product].dbo.tableaa data source 好像不能有中括号,好多网友的opendatasource不能用就是这个原因 SELECT * FROM OpenDataSource ('Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\bbb.xls";User ID=;Password=;Extended properties=Excel 5.0')...[sheet1$] 文本的查询 文件必须是,号分割文件 HDR=YES 的时候,第一行被认为是字段名 HDR=NO 的时候,第一行被认为是数据 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Text;HDR=NO;DATABASE=C:\' --c:\是目录 ,aaa#txt) --文件名 BULK INSERT xxxx_trs.dbo.xxxx_day FROM 'F:\BI_DsssDayAddin_cms_IN.csv' WITH ( FIELDTERMINATOR =',', ROWTERMINATOR ='\n' ) --查看sql版本 SELECT SERVERPROPERTY('productversion'),SERVERPROPERTY('productlevel'),SERVERPROPERTY('edition') --初始化标识列 DBCC CHECKIDENT (ProductPicture, RESEED, 1) --数据库2个比较常用的函数 DATABASEPROPERTY 返回数据库状态的值 select DATABASEPROPERTY(dbname, 'issingleuser') 返回数据库是不是单用户模式 HAS_DBACCESS ( 'database_name' ) 返回信息,说明用户是否可以访问指定的数据库 --T终端用户的人 Query user 查询当前登录用户 LogOff sessionid 注销会话 Tsdiscon sessionid 断开某个会话的连接 命令行下需要先建立一个ipc$会话 net use \\10.168.0.21\c$ "XX" /user:administrator query user /server 10.168.0.21 tsdiscon 2 /server 10.168.0.21 创建与删除SQL约束或字段约束。SQL约束控制 1)禁止所有表约束的SQL select 'alter table '+name+' nocheck constraint all' from sysobjects where type='U' 2)删除所有表数据的SQL select 'TRUNCATE TABLE '+name from sysobjects where type='U' 3)恢复所有表约束的SQL select 'alter table '+name+' check constraint all' from sysobjects where type='U' 4)删除某字段的约束 declare @name varchar(100) --DF为约束名称前缀 select @name=b.name from syscolumns a,sysobjects b where a.id=object_id('表名') and b.id=a.cdefault and a.name='字段名' and b.name like 'DF%' --删除约束 alter table 表名 drop constraint @name --为字段添加新默认值和约束 ALTER TABLE 表名 ADD CONSTRAINT @name DEFAULT (0) FOR [字段名]对字段约束进行更改 --删除约束 ALTER TABLE tablename Drop CONSTRAINT 约束名 --修改表中已经存在的列的属性(不包括约束,但可以为主键或递增或唯一) ALTER TABLE tablename alter column 列名 int not null --添加列的约束 ALTER TABLE tablename ADD CONSTRAINT DF_tablename_列名 DEFAULT(0) FOR 列名 --添加范围约束 alter table tablename add check(性别 in ('M','F')) 创建一个库 CREATE DATABASE g2 ON PRIMARY ( NAME = 'g2', FILENAME = 'E:\benet\data1\g1.mdf' , SIZE = 307200KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = 'g2_log', FILENAME = 'E:\benet\data1\g1_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) 创建一个表 CREATE TABLE biao2 ( id int NOT NULL, xingming char(10) NOT NULL, xingbie float(53) NOT NULL, nianling int NOT NULL, chengji float(53) NULL ) 查询 select * from biao1 where chengji between 400 and 600 select * from biao1 where nianling like 55 select * from biao1 where nianling between 10 and 100 select * from biao1 where id = 5 insert into biao1 values (6 ,'原迟',1 , 100 , 1542.22) update biao1 set chengji = chengji + 1000 select * from biao1 delete from biao1 where id = 1 select * from biao1 select * from biao1 排序 order by no asc update biao2 set zongji = shuxue + yuwen + huaxue where xingming = 'a' insert into biao1 values (7,'骨血松涛',1 , 700) select * from biao1 where xingming like '%血%' select distinct xingbie from biao1 alter table biao1 drop column chengji 删除一列 alter table biao2 add liehao int select * from biao1,biao2 where biao1.id=biao2.id 将表一和表二联系起来,建立主索引, 注意小数点的应用 select * from biao1 inner join biao2 on biao1.id=biao2.id 和上面的一样 查询时间 select * from biao2 where riqi between '1993-01-01 00:00:00.000' and '1994-6-29 00:00:00.000' select xingming from biao2 where bumen ='xiaoshou' and xingbie ='na' delete from biao2 where xingming='jinpeng' select id ,xingming into biao2_backup from biao2 where xingbie='na' 备份选择的数据 create view shitu as select xingming ,riqi from biao2 where xingbie = 'na' 创建一个自己匹配的视图 视图相当于是一个符合你的目的的一个查询结果集. 他不占用空间,方便你以后的查找. 多文件还原代码 ESTORE DATABASE [benet] FROM DISK = N'G:\bak\wz.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10 GO RESTORE DATABASE [benet] FROM DISK = N'G:\bak\cy.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10 GO 恢复数据库 benet 来自文件 DISK = N'G:\bak\cy.bak' with 文件数1个, NORECOVERY 指定不发生回滚。从而使前滚按顺序在下一条语句中继续进行。 在这种情况下,还原顺序可还原其他备份,并执行前滚。 REPLACE覆盖 A. 还原完整数据库 注意: MyAdvWorks 数据库仅供举例说明。 以下示例还原完整数据库备份。 复制代码 RESTORE DATABASE MyAdvWorks FROM MyAdvWorks_1 注意: 对于使用完全恢复模式或大容量日志恢复模式的数据库,在大多数情况下,SQL Server 2005 都要求您在还原数据库前备份日志尾部。有关详细信息,请参阅尾日志备份。 B. 还原完整数据库备份和差异备份 以下示例还原完整数据库备份后还原差异备份。另外,以下示例还说明如何还原媒体上的另一个备份集。差异备份追加到包含完整数据库备份的备份设备上。 复制代码 RESTORE DATABASE MyAdvWorks FROM MyAdvWorks_1 WITH NORECOVERY RESTORE DATABASE MyAdvWorks FROM MyAdvWorks_1 WITH FILE = 2 C. 使用 RESTART 语法还原数据库 以下示例使用 RESTART 选项重新启动因服务器电源故障而中断的 RESTORE 操作。 复制代码 -- This database RESTORE halted prematurely due to power failure. RESTORE DATABASE MyAdvWorks FROM MyAdvWorks_1 -- Here is the RESTORE RESTART operation. RESTORE DATABASE MyAdvWorks FROM MyAdvWorks_1 WITH RESTART D. 还原数据库并移动文件 以下示例还原完整数据库和事务日志,并将已还原的数据库移动到 C:\Program Files\Microsoft SQL Server\MSSQL\Data 目录下。 复制代码 RESTORE DATABASE MyAdvWorks FROM MyAdvWorks_1 WITH NORECOVERY, MOVE 'MyAdvWorks' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewAdvWorks.mdf', MOVE 'MyAdvWorksLog1' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewAdvWorks.ldf' RESTORE LOG MyAdvWorks FROM MyAdvWorksLog1 WITH RECOVERY E. 使用 BACKUP 和 RESTORE 创建数据库的副本 以下示例使用 BACKUP 和 RESTORE 语句创建 AdventureWorks 数据库的副本。MOVE 语句使数据和日志文件还原到指定的位置。RESTORE FILELISTONLY 语句用于确定待还原数据库内的文件数及名称。该数据库的新副本称为 TestDB。有关详细信息,请参阅 RESTORE FILELISTONLY (Transact-SQL)。 复制代码 BACKUP DATABASE AdventureWorks TO DISK = 'C:\AdventureWorks.bak' RESTORE FILELISTONLY FROM DISK = 'C:\AdventureWorks.bak' RESTORE DATABASE TestDB FROM DISK = 'C:\AdventureWorks.bak' WITH MOVE 'AdventureWorks_Data' TO 'C:\testdb.mdf', MOVE 'AdventureWorks_Log' TO 'C:\testdb.ldf' GO F. 使用 STOPAT 语法还原到时间点和使用多个设备进行还原 以下示例将数据库还原到它在 2005 年 4 月 15 日中午 12 点时的状态,并显示涉及多个日志和多个备份设备的还原操作。 复制代码 RESTORE DATABASE MyAdvWorks FROM MyAdvWorks_1, MyAdvWorks_2 WITH NORECOVERY, STOPAT = 'Apr 15, 2005 12:00 AM' RESTORE LOG MyAdvWorks FROM MyAdvWorksLog1 WITH NORECOVERY, STOPAT = 'Apr 15, 2005 12:00 AM' RESTORE LOG MyAdvWorks FROM MyAdvWorksLog2 WITH RECOVERY, STOPAT = 'Apr 15, 2005 12:00 AM' G. 将事务日志还原到标记 以下示例将事务日志还原到名为 ListPriceUpdate 的标记事务中的标记处。 复制代码 USE AdventureWorks GO BEGIN TRANSACTION ListPriceUpdate WITH MARK 'UPDATE Product list prices' GO UPDATE Production.Product SET ListPrice = ListPrice * 1.10 WHERE ProductNumber LIKE 'BK-%' GO COMMIT TRANSACTION ListPriceUpdate GO -- Time passes. Regular database -- and log backups are taken. -- An error occurs. USE master GO RESTORE DATABASE AdventureWorks FROM AdvWorks1 WITH FILE = 3, NORECOVERY GO RESTORE LOG AdventureWorks FROM AdvWorks1 WITH FILE = 4, STOPATMARK = 'ListPriceUpdate' H. 使用 TAPE 语法还原 以下示例从 TAPE 备份设备还原完整数据库备份。 复制代码 RESTORE DATABASE MyAdvWorks FROM TAPE = '\\.\tape0' I. 使用 FILE 和 FILEGROUP 语法还原 以下示例还原一个包含两个文件、一个文件组和一个事务日志的数据库。 复制代码 RESTORE DATABASE MyAdvWorks FILE = 'MyAdvWorks_data_1', FILE = 'MyAdvWorks_data_2', FILEGROUP = 'new_customers' FROM MyAdvWorks_1 WITH NORECOVERY -- Restore the log backup. RESTORE LOG MyAdvWorks FROM MyAdvWorksLog1 J. 恢复到数据库快照 以下示例将数据库恢复到数据库快照。此示例假定该数据库当前仅存在一个快照。有关创建此数据库快照的示例,请参阅如何创建数据库快照 (Transact-SQL)。 注意: 恢复到快照将删除所有全文目录。 复制代码 USE master RESTORE DATABASE AdventureWorks FROM DATABASE_SNAPSHOT = 'AdventureWorks_dbss1800'; GO