函数没有通用的SQL语句的可移植性强 能运行在多个系统上的代码称为可移植的( portable)。相对来说,多数SQL语句是可移植的,在SQL实现之间有差异时,这些差异通常不那么难处理。而函数的可移植性却不强。几乎每种主要的DBMS的实现都支持其他实现不支持的函数,而且有时差异还很大。
(也就是说在mysql中可以使用的函数,在其他比如oracle中有可能就不支持使用,函数是没有普通SQL语句的可移植性强.)
函数使用注意事项:
常见函数分类:
常用的文本处理函数
函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转换为大写 |
①使用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 |
+-------------+--------------+
常用日期和时间处理函数
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
MySQL中关于日期函数的使用:
首先需要注意的是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;
数值函数是最一致最统一的函数,也就是说不同个数据库厂商对着类函数的兼容性最好,这类函数通用性最强.
常用数值处理函数
函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |
省略.
聚集函数( aggregate function): 运行在行组上,计算和返回单个值的函数.(与普通的函数最主要的区别聚集函数值返回一条结果,这当然是使用分组语句的情况下)
当我们只需要汇总数据而不用把它们实际数据检索出来时,可以使用聚集函数.在只需要返回汇总数据时,返回实际表数据是对时间和处理资源的一种浪费,比如带宽.
(通常都是对数值进行聚集返回一条数据.但是min和max函数除了可以对数值型数据进行计算还支持时间类型和文本类型的计算,具体见相关函数的详情用法.)
SQL聚集函数
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
聚集函数注意事项:
*
, 对行进行计数时,不会忽略一行数据中每个列为null值的行.(聚集函数除了COUNT函数有COUNT(*)
用法,其他的聚集函数没有此用法.)(eg: SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;)
聚集函数优缺点:
只用于单个列 AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
关于空值: NULL值 AVG()函数忽略列值为NULL的行。
EG:SELECT AVG(prod_price) AS avg_price FROM products;
进行计数。可利用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()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。
关于空值: NULL值 MAX()函数忽略列值为NULL的行。
EG: SELECT MAX(prod_price) AS max_price FROM products;
MIN()的功能正好与MAX()功能相反,它返回指定列的最小值。与MAX()一样, MIN()要求指定列名.对非数值数据使用MIN() MIN()函数与MAX()函数类似,MySQL允许将它用来返回任意列中的最小值,包括返回文本列中的最小值。在用于文本数据时,如果数据按相应的列排序,则MIN()返回最前面的行。
关于空值: MIN()函数忽略列值为NULL的行
EG:SELECT MIN(prod_price) AS min_price FROM products;
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.