一,计算字段
1,什么是计算字段
存储在数据库表中的数据一般不是应用程序所需要的使用格式,需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。
这就是计算字段发挥作用的所在了。
计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句
内创建的。
2,拼接字段
1,简单拼接:
需求:需要以"name (country )"格式获取供应商表单。
解决办法:把两个列拼接起来。在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。
mysql> select concat(vend_name,' (',vend_country,')') from vendors order by vend_name;
+-----------------------------------------+
| concat(vend_name,' (',vend_country,')') |
+-----------------------------------------+
| ACME (USA) |
| Anvils R Us (USA) |
| Furball Inc. (USA) |
| Jet Set (England) |
| Jouets Et Ours (France) |
| LT Supplies (USA) |
+-----------------------------------------+
6 rows in set (0.07 sec)
2,使用别名完善拼接:
SELECT语句拼接地址字段工作得很好,可它只是一个值。如果仅在SQL查询工具中查看一下结果,这样没有什么不好。但是,一个未命名的列不能用于客户机应用中,因为客户机没有办法引用它。
为了解决这个问题, SQL支持列别名。 别名( alias) 是一个字段或值的替换名。别名用AS
关键字赋予。
mysql> select concat(rtrim(vend_name),' (',rtrim(vend_country),')') as vend_title from vendors order by vend_name;
+-------------------------+
| vend_title |
+-------------------------+
| ACME (USA) |
| Anvils R Us (USA) |
| Furball Inc. (USA) |
| Jet Set (England) |
| Jouets Et Ours (France) |
| LT Supplies (USA) |
+-------------------------+
6 rows in set (0.03 sec)
3,执行算术计算
计算字段的另一常见用途是对检索出的数据进行算术计算。
如汇总物品的价格(单价 * 订购数量):
mysql> select prod_id,quantity,item_price from orderitems where order_num = 20005;
+---------+----------+------------+
| prod_id | quantity | item_price |
+---------+----------+------------+
| ANV01 | 10 | 5.99 |
| ANV02 | 3 | 9.99 |
| TNT2 | 5 | 10.00 |
| FB | 1 | 10.00 |
+---------+----------+------------+
4 rows in set (0.03 sec)
mysql> select prod_id,quantity,item_price,quantity * item_price as expanded_price
from orderitems where order_num = 20005; # 计算总价expanded_price
+---------+----------+------------+----------------+
| prod_id | quantity | item_price | expanded_price |
+---------+----------+------------+----------------+
| ANV01 | 10 | 5.99 | 59.90 |
| ANV02 | 3 | 9.99 | 29.97 |
| TNT2 | 5 | 10.00 | 50.00 |
| FB | 1 | 10.00 | 10.00 |
+---------+----------+------------+----------------+
4 rows in set (0.13 sec)
二,使用数据处理函数
1,SQL中的函数
SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。
- 函数没有SQL的可移植性强,如果你决定使用函数,应该保证做好代码注释。
2,使用函数
1,文本处理函数:
- Left() 返回串左边的字符
- Length() 返回串的长度
- Locate() 找出串的一个子串
- Lower() 将串转换为小写
- LTrim() 去掉串左边的空格
- Right() 返回串右边的字符
- RTrim() 去掉串右边的空格
- SubString()返回子串的字符
- Upper() 将串转换为大写
- Soundex() 返回串的SOUNDEX值
使用Soundex()根据读音过滤出正确联系人:
假设出现了一个拼写错误:
mysql> select cust_name,cust_contact from customers where cust_contact = 'Y. Lie'; # 无返回
Empty set
使用Soundex()
mysql> select cust_name,cust_contact from customers where soundex(cust_contact) = soundex('Y. Lie'); # 按发音搜索
+-------------+--------------+
| cust_name | cust_contact |
+-------------+--------------+
| Coyote Inc. | Y Lee |
+-------------+--------------+
1 row in set (0.15 sec)
2,日期和时间处理函数:
日期和时间采用相应的数据类型和特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。
一般,应用程序不使用用来存储日期和时间的格式,因此日期和时间函数总是被用来读取、统计和处理这些值。
- AddDate() 增加一个日期(天、周等)
- AddTime() 增加一个时间(时、分等)
- CurDate() 返回当前日期
- CurTime() 返回当前时间
- Date() 返回日期时间的日期部分
- DateDiff() 计算两个日期之差
- Date_Add()高度灵活的日期运算函数
- Date_Format() 返回一个格式化的日期或时间串
- Day() 返回一个日期的天数部分
- DayOfWeek() 对于一个日期,返回对应的星期几
- Hour() 返回一个时间的小时部分
- Minute() 返回一个时间的分钟部分
- Month() 返回一个日期的月份部分
- Now() 返回当前日期和时间
- Second() 返回一个时间的秒部分
- Time()返回一个日期时间的时间部分
- Year() 返回一个日期的年份部分
在日期格式方面,yyyy-mm-dd是首选的日期格式。因此, 2005年9月1日,给出为2005-09-01:
mysql> select cust_id,order_num from orders where order_date = "2005-09-01";
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
| 10001 | 20005 |
+---------+-----------+
1 row in set (0.03 sec)
关于日期数据的重要补充:
order_date的数据类型为datetime。这种类型存储日期及时间值。样例表中的值全都具有时间值00:00:00,但实际中很可能并不总是这样。比如,存的 order_date 值 为2005-09-01 11:30:05,则WHERE order_date = '2005-09-01’过滤具体日期的数据就会失败。
解决办法是指示MySQL仅将给出的日期与列中的日期部分进行比较,而不是将给出的日期与整个列值进行比较。为此,必须使用Date()函数。Date(order_date)指示MySQL仅提取列的日期部分。
mysql> select cust_id,order_num from orders where date(order_date) = "2005-09-01";
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
| 10001 | 20005 |
+---------+-----------+
1 row in set (0.03 sec)
如果你想检索出2005年9月下的所有订单,简单的相等测试不行,因为它也要匹配月份中的天数。
有几种解决办法:
mysql> select cust_id,order_num from orders where date(order_date) between "2005-09-01" and "2005-09-30";
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
| 10001 | 20005 |
| 10003 | 20006 |
| 10004 | 20007 |
+---------+-----------+
3 rows in set (0.04 sec)
mysql> select cust_id,order_num from orders where year(order_date) = 2005 and month(order_date) = 9;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
| 10001 | 20005 |
| 10003 | 20006 |
| 10004 | 20007 |
+---------+-----------+
3 rows in set (0.03 sec)
关于MySQL中日期类型及处理函数可以参考这篇文章。
3,数值处理函数
数值处理函数仅处理数值数据。这些函数一般主要用于代数、三角或几何运算等。
Abs() 返回一个数的绝对值
Cos() 返回一个角度的余弦
Exp() 返回一个数的指数值
Mod() 返回除操作的余数
Pi() 返回圆周率
Rand() 返回一个随机数
Sin() 返回一个角度的正弦
Sqrt() 返回一个数的平方根
Tan() 返回一个角度的正切