首先,寫這個(gè)的原因是我其實(shí)sql語句不太行,總覺得自己寫得很亂,好像也沒有系統(tǒng)學(xué)習(xí)過,借此復(fù)習(xí)和與大家探討
No.1 關(guān)于查詢時(shí)間區(qū)間是否重疊的sql語句
問題是這樣:插入之前,想查詢同User是否其他請(qǐng)求時(shí)間重疊
表(Id,UserId,F(xiàn)romDate,ToDate,Reason)
select * from Request
where
UserId=@UserId
and
(
FromDate between @fromDate and @toDate
or
ToDate between @fromDate and @toDate
or
@fromDate between FromDate and ToDate
or
@toDate between FromDate and ToDate
);
--select出來有東西就是有記錄與@fromDate和@toDate之間重疊
后來想想有
select * from Request
where
UserId=@UserId
and
(
FromDate > @toDate--在原有時(shí)間段之前
or
ToDate < @fromDate--在原有時(shí)間段之后
)
--搜出來的就是不重疊時(shí)間的記錄
No.2 三種SqlServer分頁查詢語句
1)Top not in(等于查兩次,性能不好)
declare @page int = 1; --頁碼
declare @pagesize int = 5; --每頁數(shù)
SELECT TOP (@pagesize) * FROM Campaign
WHERE Id NOT IN
(
SELECT TOP ((@page-1)*@pagesize) Id FROM Campaign
ORDER BY Id
)
ORDER BY Id
2)ROW_NUMBER() OVER()方式(也是select兩次,不過查詢靠后的數(shù)據(jù)速度比上一種快點(diǎn))
declare @page int = 1; --頁碼
declare @pageSize int = 5; --每頁數(shù)
SELECT * FROM
(SELECT * ,ROW_NUMBER() OVER (ORDER BY Id) AS RowNum FROM Campaign) as T1
WHERE RowNum BETWEEN (@page-1)*@pageSize and @page*@pageSize
3)offset fetch next(速度比上面的快,但sql2012以上才可以用)
declare @page int = 2; --頁碼
declare @pageSize int = 3; --每頁數(shù)
SELECT * FROM Campaign
order by Id
OFFSET (@page-1)*@pageSize ROWS FETCH NEXT @pageSize ROWS ONLY
No.3 復(fù)制表中數(shù)據(jù)
Insert into table(field1,field2,...) values(value1,value2,...)這種插入經(jīng)常用到。
但我們也經(jīng)常有一種情況,將一個(gè)表數(shù)據(jù)的部分字段復(fù)制到另一個(gè)表中。
兩種方式,有所區(qū)別:
1)INSERT INTO SELECT語句
(要求目標(biāo)表Table2必須存在)
INSERT INTO Table2(a,c,d) SELECT a,c,5 from Table1
2)SELECT INTO FROM語句
(要求目標(biāo)表Table2不存在,因?yàn)樵诓迦霑r(shí)會(huì)自動(dòng)創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中)
SELECT a,c into Table2 from Table1
No.4 存在就更新,不存在就插入
用 exists 作為 if 判斷條件,判斷是否查詢出東西 ①有東西則存在,就進(jìn)行更新 ②沒有的話就進(jìn)行插入操作
IF EXISTS(SELECT * FROM table WHERE Id=@Id )
BEGIN
UPDATE XXX
END
ELSE
BEGIN
INSERT XXX
END