简单记录几个有用的sql查询
下面示例中,查询的数据表参考这一篇的Person表。
一、限制返回的行数
1、Sql Server
1 2 | SELECT TOP 10 Id,FirstName, LastName FROM Person |
2、Oracle
1 2 3 | SELECT Id,FirstName, LastName FROM Person WHERE ROWNUM<=10 |
3、DB2
1 2 | SELECT Id,FirstName, LastName FROM Person FETCH FIRST 10 ROWS ONLY |
4、MySql
1 2 | SELECT Id,FirstName, LastName FROM Person LIMIT 10 |
5、PostgreSQL
1 2 | SELECT Id,FirstName, LastName FROM Person LIMIT 10 |
小结:查询语句都很基础,MySql和PostgreSQL的写法是相同的,可以看到各个DBMS的sql书写可读性都不错,用户(开发者)使用体验很重要。
二、按特定格式查询日期(Sql Server版)
实际开发中通常都直接查询结果,然后用编程语言进行日期格式输出(如C#、Java等),但是数据库同样也提供了这种转换处理能力,下面整理一下Sql Server的常用时间格式查询和对应输出结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | SELECT CONVERT(VARCHAR(100), GETDATE(), 0)-- 10 17 2010 4:51PM SELECT CONVERT(VARCHAR(100), GETDATE(), 1)-- 10/17/10 SELECT CONVERT(VARCHAR(100), GETDATE(), 2)-- 10.10.17 SELECT CONVERT(VARCHAR(100), GETDATE(), 3)-- 17/10/10 SELECT CONVERT(VARCHAR(100), GETDATE(), 4)-- 17.10.10 SELECT CONVERT(VARCHAR(100), GETDATE(), 5)-- 17-10-10 SELECT CONVERT(VARCHAR(100), GETDATE(), 6)-- 17 10 10 SELECT CONVERT(VARCHAR(100), GETDATE(), 7)-- 10 17, 10 SELECT CONVERT(VARCHAR(100), GETDATE(), 8)-- 16:52:13 SELECT CONVERT(VARCHAR(100), GETDATE(), 9)-- 10 17 2010 4:52:13:960PM SELECT CONVERT(VARCHAR(100), GETDATE(), 10)-- 10-17-10 SELECT CONVERT(VARCHAR(100), GETDATE(), 11)-- 10/10/17 SELECT CONVERT(VARCHAR(100), GETDATE(), 12)-- 101017 SELECT CONVERT(VARCHAR(100), GETDATE(), 13)-- 17 10 2010 16:53:39:403 SELECT CONVERT(VARCHAR(100), GETDATE(), 14)-- 16:53:39:403 SELECT CONVERT(VARCHAR(100), GETDATE(), 20)-- 2010-10-17 16:53:39 SELECT CONVERT(VARCHAR(100), GETDATE(), 21)-- 2010-10-17 16:54:55.100 SELECT CONVERT(VARCHAR(100), GETDATE(), 22)-- 10/17/10 4:54:55 PM SELECT CONVERT(VARCHAR(100), GETDATE(), 23)-- 2010-10-17 SELECT CONVERT(VARCHAR(100), GETDATE(), 24)-- 16:54:55 SELECT CONVERT(VARCHAR(100), GETDATE(), 25)-- 2010-10-17 16:54:55.100 SELECT CONVERT(VARCHAR(100), GETDATE(), 100)-- 10 17 2010 4:54PM SELECT CONVERT(VARCHAR(100), GETDATE(), 101)-- 10/17/2010 SELECT CONVERT(VARCHAR(100), GETDATE(), 102)-- 2010.10.17 SELECT CONVERT(VARCHAR(100), GETDATE(), 103)-- 17/10/2010 SELECT CONVERT(VARCHAR(100), GETDATE(), 104)-- 17.10.2010 SELECT CONVERT(VARCHAR(100), GETDATE(), 105)-- 17-10-2010 SELECT CONVERT(VARCHAR(100), GETDATE(), 106)-- 17 10 2010 SELECT CONVERT(VARCHAR(100), GETDATE(), 107)-- 10 17, 2010 SELECT CONVERT(VARCHAR(100), GETDATE(), 108)-- 16:56:36 SELECT CONVERT(VARCHAR(100), GETDATE(), 109)-- 10 17 2010 4:56:36:370PM SELECT CONVERT(VARCHAR(100), GETDATE(), 110)-- 10-17-2010 SELECT CONVERT(VARCHAR(100), GETDATE(), 111)-- 2010/10/17 SELECT CONVERT(VARCHAR(100), GETDATE(), 112)-- 20101017 SELECT CONVERT(VARCHAR(100), GETDATE(), 113)-- 17 10 2010 16:57:51:713 SELECT CONVERT(VARCHAR(100), GETDATE(), 114)-- 16:59:19:640 SELECT CONVERT(VARCHAR(100), GETDATE(), 120)-- 2010-10-17 16:59:19 SELECT CONVERT(VARCHAR(100), GETDATE(), 121)-- 2010-10-17 16:59:19.640 SELECT CONVERT(VARCHAR(100), GETDATE(), 126)-- 2010-10-17T16:59:19.640 SELECT CONVERT(VARCHAR(100), GETDATE(), 130)-- 10 ?? ?????? 1431 4:59:19:640PM |
小结:ms真够贴心的,还有哪种格式它没有帮我们实现呢?
三、从表中随机返回n条记录
1、Sql Server
1 2 3 | SELECT TOP 10 Id, FirstName, LastName FROM Person (NOLOCK) ORDER BY NEWID() |
2、Oracle
1 2 3 4 5 | SELECT Id, FirstName, LastName FROM( SELECT Id, FirstName, LastName FROM Person ORDER BY DBMS_RANDOM.VALUE() ) WHERE ROWNUM<=10 |
3、DB2
1 2 | SELECT Id, FirstName, LastName FROM Person ORDER BY RAND() FETCH FIRST 10 ROWS ONLY |
4、MySql
1 2 | SELECT Id, FirstName, LastName FROM Person ORDER BY RAND() LIMIT 10 |
5、PostgreSQL
1 2 | SELECT Id, FirstName, LastName FROM Person ORDER BY RANDOM() LIMIT 10 |
小结:
(1)、对比各数据库产品(DBMS)的sql查询书写方式,可以发现它们的相似之处都需要使用ORDER BY 子句对行进行随机排序,而随机函数都使用各自的内置函数。好玩的地方在于,虽然各个DBMS的随机函数有相似或相同的地方,但是没有一个查询是相同的。
(2)、Oracle的查询方式相比其他稍显啰嗦,可读性稍差,但是可以看出它的思路,理解它的实现原理,对开发者是很有益的。
四、将空值转换为实际值
通常情况下,我们通过case when可以实现空值到实际值的转换:
1 2 3 4 5 6 7 8 9 | SELECT TOP 10 Id, FirstName, CASE WHEN LastName IS NULL THEN '' ELSE LastName END AS LastName FROM Person (NOLOCK) |
但是,更简洁的写法是使用COALESCE函数:
1 2 3 4 5 6 | SELECT TOP 10 Id, FirstName, COALESCE(LastName, '' ) AS LastName FROM Person (NOLOCK) |
最后,在开发中写出简洁高效的sql语句一直是我孜孜追求的目标,每次碰到动辄上百乃至上千行的sql语句或者存储过程需要维护就头疼不已,尤其是那些业务逻辑比较复杂的,不知道大家在开发中有没有过这种经历。如何规避复杂的sql语句和存储过程开发易维护的系统,不知道您有什么看法或者好的解决方案?欢迎讨论。
作者:Jeff Wong
出处:http://jeffwongishandsome.cnblogs.com/
本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构