MySQL命令学习笔记(三)

本文详细介绍如何在MySQL中创建计算字段,使用数据处理函数,汇总数据,以及分组数据的方法。涵盖计算字段的创建,如拼接字段和执行算术计算;数据处理函数的应用,包括文本、日期和数值处理;利用聚集函数进行数据汇总;以及通过GROUP BY和HAVING子句进行数据分组和过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、创建计算字段

1.1 计算字段

字段(field) 基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。

1.2 拼接字段

拼接: 将值联接到一起构成单个值。
在mysql的SELECT语句中,可使用Concat()函数来拼接两个列。多数DBMS使用+||来实现拼接,mysql则使用Concat()函数来实现。示例如下:

SELECT Concat(phone, '(', home, ')') FROM table1;

结果如下:
SELECT Concat
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;

结果如下:
upper
下表列出了一些常用的文本处理函数:

函数说明
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要检索的行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值