当前位置: 首页 > news >正文

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

下面示例中,查询的数据表参考这一篇的Person表。

一、限制返回的行数

1、Sql Server

SELECT TOP 10 Id,FirstName, LastName
FROM Person

2、Oracle

SELECT Id,FirstName, LastName
FROM Person
WHERE ROWNUM<=10

3、DB2

SELECT Id,FirstName, LastName
FROM Person FETCH FIRST 10 ROWS ONLY

4、MySql

SELECT Id,FirstName, LastName
FROM Person LIMIT 10

5、PostgreSQL

SELECT Id,FirstName, LastName
FROM Person LIMIT 10

小结:查询语句都很基础,MySql和PostgreSQL的写法是相同的,可以看到各个DBMS的sql书写可读性都不错,用户(开发者)使用体验很重要。

 

二、按特定格式查询日期(Sql Server版)

实际开发中通常都直接查询结果,然后用编程语言进行日期格式输出(如C#、Java等),但是数据库同样也提供了这种转换处理能力,下面整理一下Sql Server的常用时间格式查询和对应输出结果:

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

SELECT TOP 10 Id, FirstName, LastName
FROM Person (NOLOCK)
ORDER BY NEWID()

2、Oracle

SELECT Id, FirstName, LastName FROM(
	SELECT Id, FirstName, LastName FROM Person
	ORDER BY DBMS_RANDOM.VALUE()
)
WHERE ROWNUM<=10

3、DB2

SELECT Id, FirstName, LastName FROM Person
ORDER BY RAND() FETCH  FIRST 10 ROWS ONLY

4、MySql

SELECT Id, FirstName, LastName FROM Person
ORDER BY RAND() LIMIT 10

5、PostgreSQL

SELECT Id, FirstName, LastName FROM Person
ORDER BY RANDOM() LIMIT 10

小结:

(1)、对比各数据库产品(DBMS)的sql查询书写方式,可以发现它们的相似之处都需要使用ORDER BY 子句对行进行随机排序,而随机函数都使用各自的内置函数。好玩的地方在于,虽然各个DBMS的随机函数有相似或相同的地方,但是没有一个查询是相同的。

(2)、Oracle的查询方式相比其他稍显啰嗦,可读性稍差,但是可以看出它的思路,理解它的实现原理,对开发者是很有益的。

 

四、将空值转换为实际值

通常情况下,我们通过case when可以实现空值到实际值的转换:

	SELECT TOP 10
	Id,
	FirstName,
	CASE 
	WHEN LastName IS NULL THEN ''
	ELSE LastName
	END AS LastName
    FROM
	Person (NOLOCK)

但是,更简洁的写法是使用COALESCE函数:

SELECT TOP 10
	Id,
	FirstName,
	COALESCE(LastName,'') AS LastName
FROM
	Person (NOLOCK)

最后,在开发中写出简洁高效的sql语句一直是我孜孜追求的目标,每次碰到动辄上百乃至上千行的sql语句或者存储过程需要维护就头疼不已,尤其是那些业务逻辑比较复杂的,不知道大家在开发中有没有过这种经历。如何规避复杂的sql语句和存储过程开发易维护的系统,不知道您有什么看法或者好的解决方案?欢迎讨论。

相关文章:

  • springboot_database项目介绍
  • 使用window-based模板创建一个单view程序(转)
  • Python初学基础
  • OSPF分解试验部分-LAB10:OSPF外部路由汇总
  • 问题-百度云同步盘登陆时提示155010错误
  • 电脑启动时必须要按F1才能进入系统
  • mongodb 配置单实例与双实例
  • 2017-9-16
  • 10、Windows驱动开发技术详解笔记(6) 基本语法回顾
  • 防止重复提交
  • SQL合并数据
  • jdk1.8新特性
  • RedHat5实现负载均衡(LVS--DR方法实现)
  • python接口自动化测试(八)-unittest-生成测试报告
  • CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用
  • 2017-08-04 前端日报
  • ECS应用管理最佳实践
  • IDEA 插件开发入门教程
  • orm2 中文文档 3.1 模型属性
  • Python利用正则抓取网页内容保存到本地
  • SpriteKit 技巧之添加背景图片
  • 读懂package.json -- 依赖管理
  • 多线程事务回滚
  • 数据仓库的几种建模方法
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​你们这样子,耽误我的工作进度怎么办?
  • #pragma multi_compile #pragma shader_feature
  • #stm32驱动外设模块总结w5500模块
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (五)c52学习之旅-静态数码管
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)3D模板阴影原理
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)利用webkit抓取动态网页和链接
  • ./configure,make,make install的作用(转)
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET分布式缓存Memcached从入门到实战
  • .NET面试题(二)
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [CentOs7]iptables防火墙安装与设置
  • [HackMyVM]靶场Boxing
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [JavaWeb玩耍日记]Maven的安装与使用
  • [LeetCode]--61. Rotate List
  • [lesson17]对象的构造(上)
  • [Linux]进程创建➕进程终止
  • [Machine Learning][Part 7]神经网络的基本组成结构
  • [P3097] [USACO13DEC] [BZOJ4094] 最优挤奶Optimal Milking 解题报告(线段树+DP)