简单记录几个有用的sql查询

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

下面示例中,查询的数据表参考这一篇的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
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(), 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语句和存储过程开发易维护的系统,不知道您有什么看法或者好的解决方案?欢迎讨论。






本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2010/10/17/1853696.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
2月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
166 1
|
4月前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
4月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
2月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
4月前
|
SQL 人工智能 自然语言处理
OmniSQL:开源文本到SQL神器!自然语言秒转查询到复杂多表连接等SQL需求
OmniSQL是开源的文本到SQL转换模型,通过创新的数据合成框架生成250万条高质量样本,支持7B/14B/32B三种模型版本,能处理从简单查询到复杂多表连接等各种SQL需求。
376 16
OmniSQL:开源文本到SQL神器!自然语言秒转查询到复杂多表连接等SQL需求
|
4月前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
207 35
|
4月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
6月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
408 77
|
5月前
|
SQL 关系型数据库 分布式数据库
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
147 14
|
5月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
129 2