文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>简单记录几个有用的sql查询

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

时间:2010-10-17  来源:Jeff Wong

一、限制返回的行数

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 5

5、PostgreSQL

SELECT Id,FirstName, LastName
FROM Person LIMIT 5

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

 

二、按特定格式查询日期(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 5

小结:

(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语句和存储过程开发易维护的系统,不知道您有什么看法或者好的解决方案?欢迎讨论。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载