1.注意DESC关键字仅适用于在它前面的列名(birth);不影响species列的排序顺序。

  1. SELECT name, species, birth FROM pet ORDER BY species, birth DESC; ---desc只影响birth.先按照species升序列排序,species值相同的再按照birth降序排序

2.日期计算

MySQL提供了几个函数,可以用来计算日期,例如,计算年龄或提取日期部分。

要想确定每个宠物有多大,可以计算当前日期的年和出生日期之间的差。如果当前日期的日历年比出生日期早,则减去一年。以下查询显示了每个宠物的出生日期、当前日期和年龄数值的年数字。

  1. mysql> SELECT name, birth, CURDATE(),
  1.     -> (YEAR(CURDATE())-YEAR(birth))
  1.     -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
  1.     -> AS age
  1.     -> FROM pet;
  1. +----------+------------+------------+------+
  1. | name     | birth      | CURDATE()  | age  |
  1. +----------+------------+------------+------+
  1. | Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
  1. | Claws    | 1994-03-17 | 2003-08-19 |    9 |
  1. | Buffy    | 1989-05-13 | 2003-08-19 |   14 |
  1. | Fang     | 1990-08-27 | 2003-08-19 |   12 |
  1. | Bowser   | 1989-08-31 | 2003-08-19 |   13 |
  1. | Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
  1. | Whistler | 1997-12-09 | 2003-08-19 |    5 |
  1. | Slim     | 1996-04-29 | 2003-08-19 |    7 |
  1. | Puffball | 1999-03-30 | 2003-08-19 |    4 |
  1. +----------+------------+------------+------+

此处,YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (日历年)部分的最右面5个字符。比较MM-DD值的表达式部分的值一般为1或0,如果CURDATE()的年比birth的年早,则年份应减去1。整个表达式有些难懂,使用alias (age)来使输出的列标记更有意义。

尽管查询可行,如果以某个顺序排列行,则能更容易地浏览结果。添加ORDER BY name子句按照名字对输出进行排序则能够实现。

  1. mysql> SELECT name, birth, CURDATE(),
  1.     -> (YEAR(CURDATE())-YEAR(birth))
  1.     -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
  1.    -> AS age
  1.     -> FROM pet ORDER BY name;
  1. +----------+------------+------------+------+
  1. | name     | birth      | CURDATE()  | age  |
  1. +----------+------------+------------+------+
  1. | Bowser   | 1989-08-31 | 2003-08-19 |   13 |
  1. | Buffy    | 1989-05-13 | 2003-08-19 |   14 |
  1. | Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
  1. | Claws    | 1994-03-17 | 2003-08-19 |    9 |
  1. | Fang     | 1990-08-27 | 2003-08-19 |   12 |
  1. | Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
  1. | Puffball | 1999-03-30 | 2003-08-19 |    4 |
  1. | Slim     | 1996-04-29 | 2003-08-19 |    7 |
  1. | Whistler | 1997-12-09 | 2003-08-19 |    5 |
  1. +----------+------------+------------+------+

为了按age而非name排序输出,只要再使用一个ORDER BY子句:

  1. mysql> SELECT name, birth, CURDATE(),
  1.     -> (YEAR(CURDATE())-YEAR(birth))
  1.     -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
  1.     -> AS age
  1.     -> FROM pet ORDER BY age;
  1. +----------+------------+------------+------+
  1. | name     | birth      | CURDATE()  | age  |
  1. +----------+------------+------------+------+
  1. | Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
  1. | Puffball | 1999-03-30 | 2003-08-19 |    4 |
  1. | Whistler | 1997-12-09 | 2003-08-19 |    5 |
  1. | Slim     | 1996-04-29 | 2003-08-19 |    7 |
  1. | Claws    | 1994-03-17 | 2003-08-19 |    9 |
  1. | Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
  1. | Fang     | 1990-08-27 | 2003-08-19 |   12 |
  1. | Bowser   | 1989-08-31 | 2003-08-19 |   13 |
  1. | Buffy    | 1989-05-13 | 2003-08-19 |   14 |
  1. +----------+------------+------------+------+

可以使用一个类似的查询来确定已经死亡动物的死亡年龄。你通过检查death值是否是NULL来确定是哪些动物,然后,对于那些非NULL值的动物,需要计算出death和birth值之间的差:

  1. mysql> SELECT name, birth, death,
  1.     -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))
  1.     -> AS age
  1.     -> FROM pet WHERE death IS NOT NULL ORDER BY age;
  1. +--------+------------+------------+------+
  1. | name   | birth      | death      | age  |
  1. +--------+------------+------------+------+
  1. | Bowser | 1989-08-31 | 1995-07-29 |    5 |
  1. +--------+------------+------------+------+

查询使用death IS NOT NULL而非death != NULL,因为NULL是特殊的值,不能使用普通比较符来比较,以后会给出解释。参见3.3.4.6节,“NULL值操作

