轉自:http://www.cnblogs.com/accumulater/p/6178083.htmlhtml
--SQL Server:
Select TOP N * From TABLE Order By NewID()
--開頭到N條記錄
Select Top N * From 表
--N到M條記錄(要有主索引ID)
Select Top M-N * From 表Where ID in (Select Top M ID From 表) Order by ID Desc
--選擇10從到15的記錄
select top 5 * from (select top 15 * from table order by id asc) A order by id desc
--N到結尾記錄
Select Top N * From 表Order by ID Desc
統計比例:0.11node
select cast( (sum( case when id=2 then 1 else 0 end) +0.00)/Count(1) as decimal(18,2)) as 比例 from @rtb
--顯示最後5條記錄,可是顯示的順序必須爲5,6,7,8,9,10,而不是10,9,8,7,6,5 以下解決方法:
select top 5 from test where id in(select top 5 from test orderby id desc) orderby id asc
--經過這個問題也能總結出4-10條,5-100條這種限定必定範圍內的sql語句的寫法:
selecttop<末端ID-頂端ID+1>*from<表名>where ID notin(selecttop<頂端ID-1>) ID from<表名>)
--例如:4-10條就應該寫成
selecttop10-4+1*from test where id notin(selecttop4-1 id from test)sql
上一篇: select top 1 * from [news_table] where [新聞標識列]<當前id號 where ......
下一篇: select top 1 * from [news_table] where [新聞標識列]>當前id號 where ...... order by [新聞標識列] desc數據庫
create table t (name varchar(20))express
--大數據找差集
select
t.ip
into
iptemp
from
(
SELECT
b.ip
FROM
tb1 a
JOIN
tb2 b
on
b.num
between
a.startnum
and
a.endnum
) t
SELECT
ip
FROM
tb2
except
SELECT
ip
FROM
iptemp
|
清理日誌:c#
一個表中的Id有多個記錄,把全部這個id的記錄查出來,並顯示共有多少條記錄數。
------------------------------------------
select id, Count(*) from tb group by id having count(*)>1
app
--兩條記錄徹底相同,如何刪除其中一條
set rowcount=1
delete from thetablename where id=@duplicate_id--@duplicate_id爲重複值的id
--模糊查詢
select * from product where detail like '%123.jpg%'
--替換字段裏面部份內容
update product set detail=replace(cast(detail as varchar(8000)),'abc.jpg','efg.jpg') dom
--SQL 替換掉 括號部份內容 select reverse(stuff(reverse(ServiceShopName), 1, charindex('(', reverse(ServiceShopName)), '')) from dbo.[簽名] update dbo.簽名 set ServiceShopName=reverse(stuff(reverse(ServiceShopName), 1, charindex('(', reverse(ServiceShopName)), '')) select distinct('【'+ServiceShopName+'】') from dbo.簽名
--日期轉換參數,值得收藏
select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
20040912110608
select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12
select CONVERT(varchar(12) , getdate(), 112 )
20040912
select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12
--一個月第一天
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) -- 2009-06-01 00:00:00.000
--當天
select * from product where DateDiff(day,modiDate,GetDate())>1
--如何查詢本日、本月、本年的記錄SQL
本年:
select * from loanInfo where year(date)=year(getdate())
本月:
select * from loanInfo where year(date)=year(getDate()) And month(date)=month(getdate())
本日:
select * from loanInfo where year(date)=year(getDate()) And month(date)=month(getdate()) and Day(date)=Day(getDate())
昨天的記錄:
datediff(day,[Datetime],getdate())=1 把Datetime換爲你的相應字段,getdate()-Datetime即爲時間差。
本月記錄:
SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())=0
本週記錄:
SELECT * FROM 表 WHERE datediff(week,[dateadd],getdate())=0
本日記錄:
SELECT * FROM 表 WHERE datediff(day,[dateadd],getdate())=0
本週的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
當天的半夜 SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
上個月的最後一天
這是一個計算上個月最後一天的例子。它經過從一個月的最後一天這個例子上減去毫秒來得到。有一點要記住,在Sql Server中時間是精確到毫秒。這就是爲何我須要減去毫秒來得到我要的日期和時間。
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
計算出來的日期的時間部分包含了一個Sql Server能夠記錄的一天的最後時刻(「:59:59:997」)的時間。
去年的最後一天
鏈接上面的例子,爲了要獲得去年的最後一天,你須要在今年的第一天上減去毫秒。
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
本月的最後一天
如今,爲了得到本月的最後一天,我須要稍微修改一下得到上個月的最後一天的語句。修改須要給用DATEDIFF比較當前日期和「-01-01」返回的時間間隔上加。經過加個月,我計算出下個月的第一天,而後減去毫秒,這樣就計算出了這個月的最後一天。這是計算本月最後一天的SQL腳本。
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
本年的最後一天
你如今應該掌握這個的作法,這是計算本年最後一天腳本
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。
本月的第一個星期一
好了,如今是最後一個例子。這裏我要計算這個月的第一個星期一。這是計算的腳本。
select DATEADD(wk, DATEDIFF(wk,0,
dateadd(dd,6-datepart(day,getdate()),getdate())
), 0)
在這個例子裏,我使用了「本週的星期一」的腳本,並做了一點點修改。修改的部分是把原來腳本中「getdate()」部分替換成計算本月的第天,在計算中用本月的第天來替換當前日期使得計算能夠得到這個月的第一個星期一。
--刪除一個月前,三個月前, 6個月前,一年前的數據
DELETE FROM 表名WHERE datediff(MM, AddTime,GETDATE()) > 1
DELETE FROM 表名WHERE datediff(MM, AddTime,GETDATE()) > 3
DELETE FROM 表名WHERE datediff(MM, AddTime,GETDATE()) > 6
DELETE FROM 表名WHERE datediff(YY, AddTime,GETDATE()) > 1
---------------------------------------------------------------
附錄,其餘日期處理方法
1)去掉時分秒
declare @ datetime
set @ = getdate() --'2003-7-1 10:00:00'
SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)
2)顯示星期幾
select datename(weekday,getdate())
3)如何取得某個月的天數
declare @m int
set @m=2 --月份
select datediff(day,'2003-'+cast(@m as varchar)+'-15' ,'2003-'+cast(@m+1 as varchar)+'-15')
另外,取得本月天數
select datediff(day,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate()) as varchar)+'-15' ,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate())+1 as varchar)+'-15')
任意月份的最大天數
select day(dateadd(dd,-1,dateadd(mm,1,Dateadd(mm,datediff(mm,0,getdate()),0))))
或者使用計算本月的最後一天的腳本,而後用DAY函數區最後一天
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))
4)判斷是否閏年:
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then '平年' else '閏年' end
或者
select case datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01'))
when 28 then '平年' else '閏年' end
5)一個季度多少天
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
when @m between 4 and 6 then 4
when @m between 7 and 9 then 7
else 10 end
select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'
select datediff(day,@time,dateadd(mm,3,@time))
一、肯定某年某月有多少天
實現原理:先利用DATEDIFF取得當前月的第一天,再將月份加一取得下月第一天,而後減去分鐘,再取日期的天數部分,即爲當月最大日期,也即當月天數
CREATE FUNCTION DaysInMonth ( @date datetime ) Returns int
AS
BEGIN
RETURN Day(dateadd(mi,-3,DATEADD(m, DATEDIFF(m,0,@date)+1,0)))
END
調用示例:
select dbo.DaysInMonth ('2006-02-03')
(2)計算哪一天是本週的星期一
SELECT DATEADD(week, DATEDIFF(week,'1900-01-01',getdate()), '1900-01-01') --返回-11-06 00:00:00.000
或
SELECT DATEADD(week, DATEDIFF(week,0,getdate()),0)
(3)當前季度的第一天
SELECT DATEADD(quarter, DATEDIFF(quarter,0,getdate()), 0)—返回-10-01 00:00:00.000
(4)一個季度多少天
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
when @m between 4 and 6 then 4
when @m between 7 and 9 then 7
else 10 end
select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'
select datediff(day,@time,dateadd(mm,3,@time)) —返回
1.按姓氏筆畫排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
2.分頁SQL語句
select * from(select (row_number() OVER (ORDER BY tab.ID Desc)) as rownum,tab.* from 表名As tab) As t where rownum between 起始位置And 結束位置
8.如何修改數據庫的名稱:
sp_renamedb 'old_name', 'new_name'
3.獲取當前數據庫中的全部用戶表
select * from sysobjects where xtype='U' and category=0
4.獲取某一個表的全部字段
select name from syscolumns where id=object_id('表名')
5.查看與某一個表相關的視圖、存儲過程、函數
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'
6.查看當前數據庫中全部存儲過程
select name as 存儲過程名稱from sysobjects where xtype='P'
7.查詢用戶建立的全部數據庫
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
8.查詢某一個表的字段和數據類型
select column_name,data_type from information_schema.columns where table_name = '表名'
9.使用事務
在使用一些對數據庫表的臨時的SQL語句操做時,能夠採用SQL SERVER事務處理,防止對數據操做後發現誤操做問題
開始事務
Begin tran
Insert Into TableName Values(…)
SQL語句操做不正常,則回滾事務。
回滾事務
Rollback tran
SQL語句操做正常,則提交事務,數據提交至數據庫。
提交事務
Commit tran
計算執行SQL語句查詢時間
declare @d datetime
set @d=getdate()
select * from SYS_ColumnProperties select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate()) 函數
【關閉SQL Server 數據庫全部使用鏈接】
use master
go
create proc KillSpByDbName(@dbname varchar(20))
as
begin
declare @sql nvarchar(500),@temp varchar(1000)
declare @spid int
set @sql='declare getspid cursor for
select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
exec (@sql)
open getspid
fetch next from getspid into @spid
while @@fetch_status <>-1
begin
set @temp='kill '+rtrim(@spid)
exec(@temp)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end
--舉例使用,關閉數據庫下的全部鏈接操做
Use master
Exec KillSpByDbName '數據庫名稱'
(一)掛起操做
在安裝Sql或sp補丁的時候系統提示以前有掛起的安裝操做,要求重啓,這裏每每重啓無用,解決辦法:
到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager
刪除PendingFileRenameOperations
(二)收縮數據庫
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收縮數據和日誌
DBCC SHRINKDB
DBCC SHRINKFILE
(三)壓縮數據庫
dbcc shrinkdatabase(dbname)
(四)轉移數據庫給新用戶以已存在用戶權限
exec sp_change_users_login update_one,newname,oldname
go
(五)檢查備份集
RESTORE VERIFYONLY from disk=Evbbs.bak
(六)修復數據庫
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(dvbbs,repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
fetch
and Ip in (SELECT Ip FROM PhoneVcode WHERE Ip='127.0.0.1' GROUP BY Ip having count(Ip)>2)
select top m * from tablename where id not in (select top n id from tablename)
select top m * into 臨時表(或表變量) from tablename order by columnname -- 將top m筆插入
set rowcount n
select * from 表變量order by columnname desc
select top n * from
(select top m * from tablename order by columnname) a
order by columnname desc
複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1 <>1
法二:select top 0 * into b from a
拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’where 條件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
子查詢(表名:a 表名:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
顯示文章、提交人和最後回覆時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
外鏈接查詢(表名:a 表名:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
在線視圖查詢(表名:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值and 數值
in 的使用方法
select * from table1 where a [not] in (‘值’,’值’,’值’,’值’)
兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..
日程安排提早五分鐘提醒
SQL: select * from 日程安排where datediff('minute',f開始時間,getdate())>5
一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段from 表名order by 排序字段desc) a,表名b where b.主鍵字段= a.主鍵字段order by a.排序字段
選擇在每一組b值相同的數據中對應的a最大的記錄的全部信息(相似這樣的用法能夠用於論壇每個月排行榜,每個月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
包括全部在TableA 中但不在TableB和TableC 中的行並消除全部重複行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
隨機取出條數據
select top 10 * from tablename order by newid()
隨機選擇記錄
select newid()
declare @x xml select @x=cast('<A>'+replace(@Ids,',','</A><A>')+'</A>' as xml) begin --插入 INSERT dbo.tb select 111,t.value('.','int'),getdate() from @x.nodes('/A') as x (t)
--float字段保留一位小數,四捨五入
SELECT CONVERT(DECIMAL(18,1),1024.791454) ------- 1024.8 (所影響的行數爲1 行)
<%# Eval("字段")==null?"":Eval("字段").toString("0.0") %>
--事務(進程 ID 77)與另外一個進程被死鎖在 鎖 | 通訊緩衝區 資源上,而且已被選做死鎖犧牲品。請從新運行該事務。 --優先選擇3,2,1 --1.表後面加 with (nolock) --2.會話前面加 update的時候,能select SET TRANSACTION ISOLATION LEVEL Read uncommitted --3.整個數據庫隔離級別改成行版本 ALTER DATABASE SMMM SET SINGLE_USER WITH ROLLBACK IMMEDIATE ALTER DATABASE SMMM SET read_committed_snapshot ON --行版本隔離 ALTER DATABASE SMMM set MULTI_USER
select object_name(id) as 表名, rows as 使用行數, rtrim(8*reserved/1024)+'Mb' as 分配空間, rtrim(8*dpages/1024) as 使用空間, rtrim(8*(reserved-dpages)/1024) as 未使用空間, rtrim(8*dpages/1024-rows/1024*minlen/1024) as 空閒空間 from sysindexes order by rows desc