首先,写这个的原因是我其实sql语句不太行,总觉得自己写得很乱,好像也没有系统学习过,借此复习和与大家探讨
No.1 关于查询时间区间是否重叠的sql语句
问题是这样:插入之前,想查询同User是否其他请求时间重叠
表(Id,UserId,FromDate,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; --每页数 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两次,不过查询靠后的数据速度比上一种快点)
declare @page int = 1; --页码 declare @pageSize int = 5; --每页数 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; --每页数 SELECT * FROM Campaign order by Id OFFSET (@page-1)*@pageSize ROWS FETCH NEXT @pageSize ROWS ONLY
No.3 复制表中数据
Insert into table(field1,field2,...) values(value1,value2,...)这种插入经常用到。
但我们也经常有一种情况,将一个表数据的部分字段复制到另一个表中。
两种方式,有所区别:
1)INSERT INTO SELECT语句
(要求目标表Table2必须存在)
INSERT INTO Table2(a,c,d) SELECT a,c,5 from Table1
2)SELECT INTO FROM语句
(要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到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