MySQL基础笔记四、计算字段与函数
10.创建计算字段
10.1计算字段
字段(field) 基本上与列( column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句
内创建的。
重要的是要注意到,只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户机(如应用程序)的角度来看,计算字段的数据是以与其他列的数据相同的方式返回的。
10.2拼接字段
拼接(concatenate) 将值联结到一起构成单个值。
返回供应商名和位置
Concat()拼接串,即把多个串连接起来形成一一个较长的串。
Concat()需要一个或多个指定的串,各个串之间用逗号分隔。
上面的SELECT语句连接以下4个元素:
- 存储在vend_ name列中的名字;
- 包含一个左圆括号的串;
- 存储在vend_ country列中的国家;
- 包含一个右圆括号的串。
从上述输出中可以看到,SELECT语句返回包含上述4个元素的单个列(计算字段)。
MySQL的不同之处 多数DBMS使用+或||来实现拼接,MySQL则使用Concat()函数来实现。当把SQL语句转换成MySQL语句时一定要把这个区别铭记在心。
Trim函数 MySQL除 了支持RTrim() (正如刚才所见,它去掉串右边的空格),还支持LTrim() (去掉串左边的空格)以及Trim() (去掉串左右两边的空格)。
使用别名
别名(alias)是一个字段或值的替换名。别名用AS关键字赋予。
别名还有其他用途。常见的用途包括在实际的表列名包含不符合规定的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它,等等。
导出列 别名有时也称为导出列( derived column),不管称为什么,它们所代表的都是相同的东西。
10.3 执行算术计算
检索订单后20005中的所有物品,及总价格

11.使用数据处理函数
11.1函数
函数没有SQL的可移植性强
11.2使用函数
大多数SQL实现支持以下类型的函数。
- 用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
- 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
- 用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
- 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。
11.2.1文本处理函数



SOUNDEX是一一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。虽然SOUNDEX不是SQL概念,但MySQL (就像多数DBMS一样) 都提供对SOUNDEX的支持。
在这个例子中,WHERE子句使用Soundex()函数来转换cust_contact列值和搜索串为它们的SOUNDEX值。因为Y.Lee和Y. Lie发音相似,所以它们的SOUNDEX值匹配,因此WHERE子句正确地过滤出了所需的数据。
11.2.2 日期和时间处理函数

日期首选格式yyyy-mm-dd。支持2位数的年份,但4位数年份更可靠。
检索订单记录的order_date为2005-09-01的信息
如果要的是日期,请使用Date()
检索2005年9月下的所有订单

11.2.3数值处理函数

12.汇总数据
12.1聚集函数
聚集函数(aggregate function) 运行在行组上,计算和返回单个值的数。
12.1.1 AVG()函数
AVG()通过对表中行数计数并计算特定列值之和,求得该列的平均值。AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。
返回products表中所有产品的平均价格
返回vend_id为1003的产品的平均值
只用于单个列
忽略值为NULL的行
12.1.2 COUNT()函数
COUNT( )函数进行计数。可利用COUNT( )确定表中行的数目或符合特定条件的行的数目。
COUNT()函数有两种使用方式。
- 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
- 使用COUNT (column)对特定列中具有值的行进行计数,忽略NULL值
返回customers表中客户的总数:
对具有电子邮箱地址的客户计数
NULL值 如果指定列名,则指定列的值为空的行被COUNT()函数忽略,但如果COUNT()函数中用的是星号(*), 则不忽略。
12.1.3 MAX()函数
MAX()返回指定列中最大的值。要求指定列名
返回products表中最贵的物品的价格
对非数值数据使用MAX() 虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。
NULL值 MAX() 函数忽略列值为NULL的行。
12.1.4 MIN()函数
MIN()返回指定列中最小的值。要求指定列名
返回products表中最便宜的物品的价格
对非数值数据使用MIN() MIN() 函数与MAX()函数类似,MySQL允许将它用来返回任意列中的最小值,包括返回文本列中的最小值。在用于文本数据时,如果数据按相应的列排序,则MIN( )返回最前面的行。
NULL值 MIN()函数忽略列值为NULL的行。
12.1.5 SUM()函数
SUM()用来返回指定列值的和
检索order_name为20005所订购物品的总数
检索order_name为20005所订购物品总的订单金额
NULL值 SUM(函数忽略列值为NULL的行。
12.2聚集不同值
以上5个聚集函数都可以如下使用:
- 对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为);
- 只包含不同的值,指定DISTINCT参数。
ALL为默认 ALL参数不需要指定, 因为它是默认行为。如果不指定DISTINCT,则假定为ALL。
只考虑不同价格的平均值
如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*),因此不允许使用COUNT (DISTINCT),否则会产生错误。类似地,DISTINCT必须使用列名,不能用于计算或表达式。
虽然DISTINCT从技术上可用于MIN( )和MAX(),但这样做实际上没有价值。一个列中的最小值和最大值不管是否包含不同值都是相同的。
12.3组合聚集函数

取别名 在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名。虽然这样做并非不合法,但使用唯一的名字会使你的SQL更易于理解和使用(以及将来容易排除故障)。