首先鸿秆,寫這個的原因是我其實sql語句不太行酌畜,總覺得自己寫得很亂,好像也沒有系統(tǒng)學習過卿叽,借此復習和與大家探討
No.1 關于查詢時間區(qū)間是否重疊的sql語句
問題是這樣:插入之前,想查詢同User是否其他請求時間重疊
表(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--在原有時間段之前
or
ToDate < @fromDate--在原有時間段之后
)
--搜出來的就是不重疊時間的記錄
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ù)速度比上一種快點)
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 復制表中數(shù)據(jù)
Insert into table(field1,field2,...) values(value1,value2,...)這種插入經常用到考杉。
但我們也經常有一種情況策精,將一個表數(shù)據(jù)的部分字段復制到另一個表中。
兩種方式崇棠,有所區(qū)別:
1)INSERT INTO SELECT語句
(要求目標表Table2必須存在)
INSERT INTO Table2(a,c,d) SELECT a,c,5 from Table1
2)SELECT INTO FROM語句
(要求目標表Table2不存在咽袜,因為在插入時會自動創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復制到Table2中)
SELECT a,c into Table2 from Table1
No.4 存在就更新枕稀,不存在就插入
用 exists 作為 if 判斷條件询刹,判斷是否查詢出東西 ①有東西則存在,就進行更新 ②沒有的話就進行插入操作
IF EXISTS(SELECT * FROM table WHERE Id=@Id )
BEGIN
UPDATE XXX
END
ELSE
BEGIN
INSERT XXX
END