大纲
1、函数
2、文本处理函数
3、数值计算函数
4、日期处理函数
5、聚集函数
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的范围即认为是合法的。下面看一个各个日期类型:
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、聚集函数
函数分为单行函数和多行函数。对于单行函数,一个输入对应一个输出。对于多行函数,多个输入对应一个输出。
聚集函数 - 运行在行组上,计算和只返回单行记录的函数。
确定表中行数(或者满足某个条件或包含某个特定值的行数)
获得表中行组的和
找出表列(或所有行或某些特定行)的最大值、最小值、平均值
聚集函数(aggregate function) 运行在多个行组上,计算和返回单个值的函数。
想象一下,如果MySQL没有提供这些函数,比如想求平均值怎么办? 首先会把所有的数据查询出来,然后进行遍历,相加,然后才能求平均值。是不是效率相当低下?
聚集函数对表中的数据(而不是实际数据本身)汇总。它们是高效设计的,它们返回结果一般比在客户机应用程序计算要快的多。
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的基准,只返回一行而已。