一、创建计算字段
1.1 计算字段
字段(field) 基本上与列(column)
的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
1.2 拼接字段
拼接: 将值联接到一起构成单个值。
在mysql的SELECT
语句中,可使用Concat()
函数来拼接两个列。多数DBMS使用+
或||
来实现拼接,mysql则使用Concat()
函数来实现。示例如下:
SELECT Concat(phone, '(', home, ')') FROM table1;
结果如下:
Concat()
拼接串,即把多个串连接起来形成一个较长的串。当需要连接一个或多个指定的串,各个串之间用逗号分隔。上面的SELECT
语句连接以下4个元素:
- 存储在phone列中的字符串;
- 包含一个空格和一个左圆括号的串;
- 存储在home列中的字符;
- 包含一个右圆括号的串。
若需要删除数据右侧多余的空格来整理数据,可以使用MySQL的RTrim()
函数来完成,如下所示:
SELECT Concat(RTrim(phone), '(', RTrim(home), ')') FROM table1;
RTrim()
函数去掉值右边的所有空格。MySQL除了支持RTrim()
,还支持LTrim()
(去掉串左边的空格)以及Trim()
(去掉串左右两边的空格)。
1.3 执行算术计算
计算字段的另一常见用途是对检索出的数据进行算术计算,例如计算总的销售额:
SELECT name,id,quantity*pric AS total_price FROM table1;
mysql算术操作符:
操作符 | 说明 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
二、使用数据处理函数
2.1 使用函数
大多数SQL实现支持以下类型的函数:
- 用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
- 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
- 用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
- 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。
2.2 文本处理函数
使用Upper()
函数,Upper()
的作用是将文本转换为大写。
SELECT name,id,home, Upper(home) FROM table1;
结果如下:
下表列出了一些常用的文本处理函数:
函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉左边的空格 |
RTrim() | 去掉串右边的空格 |
Right() | 返回串右边的字符 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转换为大写 |
其中SOUNDEX
是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。
2.3 时间和日期处理函数
下表列出了一些常用的时间和日期处理函数:
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayofWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
首先需要注意mysql使用的日期格式。无论什么时候指定一个日期,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为格式yyyy-mm-dd。例如,2019年5月30日,给出为2019-05-30。示例如下:
SELECT name,id,home FROM table1 WHERE Date(order_date) BETWEEN '2019-05-10' AND '2019-05-25';
2.4 数值处理函数
下表列出了一些常用的数值处理函数:
函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |
三、汇总数据
3.1 聚集函数
mysql提供了专门的检索函数,使用这些函数可用于分析和报表生成。这种类型的检索有以下几种:
- 确定表中行数(或者满足某个条件或包含某个特定值的行数)。
- 获得表中行组的和。
- 找出表列(或所有行或某些特定的行)的最大值、最小值和平均值。
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列之和 |
3.1.1 AVG()函数
AVG()
通过对表中行数计数并计算特定列值之和,求得该列的平均值。AVG()
可用来返回所有列的平均值,也可以用来返回特定列或行的平均值,示例如下:
SELECT AVG(price) FROM table1;
只用于单个列 AVG()
只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()
函数。
3.1.2 COUNT()函数
COUNT()
函数进行计数,可利用COUNT()
确定表中行的数目或符合特定条件的行的数目。使用示例如下:
COUNT()
函数有两种使用方式:
- 使用
COUNT(*)
对表中行的数目进行计数, 不管表列中包含的是空值(NULL)还是非空值。 - 使用
COUNT(column)
对特定列中具有值的行进行计数,忽略NULL值。
SELECT COUNT(*) FROM table1;
3.1.3 MAX()函数
MAX()
返回指定列中的最大值, MAX()
必须指定列名,示例如下:
SELECT MAX(price) FROM table1;
3.1.4 MIN()函数
MIN()
返回指定列中的最小值,MIN()
必须指定列名,示例如下:
SELECT MIN(price) FROM table1;
3.1.5 SUM()函数
SUM()
用来返回指定列值的和,SUM()
必须指定列名,如下所示:
SELECT SUM(price) FROM table1;
3.2 聚集不同值
以上5个聚集函数都可以如下使用:
- 对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为)
- 只包含不同的值,指定DISTINCT参数ALL为默认ALL参数不需要指定,因为它是默认行为。如果不指定DISTINCT,则假定为ALL。
SELECT AVG(DISTINCT price) AS avg_price FROM table1;
注意 如果指定列名,则DISTINCT
只能用于COUNT()
。DISTINCT
不能用于COUNT(*)
,因此不允许使用COUNT(DISTINCT)
,否则会产生错误。类似地,DISTINCT
必须使用列名,不能用于计算或表达式。
将DISTINCT
用于MIN()
和MAX()
,虽然DISTINCT
从技术上可用于MIN()
和MAX()
,但这样做实际上没有意义。一个列中的最小值和最大值不管是否包含不同值都是相同的。
四、分组数据
4.1 创建分组
分组是在SELECT
语句的GROUP BY
子句中建立的。GROUP BY
子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。在使用GROUP BY
子句前,需要知道一些的规定:
GROUP BY
子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。- 如果在
GROUP BY
子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。 GROUP BY
子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT
中使用表达式,则必须在GROUP BY
子句中指定相同的表达式。不能使用别名。- 除聚集计算语句外,
SELECT
语句中的每个列都必须在GROUP BY
子句中给出。 - 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
GROUP BY
子句必须出现在WHERE
子句之后,ORDER BY
子句之前。
4.2 过滤分组
MySQL为此目的提供了另外的子句——HAVING
子句。HAVING
非常类似于WHERE
。事实上,目前为止所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。
HAVING和WHERE的差别: 这里有另一种理解方法,WHERE
在数据分组前进行过滤,HAVING
在数据分组后进行过滤。这是一个重要的区别,WHERE
排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING
子句中基于这些值过滤掉的分组。
4.3 SELECT子句顺序
SELECT子句及其顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从行中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 是 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出的排序顺序 | 否 |
LIMIT | 要检索的行 | 否 |