# 数据清洗和汇总
## 一、字段
字段用于将不同列的内容进行组合,以满足生产的需要。
### 拼接字段
MySQL使用concat()函数拼接字段。
```mysql
SELECT concat(id,'_',name) FROM customers;
#上面将会把生成id_name列
```
这样生成的表只适用于控制台查询,无法被客户机使用。建议使用别名创建可用于客户机的表。
## 二、别名
`别名`又被称为`导出列`,常用于生成汇总数据和重命名列。SQL使用`AS`创建别名:
```mysql
SELECT id AS customer_id FROM customers;
#创建id列的别名
```
创建别名后,别名将代替原本的列名。
```MySQL
SELECT concat(id,'_',name) as id_and_name FROM customers;
#为拼接的字段创建别名
```
## 三、函数
MySQL函数名不区分大小写。
### 1.去除空格
| 函数 | 用途 |
| :-----: | :--------------: |
| RTrim() | 去除列值右边空格 |
| LTrim() | 去除列值左边空格 |
| Trim() | 去除列值两侧空格 |
该函数可以用来配合通配符使用,以避免因两侧空格导致的不匹配问题。
```MySQL
SELECT address FROM customers WHERE rtrim(address) LIKE "%B";
#索引以B开头的address,忽略列值右边空格
```
### 2.文本处理函数
| 函数 | 用途 |
| :-------: | :---------------: |
| left() | 返回串左边的字符 |
| length() | 返回串长度 |
| locate() | 查询串的一个字串 |
| lower() | 串转换为小写 |
| upper() | 串转换为大写 |
| soundex() | 返回串的soundex值 |
### 1.截取串
```MySQL
SELECT left("hello",3);#从左边截取字符串的前三个字符
SELECT left(name,3) FROM customers;#截取name列值的前三个字符
```
left()同样能够截取数字列
### 2.字符串查找
除了通配符和正则表达式之外,locate函数也提供了字符串查找的功能。
locate(字串,母串);
locate函数返回第一个出现字串的位置,若没有查询到字串,则返回值为0
```MySQL
SELECT name,locate("z",name) FROM customers;
#查询name列中'z'第一次出现的位置
```
locate()同样能够查询数字。
### 3.字符串截取
substring(string,pos=begin(),pos=end());
### 4.模糊音查询
soundex用于查询读音相近的记录:
```MySQL
SELECT name FROM customer WHERE soundex(name)=soundex("Y Lie");
#查询name中读音和"Y Lie"相近的记录
```
### 5.时间函数
| 函数名 | 用途 |
| :-----------: | :----------------------------: |
| AddDate() | 增加一个日期(天、周等) |
| AddTime() | 增加一个时间(时、分等) |
| CurDate() | 返回当前日期 |
| CurTime() | 返回当前时间 |
| Date() | 返回日期时间的日期部分 |
| DateDiff() | 计算两个日期之差 |
| Date_Add() | 高度灵活的日期运算函数 |
| Date_Format() | 返回一个格式化的日期或时间串 |
| Day() | 返回一个日期的天数部分 |
| DayOfWeek() | 对于一个日期,返回对应的星期几 |
| Hour() | 返回一个时间的小时部分 |
| Minute() | 返回一个时间的分钟部分 |
| Month() | 返回一个日期的月份部分 |
| Now() | 返回当前日期和时间 |
| Second() | 返回一个时间的秒部分 |
| Time() | 返回一个日期时间的时间部分 |
| Year() | 返回一个日期的年份部分 |
### 6.数学函数
| 函数 | 用途 |
| :----: | :----------------: |
| Abs() | 返回一个数的绝对值 |
| Cos() | 返回一个角度的余弦 |
| Exp() | 返回一个数的指数值 |
| Mod() | 返回除操作的余数 |
| Pi() | 返回圆周率 |
| Rand() | 返回一个随机数 |
| Sin() | 返回一个角度的正弦 |
| Sqrt() | 返回一个数的平方根 |
| Tan() | 返回一个角度的正切 |
### 7.聚集函数
| 函数 | 用途 |
| :-----: | :--------------: |
| AVG() | 返回某列的平均值 |
| COUNT() | 返回某列的行数 |
| MAX() | 返回某列的最大值 |
| MIN() | 返回某列的最小值 |
| SUM() | 返回某列值之和 |
所有聚集函数包含两个参数:第一个参数默认为ALL,可更改为DISTINC,第二个参数为列名。
## 四、分组
分组主要是为了查询多行的汇总数据。主要依赖于`GROUP`和`HAVING`语句:
```MySQL
SELECT count(*) AS FROM cutomers GROUP BY id HAVING count(*)>=2;
#按id分组,并显示组行>=2的组
```
## 五、数据汇总
使用字段、别名、函数可以方便地建立汇总表:
```MySQL
SELECT AVG(price) AS averagePrice FROM items GROUP BY name;
#按商品名字分组并查询各组price列的平均值
```