大纲

1、函数

2、文本处理函数

3、数值计算函数

4、日期处理函数

5、聚集函数


1、函数

    函数好用,但是不通用:

MySQL入门-8:函数_第1张图片

函数大致可以分为以下类型:

  • 用于处理文本串

  • 用于处理日期和时间

  • 用于数值计算

  • 返回DBMS系统信息


如何知道函数怎么使用?

1、查看官方文档:http://dev.mysql.com/doc/refman/5.1/zh/index.html

2、mysql> help functions;

然后,根据自己的需要,查看具体的函数类别。


MySQL中使用函数时,函数名和左括号之间不能有空格。ERROR 1305 (42000)

Bug #61795  已经修复, Version> 5.1.41-3


2、文本处理函数

    文本处理函数可以很方便的帮助我们进行一些处理。比如大小写转换(UPPER, LOWER),去除空格(TRIM, RTRIM, LTRIM),以及取出串的一部分或者填充等等。

    SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。

mysql> SELECT cust_name 
       FROM customers
       WHERE SOUNDEX(cust_name) = SOUNDEX('Y. lie');


    在前面的学习过程,我们提到:默认情况下,MySQL在进行文本比较的时候,是不区分大小写的。这取决于MySQL的设置。我们如何避免这种情况呢? 在比较的时候,同时转为大写或小写即可,保持统一。

WHERE UPPER(name) = UPPER('skypeGNU');


3、数值计算函数

    数值处理函数仅处理数值数据。这些函数一般主要用于代数、三角函数或几何运算,因此没有串或日期时间处理函数的使用那么频繁。


4、日期处理函数(日期也存储为字符串格式)

    日期和时间采用相应的数据类型和特殊的格式存储,以便能快速和有效的排序或过滤,并且节省物理存储空间。日期和时间函数在MySQL具有很重要的作用。

    日期和时间类型有DATETIME, DATE, TIME,TIMESTAMP, YEAR。每一个类型都有一个合法值范围。注意MySQL允许存储某个“不严格的”的日期值,例如 1999-11-31,原因是我们认为日期的合法性检查应该是应用程序的责任,而不是数据库服务器。为了效率,MySQL仅检查月份在0-12,天在0-31的范围即认为是合法的。下面看一个各个日期类型:

MySQL入门-8:函数_第2张图片

Date:
A date. The supported range is '1000-01-01' to '9999-12-31'. MySQL displays DATE values in 'YYYY-MM-DD' format, but allows you to assign values to DATE columns using either strings

or numbers.

      由于DATE类型只存储日期信息,所以如果添加的数据中包含时间信息,该时间信息将会自动被截断。如果想要保存时间信息,可以考虑使用DATETIME类型。

    对DATE类型的字段进行填充:

# 按字符串
INSERT INTO time_tbl(test_date) VALUES('2014-11-30');
# 按数字
INSERT INTO time_tbl(test_date) VALUES(20141130);


DateTime

A date and time combination. The supported range is '1000-01-01 00:00:00 ' to '9999-12-31 23:59:59'. MySQL displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format, but allows you to assign values to DATETIME columns using either strings or numbers.
允许以字符串和数字进行提交。

# 按字符串
INSERT INTO time_tbl(test_datetime) VALUES('2014-11-30 21:02:13');
# 按数字
INSERT INTO time_tbl(test_datetime) VALUES(20141130210213);

TimeStamp

A timestamp. The range is '1970-01-01 00:00:00' to partway through the     year 2037. A TIMESTAMP column is useful for recording the date and time of an IN    SERT or UPDATE operation. The first TIMESTAMP column in a table is automatically     set to the date and time of the most recent operation if you don't assign it a     value yourself. You can also set any TIMESTAMP column to the current date and time by assigning it a NULL value.


TIMESTAMP类型有一个特性:默认情况下,TIMESTAMP列会自动以当前时间(CURRENT_TIMESTAMP)填充。向其提交NULL值也会使该列以当前时间戳录入。

根据上面给出的表格,我们可以很容易的选择哪种类型。但是TIMESTAMP和DATETIME有什么不同呢?

  • timestamp比datetime类型所需的存储空间更小,只需4个字节,而datetime需要8个字节

  • timestamp支持表示的日期时间范围比timedate小,很容易超过这个范围

  • timestamp受时区,mysql版本和服务器SQL MODE的影响

