SELECT*FROM table1 WHEREtimeBETWEEN time1 AND time2
1
SELECT a,b,c, FROM table1 WHERE a NOTBETWEEN 数值1AND 数值2
9. IN 的使用方法
1
SELECT*FROM table1 WHERE a [NOT] IN (‘值1’,’值2’,’值4’,’值6’)
10. 两张关联表,删除主表中已经在副表中没有的信息
1
DELETEFROM table1 WHERENOTEXISTS ( SELECT*FROM table2 WHERE table1.field1=table2.field1 )
11. 四表联查问题
1
SELECT*FROM a LEFTINNERJOIN b ON a.a=b.b RIGHTINNERJOIN c ON a.a=c.c innerjoin d ON a.a=d.d WHERE .....
12. 日程安排提前五分钟提醒
1
SELECT*FROM 日程安排 WHERE DATEDIFF('minute',f开始时间,GETDATE())>5
13. 一条sql语句搞定数据库分页
1
SELECT TOP 10 b.*FROM (SELECT TOP 20 主键字段,排序字段 FROM 表名 ORDERBY 排序字段 DESC) a,表名 b WHERE b.主键字段 = a.主键字段 ORDERBY a.排序字段
关于数据库分页:
1 2 3 4
DECLARE@startint,@ENDint @sql NVARCHAR(600) SET@sql=’SELECT TOP’+str(@END-@start+1)+’+FROM T WHERE rid NOTIN(SELECT TOP’+str(@str-1)+’Rid FROM T WHERE Rid>-1)’ EXEC sp_executesql @sql
SELECT*INTO #临时表名 FROM 你的表; SELECT*INTO ##临时表名 FROM 你的表;
注:以上的#代表局部临时表,##代表全局临时表
查询临时表
1 2
SELECT*FROM #临时表名; SELECT*FROM ##临时表名;
删除临时表
1 2
DROPTABLE #临时表名; DROPTABLE ##临时表名;
26. 关联表更新
SQL SERVER
1
UPDATE A SET A.b=B.d FROM tableA A INNERJOIN tableB B ON A.a = B.a;
MYSQL
1
UPDATE tableA A INNERJOIN tableB B ON A.a = B.a SET A.b=B.d;
表的字段求合等运算后更新到关联表
1 2 3 4 5
UPDATE tableA SET amount = (SELECTSUM(ISNULL(price, 0) * ISNULL(quantity, 0)) FROM tableB WHERE tableB.fid = tableA.id) WHERE name ='22';
27. 查看表的所有外键关系
1 2 3 4 5
SELECT t1.*, t2.name, t3.name FROM dbo.sysforeignkeys t1 LEFTJOIN sysobjects t2 ON t1.fkeyid=t2.id LEFTJOIN sysobjects t3 ON t1.rkeyid=t3.id WHERE t3.name='表名'
28. 删除所有约束
1 2 3 4 5 6 7 8 9 10 11 12 13 14
DECLARE c1 cursorfor SELECT'ALTER TABLE ['+ object_name(parent_obj) +'] DROP constraint ['+name+']; ' FROM sysobjects WHERE xtype ='F' OPEN c1 DECLARE@c1VARCHAR(8000) FETCH NEXT FROM c1 INTO@c1 WHILE(@@fetch_status=0) BEGIN EXEC(@c1) FETCH NEXT FROM c1 INTO@c1 END CLOSE c1 DEALLOCATE c1
29. 删除数据库所有表
1 2 3 4 5
DECLARE@tnameVARCHAR(8000) SET@tname='' SELECT@tname=@tname+ Name +','FROM sysobjects WHERE xtype='U' SELECT@tname='DROP TABLE '+LEFT(@tname,LEN(@tname)-1) EXEC(@tname)
30. 删除外键约束
得到某个表被哪些外键引用,并且显示出外键表的表名
1 2 3 4 5 6 7 8 9
SELECT fk.name, fk.object_id, OBJECT_NAME(fk.parent_object_id) AS referenceTableName FROM sys.foreign_keys AS fk JOIN sys.objects AS o ON fk.referenced_object_id = o.object_id WHERE o.name ='ATTACHMENTDOC';
SELECT sysobjects.name AS 表名, syscolumns.name AS 列名, systypes.name AS 数据类型, syscolumns.length AS 数据长度, sysproperties.[value] AS 注释 FROM sysproperties RIGHTJOIN sysobjects INNERJOIN syscolumns ON sysobjects.id = syscolumns.id INNERJOIN systypes ON syscolumns.xtype = systypes.xtype ON sysproperties.id = syscolumns.id AND sysproperties.smallid = syscolumns.colid WHERE (sysobjects.xtype ='u'OR sysobjects.xtype ='v') AND (systypes.name <>'sysname') AND sysproperties.[value] ISNOTNULL--查询注释不为 NULL 的记录 AND (sysobjects.name ='指定数据库表') ORDERBY1, 2;
SQL SERVER 2005及以上
1 2 3 4 5 6 7 8 9 10
SELECT ta.name AS 表名, c.name AS 列名, t.name AS 数据类型, c.max_length AS 数据长度, ex.[value] AS 注释 FROM sys.columns AS c INNERJOIN sys.tables AS ta ON c.object_id = ta.object_id LEFTJOIN sys.extended_properties AS ex ON ex.major_id = c.object_id AND ex.minor_id = c.column_id INNERJOIN (SELECT name, system_type_id FROM sys.types WHERE name <>'sysname') AS t ON c.system_type_id = t.system_type_id WHERE ta.name ='指定数据库表' AND ex.[value] ISNOTNULL ORDERBY1, 2;
32. 同步表数据
1 2
INSERT 表2 SELECT*FROM 表1AS a WHERENOTEXISTS(SELECT1FROM 表2WHERE ID = a.ID);
33. 判断某列中是否包含中文字符或者英文字符等特殊字符
中文字符
1
SELECT*FROM 表名 WHERE 某列 LIKE'%[吖-座]%'
英文字符
1
SELECT*FROM 表名 WHERE 某列 LIKE'%[a-z]%'
34. 行转列,将多行数据合并成一行(SQL SERVER 2005以上支持)
例如,表Table1中有两列数据:
code
name
AAA
姓名1
AAA
姓名2
AAA
姓名3
BBB
姓名4
BBB
姓名5
行转列,想变成如下格式:
code
name
AAA
姓名1,姓名2,姓名3
BBB
姓名4,姓名5
可用如下SQL实现:
1 2 3 4 5
SELECT code, name = (STUFF((SELECT','+ name FROM Table1 WHERE code = a.code FOR xml PATH('')),1,1,'')) FROM Table1 a GROUPBY code
SET NOCOUNT ON DECLARE@LogicalFileName sysname, @MaxMinutesINT, @NewSizeINT
USE tablename -- 要操作的数据库名 SELECT@LogicalFileName='tablename_log', -- 日志文件名 @MaxMinutes=10, -- Limit ON time allowed to wrap log. @NewSize=1-- 你想设定的日志文件的大小(M) Setup / initialize DECLARE@OriginalSizeint SELECT@OriginalSize= size FROM sysfiles WHERE name =@LogicalFileName SELECT'Original Size of '+ db_name() +' LOG is '+ CONVERT(VARCHAR(30),@OriginalSize) +' 8K pages or '+ CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) +'MB' FROM sysfiles WHERE name =@LogicalFileName CREATETABLE DummyTrans (DummyColumn char (8000) NOTnull)
DECLARE@CounterINT, @StartTime DATETIME, @TruncLogVARCHAR(255) SELECT@StartTime= GETDATE(), @TruncLog='BACKUP LOG '+ db_name() +' WITH TRUNCATE_ONLY' DBCC SHRINKFILE (@LogicalFileName, @NewSize) EXEC (@TruncLog) -- Wrap the log IF necessary. WHILE @MaxMinutes> DATEDIFF (mi, @StartTime, GETDATE()) -- time has NOT expired AND@OriginalSize= (SELECT size FROM sysfiles WHERE name =@LogicalFileName) AND (@OriginalSize*8/1024) >@NewSize BEGIN-- Outer loop. SELECT@Counter=0 WHILE ((@Counter<@OriginalSize/16) AND (@Counter<50000)) BEGIN-- UPDATE INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans SELECT@Counter=@Counter+1 END EXEC (@TruncLog) END SELECT'Final Size of '+ db_name() +' LOG is '+ CONVERT(VARCHAR(30),size) +' 8K pages or '+ CONVERT(VARCHAR(30),(size*8/1024)) +'MB' FROM sysfiles WHERE name =@LogicalFileName DROPTABLE DummyTrans SET NOCOUNT OFF
CREATEPROCEDURE dbo.User_ChangeObjectOwnerBatch @OldOwnerAS NVARCHAR(128), @NewOwnerAS NVARCHAR(128) AS DECLARE@NameAS NVARCHAR(128) DECLARE@OwnerAS NVARCHAR(128) DECLARE@OwnerNameAS NVARCHAR(128) DECLARE curObject CURSORFOR SELECT'Name'= name, 'Owner'= user_name(uid) FROM sysobjects WHERE user_name(uid)=@OldOwner ORDERBY name OPEN curObject FETCH NEXT FROM curObject INTO@Name, @Owner WHILE(@@FETCH_STATUS=0) BEGIN IF @Owner=@OldOwner BEGIN SET@OwnerName=@OldOwner+'.'+ rtrim(@Name) EXEC sp_changeobjectowner @OwnerName, @NewOwner END -- SELECT @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO@Name, @Owner END CLOSE curObject DEALLOCATE curObject GO
10. SQL SERVER中直接循环写入数据
1 2 3 4 5 6 7
DECLARE@iint SET@i=1 WHILE @i<30 BEGIN INSERTINTO test (userid) VALUES(@i) SET@i=@i+1 END
案例:有如下表,要求就表中所有沒有及格的成绩,在每次增长0.1的基础上,使他们刚好及格:
Name
score
Zhangshan
80
Lishi
59
Wangwu
50
Songquan
69
1 2 3 4 5 6 7 8 9
WHILE((SELECTMIN(score) FROM tb_table)<60) BEGIN UPDATE tb_table SET score =score*1.01 WHERE score<60 IF (SELECTMIN(score) FROM tb_table)>60 BREAK ELSE CONTINUE END
DECLARE@listVARCHAR(1000), @sql NVARCHAR(1000) SELECT@list=@list+','+b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id AND a.name='表A' SET@sql='SELECT '+right(@list,LEN(@list)-1)+' FROM 表A' EXEC (@sql)
15. 查看硬盘分区:
1
EXEC master..xp_fixeddrives
16. 比较A,B表是否相等:
1 2 3 4 5 6
IF (SELECT checksum_agg(binary_checksum(*)) FROM A) = (SELECT checksum_agg(binary_checksum(*)) FROM B) PRINT '相等' ELSE PRINT '不相等'
17. 杀掉所有的事件探察器进程:
1 2 3
DECLARE hcforeach CURSORGLOBALFORSELECT'kill '+RTRIM(spid) FROM master.dbo.sysprocesses WHERE program_name IN('SQL profiler',N'SQL 事件探查器') EXEC sp_msforeach_worker '?'
18. 记录搜索:
开头到N条记录
1
SELECT TOP N *FROM 表
N到M条记录(要有主索引ID)
1
SELECT TOP M-N *FROM 表 WHERE ID IN (SELECT TOP M ID FROM 表) ORDERBY ID DESC
N到结尾记录
1
SELECT TOP N *FROM 表 ORDERBY ID DESC
19. 获取当前数据库中的所有用户表
1
SELECT name FROM sysobjects WHERE xtype='u'AND status>=0
20. 获取某一个表的所有字段
1 2
SELECT name FROM syscolumns WHERE id=object_id('表名') SELECT name FROM syscolumns WHERE id IN (SELECT id FROM sysobjects WHERE type ='u'AND name ='表名')
21. 查看与某一个表相关的视图、存储过程、函数
1
SELECT a.*FROM sysobjects a, syscomments b WHERE a.id = b.id AND b.text LIKE'%表名%'
22. 查看当前数据库中所有存储过程
1
SELECT name AS 存储过程名称 FROM sysobjects WHERE xtype='P'
23. 查询用户创建的所有数据库
1 2
SELECT*FROM master..sysdatabases D WHERE sid NOTIN(SELECT sid FROM master..syslogins WHERE name='sa') SELECT dbid, name AS DB_NAME FROM master..sysdatabases WHERE sid <>0x01
24. 查询某一个表的字段和数据类型
1 2
SELECT column_name,data_type FROM information_schema.columns WHERE table_name ='表名'
如果出现如下错误:SQL Server 阻止了对组件“Ad Hoc Distributed Queries”的STATEMENT“OpenRowset/OpenDatasource”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用“Ad Hoc Distributed Queries”。有关启用“Ad Hoc Distributed Queries” 则解决办法是参照下面命令:
use 数据库名(是要删除表的所在的那个数据库的名称) GO DECLARE@sqlVARCHAR(8000) WHILE (SELECTCOUNT(*) FROM sysobjects WHERE type='U')>0 BEGIN SELECT@sql='DROP TABLE '+ name FROM sysobjects WHERE (type ='U') ORDERBY'DROP TABLE '+ name EXEC(@sql) END
27. 查看数据库文件使用情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14
SELECT A.name AS "逻辑名称" ,CONVERT(FLOAT ,A.size) * (8192.0/1024.0)/1024AS "已用大小MB" ,CONVERT(FLOAT ,A.maxSize - A.size) * (8192.0/1024.0)/1024AS "可用大小MB" ,CONVERT(FLOAT ,A.maxSize) * (8192.0/1024.0)/1024AS "分配大小MB" ,A.fileName AS "文件路径" ,( SELECT SA.groupName FROM SysFileGroups SA WHERE SA.groupID = A.groupID ) AS "文件组" ,CASEWHEN A.status =1081346THEN'磁盘文件' WHEN A.status =1081410THEN'日志设备' ELSECONVERT(VARCHAR ,A.status) ENDAS "文件类型" FROM SysFiles A
SELECT 表名 = c.name, 索引名称 = a.name, 索引字段名 = d.name, 索引字段位置 = d.colid, c.status FROM sysindexes a JOIN sysindexkeys b ON a.id = b.id AND a.indid = b.indid JOIN sysobjects c ON b.id = c.id JOIN syscolumns d ON b.id = d.id AND b.colid = d.colid WHERE a.indid NOTIN (0, 255) AND c.xtype ='U' -- AND c.status > 0 --查所有用户表 AND c.name ='order'--查指定表 ORDERBY c.name,a.name,d.name;
30. 查询没有索引的表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
SELECT* FROM sysobjects WHERE xtype ='U' AND name NOTIN ( SELECT c.name FROM sysindexes a JOIN sysindexkeys b ON a.id = b.id AND a.indid = b.indid JOIN sysobjects c ON b.id = c.id JOIN syscolumns d ON b.id = d.id AND b.colid = d.colid WHERE a.indid NOTIN (0, 255) AND c.xtype ='U' --AND c.status > 0 --查所有用户表 --AND c.name = 'order' --查指定表 ) ORDERBY name