如果你想要知道哪个动物下个月过生日,怎么办?对于这类计算,年和天是无关的,你只需要提取birth列的月份部分。MySQL提供几个日期部分的提取函数,例如YEAR( )、MONTH( )和DAYOFMONTH( )。在这里MONTH()是适合的函数。为了看它怎样工作,运行一个简单的查询,显示birth和MONTH(birth)的值:

  1. mysql> SELECT name, birth, MONTH(birth) FROM pet;
  1. +----------+------------+--------------+
  1. | name     | birth      | MONTH(birth) |
  1. +----------+------------+--------------+
  1. | Fluffy   | 1993-02-04 |            2 |
  1. | Claws    | 1994-03-17 |            3 |
  1. | Buffy    | 1989-05-13 |            5 |
  1. | Fang     | 1990-08-27 |            8 |
  1. | Bowser   | 1989-08-31 |            8 |
  1. | Chirpy   | 1998-09-11 |            9 |
  1. | Whistler | 1997-12-09 |           12 |
  1. | Slim     | 1996-04-29 |            4 |
  1. | Puffball | 1999-03-30 |            3 |
  1. +----------+------------+--------------+

找出下个月生日的动物也是容易的。假定当前月是4月,那么月值是4,你可以找在5月出生的动物 (5月),方法是:

  1. mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
  1. +-------+------------+
  1. | name  | birth      |
  1. +-------+------------+
  1. | Buffy | 1989-05-13 |
  1. +-------+------------+

如果当前月份是12月,就有点复杂了。你不能只把1加到月份数(12)上并寻找在13月出生的动物,因为没有这样的月份。相反,你应寻找在1月出生的动物(1月) 。

你甚至可以编写查询,不管当前月份是什么它都能工作。采用这种方法不必在查询中使用一个特定的月份,DATE_ADD( )允许在一个给定的日期上加上时间间隔。如果在NOW( )值上加上一个月,然后用MONTH()提取月份,结果产生生日所在月份:

  1. mysql> SELECT name, birth FROM pet
  1.     -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));

完成该任务的另一个方法是加1以得出当前月份的下一个月(在使用取模函数(MOD)后,如果月份当前值是12,则“回滚”到值0):

  1. mysql> SELECT name, birth FROM pet
  1.     -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

注意,MONTH返回在1和12之间的一个数字,且MOD(something,12)返回在0和11之间的一个数字,因此必须在MOD( )以后加1,否则我们将从11月( 11 )跳到1月(1)。

  1.  

mysql中sql查询使用注意的更多相关文章

  1. 探究MySQL中SQL查询的成本

    成本 什么是成本,即SQL进行查询的花费的时间成本,包含IO成本和CPU成本. IO成本:即将数据页从硬盘中读取到内存中的读取时间成本.通常1页就是1.0的成本. CPU成本:即是读取和检测是否满足条 ...

  2. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  3. 【原创】7. MYSQL++中的查询结果获取(各种Result类型)

    在本节中,我将首先介绍MYSQL++中的查询的几个简单例子用法,然后看一下mysqlpp::Query中的几个与查询相关的方法原型(重点关注返回值),最后对几个关键类型进行解释. 1. MYSQL++ ...

  4. mysql中如何查询最近24小时、top n查询

    MySQL中如何查询最近24小时. where visittime >= NOW() - interval 1 hour; 昨天. where visittime between CURDATE ...

  5. Mysql中分页查询两个方法比较

    mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1;   SELECT a FROM ...

  6. mysql 中合并查询结果union用法 or、in与union all 的查询效率

    mysql 中合并查询结果union用法 or.in与union all 的查询效率 (2016-05-09 11:18:23) 转载▼ 标签: mysql union or in 分类: mysql ...

  7. 【面经】面试官:如何以最高的效率从MySQL中随机查询一条记录?

    写在前面 MySQL数据库在互联网行业使用的比较多,有些小伙伴可能会认为MySQL数据库比较小,存储不了很多的数据.其实,这些小伙伴是真的不了解MySQL.MySQL的小不是说使用MySQL存储的数据 ...

  8. 深入MySQL(四):MySQL的SQL查询语句性能优化概述

    关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...

  9. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

随机推荐

  1. centos 7 安装TensorFlow

    查看linux版本 uname -a 查看磁盘大小 准备好python 2.7 查看python版本  import sysprint sys.version print sys.version_in ...

  2. MySQL official tutorial

    1.installation 2.setup environment variables add %/MySQL Server/bin to path. then restart cmd/powers ...

  3. eclipse---->自己常用的快捷键

    organize imports----> ctrl+shift+o  导入其他工程的类(在学习springboot的注解@EnableAutoConfiguration时用到) 关闭当前窗口的 ...

  4. tornado web

    tornado web frame: 非阻塞服务器,速度快,运用epoll 模板语言+render(),实现根据用户输入,自动渲染页面的动态效果. 在使用模板前需要在setting中设置模板路径: s ...

  5. Python核心编程的四大神兽

    http://www.cnblogs.com/ssy3340/p/9747722.html

  6. POJ-2955 Brackets(括号匹配问题)

    题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...

  7. android -------- ConstraintLayout 约束属性(二)

    ConstraintLayout 介绍 (一) ConstraintLayout 最基本的属性控制有以下几个,即 layout_constraintXXX_toYYYOf 格式的属性,即将“View ...

  8. android -------- java虚拟机和Dalvik虚拟机

    java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.Java虚拟机屏蔽了 ...

  9. python模块--pickle&json&shelve

    使用file文件处理时,写入的必须是str ,否则会报错. 例如:要把一个字典写入文件,写入时会报错 ,就算转换成str格式写入,读取的时候也不能按照dict格式读. >>> inf ...

  10. 小程序授权demo

    <button wx:if="{{canIUse}}"   open-type="getUserInfo"  bindgetuserinfo=" ...