SqlServer常用语句

首先,写这个的原因是我其实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

你可能感兴趣的:(SqlServer常用语句)