所以,建议使用 datetime 类型


    首先需要注意的是MySQL使用的日期格式。无论你什么时候指定一个日期。不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为格式yyyy-mm-dd。虽然其他的日期格式可能也行,但这是首选的日期格式,因为它排除了多义性。应该总是使用4位数字的年份,他们更可靠,因为MySQL不必做出任何假定。

SELECT cust_id, order_num
FROM orders
WHERE order_date = '2005-09-01';

其实,在内部日期和时间也是存储为字符串。所以可以按照字符串比较的方式进行。

但是,使用WHERE order_date = '2005-09-01';可靠吗?datetime这种类型存储日期和时间值,但是我们仅给出了日期值。怎么办?

    解决办法是指示MySQL仅将给出的日期与列中的日期部分进行比较,而不是将给出的日期与整个列值进行比较。

SELECT cust_id, order_num
FROM orders
WHERE DATE(order_date) = '2005-09-01';   # DATE()

最佳实践:如果要的是日期,请使用DATE()。如果只想要时间,应该使用TIME()函数。


如果想检索出2005年9月,下的所有订单,怎么办?

SELECT cust_id, order_num
FROM orders
WHERE DATE(order_date) BETWEEN '2005-09-01' AND '2005-09-30';

另外还有一种方法(一种不需要记住每个月中有多少天或不需要操心闰2月的办法)

SELECT cust_id, order_num
FROM orders
WHERE YEAR(order_date) = 2005 AND MONTH(order_date) = 9;

强烈推荐这种方法。


下面来几个实例:

# 查询当天的数据
WHERE DATE(时间字段) = DATE(now())

# 查询N天内的记录
WHERE TO_DAYS(now()) - TO_DAYS(时间字段) <= N

# 查询一周
WHERE DATE(DATE_SUB(CURDATE(), INTERVAL 7 DAY)) <= DATE(column_time)

# 查询一个月
WHERE DATE(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) <= DATE(column_time)



5、聚集函数

    函数分为单行函数和多行函数。对于单行函数,一个输入对应一个输出。对于多行函数,多个输入对应一个输出。

MySQL入门-8:函数_第3张图片

    聚集函数 - 运行在行组上,计算和只返回单行记录的函数。

  • 确定表中行数(或者满足某个条件或包含某个特定值的行数)

  • 获得表中行组的和

  • 找出表列(或所有行或某些特定行)的最大值、最小值、平均值


聚集函数(aggregate function) 运行在多个行组上,计算和返回单个值的函数。

    想象一下,如果MySQL没有提供这些函数,比如想求平均值怎么办? 首先会把所有的数据查询出来,然后进行遍历,相加,然后才能求平均值。是不是效率相当低下?

    聚集函数对表中的数据(而不是实际数据本身)汇总。它们是高效设计的,它们返回结果一般比在客户机应用程序计算要快的多。

MySQL入门-8:函数_第4张图片

COUNT() 函数有2种使用方式:

  • 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是NULL还是非NULL的值。

  • 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值的行。

上述列出的函数,对于NULL值的行,除了COUNT(*),其他聚集函数都是忽略NULL值的行。


在多个列上进行计算

    利用标准的 算术操作符(+ - * /),所有聚集函数都可以用来执行多个列上的计算。

# 比如
SUM(item_price * quantity)


聚集不同值

以上5个聚集函数都可以如下使用:

  • 对所有的行执行计算,指定ALL参数或不给参数

  • 如果想只包含不同的值,指定DISTINCT参数。

ALL为默认。如果不指定DISTINCT, 则假定为ALL。

mysql> SELECT AVG(DISTINCT prod_price) avg_price

    如果指定列名,则DISTINCT只能用于COUNT(column)。DISTINCT不能用于COUNT(*),否则错误。

类似的,DISTINCT必须使用列名,不能用于计算或表达式。

想想下面这种情况

SELECT prod_price, MAX(prod_price) FROM products;

最好不要做,因为多行函数仅会返回一行。所以最终的结果以MAX的基准,只返回一行而已。