SQL高级语法

标签: Sql 分类: 数据库 创建时间:2020-09-11 05:25:38 更新时间:2023-10-20 11:23:26

1.数据抽稀

数据抽稀的思想,就是如果我要查一定时间内的数据,绘制一条曲线,但是由于数据量太多,但是数量变化又不大的情况下,如果能通过抽稀的方式进行数据过滤,那就再好不过了。就像参考文章中说的一样。

参考文章:
1.数据库查询,怎样按一定时间间隔跳跃查询数据? (问题和我的一样)
2.Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介 (从上面参考文章中得到的一个Rank函数)
3.postgis抽稀 (这是使用postgis自带的函数进行图形抽稀的方式)
4.sql 依据时间间隔分组,获取第一条数据

2.时间函数

1
2
3
4
5
6
7
8
9
10
11
-- 时间相加
DATEADD(interval, number, date)

--例如:RecordTime时间,减去一分钟
DATEADD(minute ,-1,RecordTime)

-- 获取时间部分的小时数
DATEPART(HOUR ,RecordTime)

-- 将时间转为字符串,比如2020-09-11 12:00:00,执行112后,转为了20200911,除了112还有很多
select convert(varchar, getdate(), 112)
参考文章:
1.SQL Server DATEADD() Function
2.Date and Time Conversions Using SQL Server (这篇文章中包括了很多的转换方式,主要介绍了convert函数的用法,最后一个参数不同,转换的效果也不同)

3.分组取第一条

1
2
3
4
5
6
-- 按carRecordId,checkType进行分组,然后编号,取编号为1的那一个,partition by后面为分组条件,可以多个分组条件
select temp.* from (
SELECT *,Row_Number() OVER(partition by carRecordId,checkType ORDER BY checkDatetime desc) as rank
FROM InventoryCheck
) temp
where rank = 1
参考文章:
1.SQL Server 分组获取第一条数据 (这篇文章给了实际的入口点)
2.SQL Server - INNER JOIN WITH DISTINCT (这是去重DISTINCT)

4.创建时间和自动更新时间

在Dbeaver中,执行下面的语句

1
2
3
4
5
6
7
8
9
10
--- SQL Server 创建时间 ---
ALTER TABLE 表名 ADD create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP GO


---MySql 创建时间和自动更新字段 ---
ALTER TABLE 表名
ADD (
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
);
参考文章:
1.SQL | 创建时间,更新时间,使用默认值自动设置 (这篇文章非常的有用)
2.怎么在sql server建表时设置时间字段自动生成值 (因为我使用的数据库管理工具是Dbeaver,所以没有相应的设置项)
3.SQL Server自动更新datetimestamp字段 (这里用了触发器实现的自动更新字段)
4.GETDATE (Transact-SQL) (微软官方的GETDATE说明)
5.利用SqlServer触发器自动更新表updatetime字段值 (mysql有自动更新字段,但是sql server没有,可以借助于触发器实现)

5.批量更新

[需求]
比如现在我们要把超市表内的每件商品价格都提高11%,是否有必要为每一行都写一条独立的UPDATE语句呢?就现在的情况而言,也许不会有很多的UPDATE语句要写,但如果是更大的表,这就成问题了。所以回答是否定的。你所要做的只是写一条不指定要更新的行的UPDATE语句

1
update shop set priceprice = price * .11 ; 

[问题]
数据库文件8个G左右,执行批量更新后,出现了问题:
1.出现日志文件过大,导致报错。
2.执行后出现了数据库文件变得异常的大,最后全部占满磁盘大40多个G,最后失败。

这个语句要慎用,慎用,慎用,等我发现过来的时候,感觉已经晚了。

SQL 错误 [9002] [S0004]: 数据库 ‘PhEMS合力PVC’ 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。

6.索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--创建索引
CREATE NONCLUSTERED INDEX 索引名
ON { 表名| 视图名 } ( 列名 [ ASC | DESC ] [ ,...n ] )
INCLUDE (<列名1>, <列名2>, [,… n])

--查看指定表 Student 中的索引
exec sp_helpindex Student

--删除指定表 Student 中名为 Index_StuNo_SName 的索引
drop index Student.Index_StuNo_SName

--检查表 Student 中索引 UQ_S_StuNo 的碎片信息
dbcc showcontig(Student,UQ_S_StuNo)

--整理 Test 数据库中表 Student 的索引 UQ_S_StuNo 的碎片
dbcc indexdefrag(Test,Student,UQ_S_StuNo)

--更新表 Student 中的全部索引的统计信息
update statistics Student
参考文章:
1.SQL Server 创建索引(index) 索引分为聚集索引和非聚集索引,避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。在条件表达式中经常用到的、不同值较多的列上建立索引,在不同值少的列上不要建立索引。在频繁进行排序或分组(即进行 GROUP BY 或 ORDER BY 操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。在选择索引键时,尽可能采用小数据类型的列作为键以使每个索引页能容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必需遍历的索引页面降低到最小,此外,尽可能的使用整数做为键值,因为整数的访问速度最快。

7.取最近一条数据

需求主要就是一系列时间序列的数据,每五秒钟存一条记录,现在需要给定一个时间点,比如 00:00:00 这个时间点,离这个点前或者后面最近的一条数据。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。