
今天是SELECT语句的第四篇,主要介绍计算字段、数据处理函数的使用。文章摘录自Ben Forta的《MySQL必知必会》。今天的内容同样简单而重要,一起开始今天的学习吧!
01
计算字段:
拼接字段:
SELECT CONCAT(vend_name,'(',vend_country,')') FROM vendors ORDER BY vend_name;

CONCAT()拼接串,即把多个串连接起来形成一个较长的串。CONCAT()需要一个或多个指定的串,各个串之间用逗号分隔。
SELECT CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')') FROM vendors ORDER BY vend_name;

RTRIM()函数去掉值右边的所有空格。通过使用RTRIM(),各个列都进行了整理。MySQL除了支持RTRIM()(去掉串右边的空格),还支持LTRIM()(去掉串左边的空格)以及TRIM()(去掉串左右两边的空格)。
SELECT CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')') AS vend_title FROM vendors ORDER BY vend_name;

SELECT语句本身与以前使用的相同,只不过这里的语句中计算字段之后跟了文本AS vend_title。它指示SQL创建一个包含指定计算的名为vend_title的计算字段。从输出中可以看到,结果与以前的相同,但现在列名为vend_title,任何客户机应用都可以按名引用这个列。就像它是一个实际的表列一样。
执行算数计算:
SELECT prod_id,quantity,item_price FROM orderitems WHERE order_num = 20005;

item_price列包含订单中每项物品的单价。汇总物品价格(单价乘以订购数量):
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems where order_num=20005;

输出中显示的expanded_price列为一个计算字段,此计算为quantity*item_price。客户机应用现在可以使用这个新计算列,就像使用其他列一样。
MySQL支持的基本算术操作符如下。(此外,圆括号可用来区分优先顺序)
| 操作符 | 说明 |
|---|---|
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |

02
函数:
使用函数:
文本处理函数:
SELECT vend_name,UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;

正如所见,UPPER()将文本转换为大写。
一些常用的文本处理函数:
| 函数 | 说明 |
|---|---|
| LEFT() | 返回串左边的字符 |
| LENGTH() | 返回串的长度 |
| LOCATE() | 找出串的一个子串 |
| LOWER() | 将串转换为小写 |
| LTRIM() | 去掉串左边的空格 |
| RIGHT() | 返回串右边的字符 |
| RTRIM() | 去掉串右边的空格 |
| TRIM() | 去掉串左右两边的空格 |
| SOUNDEX() | 返回串的SOUNDEX值 |
| SUBSTRING() | 返回子串的字符 |
| UPPER() | 将串转换为大写 |
SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。虽然SOUNDEX不是SQL概念,但MySQL(就像多数DBMS一样)都提供对SOUNDEX的支持。
举个栗子🌰:
customers表中有一个顾客Coyote Inc.,其联系名为Y. Lee。但如果这是输入错误,此联系名实际应该是Y. Lie,怎么办?

现在试一下使用SOUNDEX()函数进行搜索,它匹配所有发音类似于Y. Lie的联系名:
SELECT cust_name,cust_contact FROM customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Y Lie');

本例中,WHERE子句使用SOUNDEX()函数来转换cust_contact列值和搜索串为它们的SOUNDEX值。因为L. Lee和L. Lie发音相似,所以他们的SOUNDEX值匹配,因为WHERE子句正确地过滤出了所需数据。
日期和时间处理函数:
常用的日期和时间处理函数:
| 函数 | 说明 |
|---|---|
| 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日或2004年5月6日或2006年4月5日...)。
基本的日期比较应该很简单:
SELECT cust_id,order_num FROM orders WHERE order_date='2005-09-01';

SELECT cust_id,order_num FROM orders WHERE DATE(order_date)='2005-09-01';
如果要的仅仅是日期,使用DATE()是一个良好的习惯,即使你知道相应的列只包含日期也是如此。在你只想要时间时应该使用TIME()函数。
检索出2005年9月下的所有订单:
SELECT cust_id,order_num FROM orders WHERE DATE(order_date) BETWEEN '2005-09-01' AND '2005-09-30';

另一种办法:
SELECT cust_id,order_num FROM orders WHERE YEAR(order_date)=2005 AND MONTH(order_date)=9;

数值处理函数:
| 函数 | 说明 |
|---|---|
| ABS() | 返回一个数的绝对值 |
| COS() | 返回一个角度的余弦 |
| EXP() | 返回一个数的指数值 |
| MOD() | 返回除操作的余数 |
| PI() | 返回圆周率 |
| RAND() | 返回一个随机数 |
| SIN() | 返回一个角度的正弦 |
| SQRT() | 返回一个数的平方根 |
| TAN() | 返回一个角度的正切 |
03
今天主要介绍了计算字段以及如何创建计算字段,同时介绍了如何使用数据处理函数。SOUNDEX函数不多见,需要注意。站在巨人肩膀上,每天进步一点点。

end




