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


    转载自:http://blog.itpub.net/16436858/viewspace-676265/

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

    一、限制返回的行数

    1、Sql Server

     
    1 SELECT TOP 10 Id,FirstName, LastName
    2 FROM Person

    2、Oracle

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

    3、DB2

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

    4、MySql

     
    1 SELECT Id,FirstName, LastName
    2 FROM Person LIMIT 10

    5、PostgreSQL

     
    1 SELECT Id,FirstName, LastName
    2 FROM Person LIMIT 10

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

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

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

     
    01 SELECT CONVERT(VARCHAR(100), GETDATE(), 0)-- 10 17 2010  4:51PM
    02 SELECT CONVERT(VARCHAR(100), GETDATE(), 1)-- 10/17/10 
    03 SELECT CONVERT(VARCHAR(100), GETDATE(), 2)-- 10.10.17 
    04 SELECT CONVERT(VARCHAR(100), GETDATE(), 3)-- 17/10/10 
    05 SELECT CONVERT(VARCHAR(100), GETDATE(), 4)-- 17.10.10
    06 SELECT CONVERT(VARCHAR(100), GETDATE(), 5)-- 17-10-10 
    07 SELECT CONVERT(VARCHAR(100), GETDATE(), 6)-- 17 10 10 
    08 SELECT CONVERT(VARCHAR(100), GETDATE(), 7)-- 10 17, 10 
    09 SELECT CONVERT(VARCHAR(100), GETDATE(), 8)-- 16:52:13
    10 SELECT CONVERT(VARCHAR(100), GETDATE(), 9)-- 10 17 2010  4:52:13:960PM
    11 SELECT CONVERT(VARCHAR(100), GETDATE(), 10)-- 10-17-10 
    12 SELECT CONVERT(VARCHAR(100), GETDATE(), 11)-- 10/10/17
    13 SELECT CONVERT(VARCHAR(100), GETDATE(), 12)-- 101017
    14 SELECT CONVERT(VARCHAR(100), GETDATE(), 13)-- 17 10 2010 16:53:39:403 
    15 SELECT CONVERT(VARCHAR(100), GETDATE(), 14)-- 16:53:39:403 
    16 SELECT CONVERT(VARCHAR(100), GETDATE(), 20)-- 2010-10-17 16:53:39
    17 SELECT CONVERT(VARCHAR(100), GETDATE(), 21)-- 2010-10-17 16:54:55.100 
    18 SELECT CONVERT(VARCHAR(100), GETDATE(), 22)-- 10/17/10  4:54:55 PM 
    19 SELECT CONVERT(VARCHAR(100), GETDATE(), 24)-- 16:54:55 
    20 SELECT CONVERT(VARCHAR(100), GETDATE(), 25)-- 2010-10-17 16:54:55.100 
    21 SELECT CONVERT(VARCHAR(100), GETDATE(), 100)-- 10 17 2010  4:54PM 
    22 SELECT CONVERT(VARCHAR(100), GETDATE(), 101)-- 10/17/2010
    23 SELECT CONVERT(VARCHAR(100), GETDATE(), 102)-- 2010.10.17 
    24 SELECT CONVERT(VARCHAR(100), GETDATE(), 103)-- 17/10/2010 
    25 SELECT CONVERT(VARCHAR(100), GETDATE(), 104)-- 17.10.2010 
    26 SELECT CONVERT(VARCHAR(100), GETDATE(), 105)-- 17-10-2010 
    27 SELECT CONVERT(VARCHAR(100), GETDATE(), 106)-- 17 10 2010 
    28 SELECT CONVERT(VARCHAR(100), GETDATE(), 107)-- 10 17, 2010 
    29 SELECT CONVERT(VARCHAR(100), GETDATE(), 108)-- 16:56:36 
    30 SELECT CONVERT(VARCHAR(100), GETDATE(), 109)-- 10 17 2010  4:56:36:370PM 
    31 SELECT CONVERT(VARCHAR(100), GETDATE(), 110)-- 10-17-2010
    32 SELECT CONVERT(VARCHAR(100), GETDATE(), 111)-- 2010/10/17 
    33 SELECT CONVERT(VARCHAR(100), GETDATE(), 112)-- 20101017 
    34 SELECT CONVERT(VARCHAR(100), GETDATE(), 113)-- 17 10 2010 16:57:51:713 
    35 SELECT CONVERT(VARCHAR(100), GETDATE(), 114)-- 16:59:19:640
    36 SELECT CONVERT(VARCHAR(100), GETDATE(), 120)-- 2010-10-17 16:59:19
    37 SELECT CONVERT(VARCHAR(100), GETDATE(), 121)-- 2010-10-17 16:59:19.640
    38 SELECT CONVERT(VARCHAR(100), GETDATE(), 126)-- 2010-10-17T16:59:19.640
    39 SELECT CONVERT(VARCHAR(100), GETDATE(), 130)-- 10 ?? ?????? 1431  4:59:19:640PM

    小结:ms真够贴心的,还有哪种格式它没有帮我们实现呢?


    三、从表中随机返回n条记录

    1、Sql Server

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

    2、Oracle

     
    1 SELECT Id, FirstName, LastName FROM(
    2     SELECT Id, FirstName, LastName FROM Person
    3     ORDER BY DBMS_RANDOM.VALUE()
    4 )
    5 WHERE ROWNUM<=10

    3、DB2

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

    4、MySql

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

    5、PostgreSQL

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

    小结:

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

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

    四、将空值转换为实际值

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

     
    1 SELECT TOP 10
    2 Id,
    3 FirstName,
    4 CASE 
    5 WHEN LastName IS NULL THEN ''
    6 ELSE LastName
    7 END AS LastName
    8 FROM
    9 Person (NOLOCK)

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

     
    1 SELECT TOP 10
    2     Id,
    3     FirstName,
    4     COALESCE(LastName,'') AS LastName
    5 FROM
    6     Person (NOLOCK)

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

  • 相关阅读:
    MYSQL router 自动均衡负载
    mysql router 自动failover测试
    Oracle数据库安装时 environment variable path 大于 1023
    windows删除多余启动引导项
    开机显示 invalid partition table
    有关软件的商业模式与软件代码的加密
    .Net 开源控件 NPlot使用小结
    41.关于Intellij IDEA菜单项中Compile、Make和Build的区别
    Maven:mirror和repository 区别
    28. Spring Boot配置方式
  • 原文地址:https://www.cnblogs.com/jameslif/p/5817945.html
Copyright © 2020-2023  润新知