Mysql| Mysql函数,聚集函数的介绍与使用(Lower,Date,Mod,AVG,...)
2017-11-25 18:25
281 查看
关于MYSQL的函数
函数没有通用的SQL语句的可移植性强 能运行在多个系统上的代码称为可移植的( portable)。相对来说,多数SQL语句是可移植的,在SQL实现之间有差异时,这些差异通常不那么难处理。而函数的可移植性却不强。几乎每种主要的DBMS的实现都支持其他实现不支持的函数,而且有时差异还很大。(也就是说在mysql中可以使用的函数,在其他比如oracle中有可能就不支持使用,函数是没有普通SQL语句的可移植性强.)
函数使用注意事项:
1.关于函数的关键字使用,MySQL是不区分大小写的.
2.低版本的MYSQL可能不支持高版本中部分聚集函数,具体的聚集函数的使用应根据MySQL的版本选择支持的聚集函数使用.
常见函数分类:
1.用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数.
2.用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
3.用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
4.返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。
1.关于文本处理函数
常用的文本处理函数函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转换为大写 |
这里需要特别注意的是MYSQL中别名字段不能有
-,应该使用下划线.
SELECT vend_name,UPPER(vend_name) vend_name_upcase FROM vendors ORDER BY vend_name ASC;
+----------------+------------------+ | vend_name | vend_name_upcase | +----------------+------------------+ | ACME | ACME | | Anvils R Us | ANVILS R US | | Furball Inc. | FURBALL INC. | | Jet Set | JET SET | | Jouets Et Ours | JOUETS ET OURS | | LT Supplies | LT SUPPLIES | +----------------+------------------+
②特别的函数Soundex:
SOUNDEX函数一个将任何文本串转换为描述其语音表示的字母数字模式的算法。 SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。(也就是说Soundex()函数进行搜索,它匹配所有类似的发音文本.)
普通的全文本匹配:
SELECT customers.cust_name,customers.cust_contact FROM customers WHERE cust_contact = 'Y.Lie';
执行没有数据返回.
使用Sounddex函数:
SELECT customers.cust_name,customers.cust_contact FROM customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Y.Lie');
执行结果如下:
+-------------+--------------+ | cust_name | cust_contact | +-------------+--------------+ | Coyote Inc. | Y Lee | +-------------+--------------+
2.日期和时间处理函数
常用日期和时间处理函数函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
首先需要注意的是MySQL使用的日期格式。无论你什么时候指定一个日期,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须包含格式
yyyy-mm-dd.
说明:比如:2005年9月1日,给出为2005-09-01。虽然其他的日期格式可能也行,但这是首选的日期格式,因为它排除了多义性(如,04/05/06是2006年5月4日或2006年4月5日或2004年5月6日或……
对比不使用时间函数和使用使用MySQL的时间函数效果:
orders表结构: +------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | order_num | int(11) | NO | PRI | NULL | auto_increment | | order_date | datetime | NO | | NULL | | | cust_id | int(11) | NO | MUL | NULL | | +------------+----------+------+-----+---------+----------------+ orders表中所有数据: +-----------+---------------------+---------+ | order_num | order_date | cust_id | +-----------+---------------------+---------+ | 20005 | 2005-09-01 00:00:00 | 10001 | | 20006 | 2005-09-12 00:00:00 | 10003 | | 20007 | 2005-09-30 00:00:00 | 10004 | | 20008 | 2005-10-03 00:00:00 | 10005 | | 20009 | 2005-10-08 00:00:00 | 10001 | +-----------+---------------------+---------+
不使用时间函数使用基本语法:(两条语句等价)
SELECT * FROM orders WHERE order_date ='2005-09-01';
SELECT * FROM orders WHERE order_date ='2005-09-01 00:00:00';
这样也就有一个问题,当数据库中的数据不恰好是0点0分0秒时,上面的SQL语句就匹配不到结果.比如修改一下第一条记录为一下上午10点时,上面的SQL语句就不能匹配到结果了.
+-----------+---------------------+---------+ | order_num | order_date | cust_id | +-----------+---------------------+---------+ | 20005 | 2005-09-01 10:00:00 | 10001 | +-----------+---------------------+---------+
为了解决上面说的这个问题,MySQL提供了Date函数来解决这个问题.Date(order_date)指示MySQL仅提取列的日期部分,更可靠的SELECT语句为:
SELECT * FROM orders WHERE DATE(order_date) ='2005-09-01';同样道理对应的函数Time() 只返回一个日期时间的时间部分.其他时间函数用法类似.
关于对日期的其他操作一样了,比如:查询2005年9月份的订单记录(不用单行月份的天数,需要注意的是函数不能加引号)
SELECT * FROM orders WHERE YEAR(order_date) = 2005 AND MONTH(order_date) = 9;
3.数值处理函数
数值函数是最一致最统一的函数,也就是说不同个数据库厂商对着类函数的兼容性最好,这类函数通用性最强.常用数值处理函数
函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |
4.系统函数
省略.聚集函数
聚集函数( aggregate function): 运行在行组上,计算和返回单个值的函数.(与普通的函数最主要的区别聚集函数值返回一条结果,这当然是使用分组语句的情况下)当我们只需要汇总数据而不用把它们实际数据检索出来时,可以使用聚集函数.在只需要返回汇总数据时,返回实际表数据是对时间和处理资源的一种浪费,比如带宽.
(通常都是对数值进行聚集返回一条数据.但是min和max函数除了可以对数值型数据进行计算还支持时间类型和文本类型的计算,具体见相关函数的详情用法.)
SQL聚集函数
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
1.所有的聚集函数在对指定的列进行计算时,会忽略列值为NULL的行.
2.特别的COUNT函数在对所有的列进行计算时允许使用
*, 对行进行计数时,不会忽略一行数据中每个列为null值的行.(聚集函数除了COUNT函数有
COUNT(*)用法,其他的聚集函数没有此用法.)
3.所有聚集函数都可以在多个列上进行计算,利用标准的算术操作符,所有聚集函数都可用来执行多个列上的计算。
(eg: SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;)
聚集函数优缺点:
1.聚集函数用来汇总数据。 MySQL支持一系列聚集函数,可以用多种方法使用它们以返回所需的结果。这些函数是高效设计的,它们返回结果一般比你在自己的客户机应用程序中计算要快得多.
2.聚集函数的可移植性不强,取决于不同的数据库厂商和不同的版本.
①AVG()函数用法:
只用于单个列 AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。关于空值: NULL值 AVG()函数忽略列值为NULL的行。
EG:
SELECT AVG(prod_price) AS avg_price FROM products;
②COUNT()函数用法:
进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。COUNT()函数有两种使用方式:
①使用
COUNT(*)对表中行的数目进行计数, 不管表列中包含的是空值( NULL)还是非空值。 (对行进行计数时,不会忽略一行数据中每个列为null值的行)
②使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
关于空值: column如果指定列名,则指定列的值为空的行被
COUNT()函数忽略,但如果
COUNT()函数中用的是星号
(*),则不忽略。
EG:
SELECT COUNT(*) AS num_cust FROM products;
SELECT COUNT(cust_email) AS num_cust FROM customers;
③MAX()函数用法:
MAX()返回指定列中的最大值.对非数值数据使用MAX() 虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。关于空值: NULL值 MAX()函数忽略列值为NULL的行。
EG:
SELECT MAX(prod_price) AS max_price FROM products;
④MIN()函数用法:
MIN()的功能正好与MAX()功能相反,它返回指定列的最小值。与MAX()一样, MIN()要求指定列名.对非数值数据使用MIN() MIN()函数与MAX()函数类似,MySQL允许将它用来返回任意列中的最小值,包括返回文本列中的最小值。在用于文本数据时,如果数据按相应的列排序,则MIN()返回最前面的行。关于空值: MIN()函数忽略列值为NULL的行
EG:
SELECT MIN(prod_price) AS min_price FROM products;
⑤SUM()函数用法:
SUM()用来返回指定列值的和(总计)。关于空值: NULL值 SUM()函数忽略列值为NULL的行。
EG:
SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;
SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;
聚集不同-用法:
以上5个聚集函数都可以如下使用:(在MYSQL5版本中有小在5以下无效)①对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为);
②只包含不同的值,指定DISTINCT参数。
EG:
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003;
解释: 计算平均值时,去除价格相同的记录(也就是prod_price列值相同的值)后再计算平均值.
组合聚集-用法
EG:SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products;
注意: 聚集函数一般是使用在数值类型列上(类型为int,double…),也就是说这些记录中如果没有设置值,不会存在为null情况,mysql系统会默认值为0.
相关文章推荐
- 与MYSQL 搏斗。介绍MYSQL的一些特性和使用工具。
- MYSQL初学者使用指南与介绍 选择自 onemaster 的 Blog
- [转]MySQL Proxy - MySQL代理的介绍及个人使用经验
- 使用 MySQL Date/Time 类型
- mysql中DATETIME、DATE 和 TIMESTAMP 类型数据使用
- 使用 MySQL Date/Time 类型
- MYSQL初学者使用指南与介绍
- 在Linux下使用MySQL介绍
- mysql中DATETIME、DATE 和 TIMESTAMP 类型数据使用
- WPFToolkit Calendar & DatePicker 使用介绍
- 关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
- 关于Apache mod_rewrite的中文配置、使用和语法介绍
- [转!]MYSQL初学者使用指南与介绍
- MySQL Proxy - MySQL代理的介绍及个人使用经验[转]
- MySQL5.0的三种数据类型:DATETIME, DATE和TIMESTAMP的使用
- Apache mod_rewrite的中文配置、使用和语法介绍
- MYSQL初学者使用指南与介绍
- 关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
- MYSQL初学者使用指南与介绍
- Tomcat6.0使用jdbc连接池连接mysql--操作步骤介绍