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

简单记录几个有用的sql查询的更多相关文章

  1. 个人工作记录---工作中遇到的sql查询语句解析

    在工作中写了人生的第一个查询语句,虽然是在原有基础上改的,但仍然学到了不少知识 代码: select distinct m.id, (select z.jianc from model_zuzjg z ...

  2. sql查询调优之where条件排序字段以及limit使用索引的奥秘

       奇怪的慢sql 我们先来看2条sql 第一条: select * from acct_trans_log WHERE  acct_id = 1000000000009000757 order b ...

  3. 记一个简单的sql查询

    在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...

  4. SQL查询多条不重复记录值简要解析【转载】

    转载http://hi.baidu.com/my_favourate/item/3716b0cbe125f312505058eb SQL查询多条不重复记录值简要解析2008-02-28 11:36 以 ...

  5. 为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录

    为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录???原因很简单: SELECT * FROM dbo.TableA AS a WHERE a.id NOT IN ( ...

  6. sql 查询某个字段最长的记录

    sql  查询文本字段中值的长度最长的记录 一.函数1.SQL ServerLEN() 函数返回文本字段中值的长度.SELECT LEN(column_name) FROM table_name;2. ...

  7. 使用传入的总记录数实现一条sql语句完成分页查询

    使用传入的总记录数实现一条sql语句完成分页查询     问题:在传统的分页查询的实现中不可避免的需要两条sql语句,一条用于查询数据一条用于查询总记录数.如下面的实际代码所示: Img1 当然如果使 ...

  8. 04、SQL 查询当天,本月,本周的记录

    SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111)   ORDE ...

  9. SQL 查询当天,本月,本周的记录

    SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111)   ORDE ...

随机推荐

  1. springboot 使用mybatis 通用Mapper,pagehelper

    首先需要maven导入需要的包,这里用的是sqlserver,druid,jtds连接数据库 <dependency> <groupId>com.alibaba</gro ...

  2. Weka中数据挖掘与机器学习系列之Weka简介(二)

    不多说,直接上干货! Weka简介 Weka是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis)的英文字首缩写,官方网址为:http://www ...

  3. shell脚本的if判断语句

    if条件判断语句 if (表达式) #if ( Variable in Array ) 语句1 else 语句2 fi 1.测试数字大小 #!/bin/sh NUM=100 if (( $NUM &g ...

  4. 记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法

    今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...

  5. php获取csv数据无乱码

    <?php //获取csv数据    function csvencode($file){        if(!is_file($file['tmp_name'])){            ...

  6. Swift学习笔记(12)--数组和字典的复制

    Swift中,数组Array和字典Dictionary是用结构来实现的,但是数组与字典和其它结构在进行赋值或者作为参数传递给函数的时候有一些不同. 并且数组和字典的这些操作,又与Foundation中 ...

  7. 【Codeforces Round #460 (Div. 2) A】 Supermarket

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 就是让你求m*(ai/bb)的最小值 [代码] #include <bits/stdc++.h> #define dou ...

  8. 【Henu ACM Round #13 B】Spider Man

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现每个环可以操作的次数是固定的. (环的大小-1 也就是说一旦环确定了.其实结果就已经确定了. 则直接看操作总数的奇偶性就可以了 ...

  9. xgboost参数调优的几个地方

    tree ensemble里面最重要就是防止过拟合.  min_child_weight是叶子节点中样本个数乘上二阶导数后的加和,用来控制分裂后叶子节点中的样本个数.样本个数过少,容易过拟合.  su ...

  10. SQL Server 为代码减负之存储过程

        存储过程能够用来提高数据库的查询效率.由于它事先被编译过.被储存于内存中,每次执行前.不必被从新编译,所以效率非常高. 存储过程是一组sql增删改查的集合,假设程序中的一个功能涉及到对数据库的 ...