10. 使用数据处理函数
10.1 文本处理函数
一些常见的文本处理函数。例如left(),right(),length(),locate(),lower(),upper(),ltrim(),rtrim(),substring()等等
mysql> select t_name,upper(t_name) as name_uppercase
-> from test;
+--------+----------------+
| t_name | name_uppercase |
+--------+----------------+
| Tom | TOM |
| Jerry | JERRY |
| Helen | HELEN |
| Halen | HALEN |
| Bob | BOB |
+--------+----------------+
5 rows in set (0.13 sec)
10.2 时间和日期处理函数
常用的日期和时间处理函数如下:
AddDate()---------------------增加一个日期(天、周等)
AddTime()--------------------增加一个时间(时、分等)
CurDate()--------------------返回当前日期
CurTime()--------------------返回当前时间
Date()-------------------------返回日期时间的日期部分
DateDiff()--------------------计算两个日期之差
Year(),Month(),Day(),Hour(),Minute(),Second()(年月日时分秒)
Now()返回当前时间和日期
DayOfWeek()对应一个日期,返回对应的星期几
mysql> select dayofweek(now());
+------------------+
| dayofweek(now()) |
+------------------+
| 5 |
+------------------+
1 row in set (0.08 sec)
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2019-04-25 |
+------------+
1 row in set (0.00 sec)
mysql> select * from test;
+------+---------+------------------------------------+---------------------+
| t_id | t_name | t_text | t_time |
+------+---------+------------------------------------+---------------------+
| 5 | Tom | This is a cat | 2019-04-25 16:13:39 |
| 4 | Jerry | This is a mouse | 2019-04-25 15:40:55 |
| 6 | Helen | She is a student in middle school. | 2019-04-25 16:13:39 |
| 1 | Halen | NULL | 2019-04-25 16:17:21 |
| 3 | Bob | NULL | 2019-04-25 16:17:21 |
| 7 | Erdison | NULL | 2019-05-04 00:00:00 |
+------+---------+------------------------------------+---------------------+
6 rows in set (0.00 sec)
mysql> select t_name,t_time from test
-> where date(t_time) between '2019-04-25' and '2019-05-04';
+---------+---------------------+
| t_name | t_time |
+---------+---------------------+
| Tom | 2019-04-25 16:13:39 |
| Jerry | 2019-04-25 15:40:55 |
| Helen | 2019-04-25 16:13:39 |
| Halen | 2019-04-25 16:17:21 |
| Bob | 2019-04-25 16:17:21 |
| Erdison | 2019-05-04 00:00:00 |
+---------+---------------------+
6 rows in set (0.10 sec)
10.3 数值处理函数
常用的数值处理函数有Abs(),Cos(),Exp(),Mod(),Pi(),Rand(),Sin(),Sqrt(),Tan()等,较为简单,例子,略。
11. 汇总数据
11.1 聚集函数
AVG(),COUNT(),MAX(),MIN(),SUM()分别对某列进行操作
其中COUNT(*)与COUNT(column)分别表示对表中的行进行计数,不管是否是NULL值。而后者忽略NULL值,针对非NULL值进行计数。
mysql> select * from test;
+------+---------+------------------------------------+---------------------+
| t_id | t_name | t_text | t_time |
+------+---------+------------------------------------+---------------------+
| 5 | Tom | This is a cat | 2019-04-25 16:13:39 |
| 4 | Jerry | This is a mouse | 2019-04-25 15:40:55 |
| 6 | Helen | She is a student in middle school. | 2019-04-25 16:13:39 |
| 1 | Halen | NULL | 2019-04-25 16:17:21 |
| 3 | Bob | NULL | 2019-04-25 16:17:21 |
| 7 | Erdison | NULL | 2019-05-04 00:00:00 |
+------+---------+------------------------------------+---------------------+
6 rows in set (0.00 sec)
mysql> select avg(t_id) as avg_id,
-> count(*) as all_column,
-> count(t_text) as part_column,
-> max(t_id) as max_id,
-> sum(t_id) as sum_id from test;
+--------+------------+-------------+--------+--------+
| avg_id | all_column | part_column | max_id | sum_id |
+--------+------------+-------------+--------+--------+
| 4.3333 | 6 | 3 | 7 | 26 |
+--------+------------+-------------+--------+--------+
1 row in set (0.02 sec)
11.2 聚集不同值函数
这时需要用到关键词distinct来标注,此时聚集函数只处理数据不同的行,默认是all。
mysql> update test
-> set t_name='Helen'
-> where t_id in(1,3);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from test;
+------+---------+------------------------------------+---------------------
| t_id | t_name | t_text | t_time
+------+---------+------------------------------------+---------------------
| 5 | Tom | This is a cat | 2019-04-25 16:13:39
| 4 | Jerry | This is a mouse | 2019-04-25 15:40:55
| 6 | Helen | She is a student in middle school. | 2019-04-25 16:13:39
| 1 | Helen | NULL | 2019-04-25 16:17:21
| 3 | Helen | NULL | 2019-04-25 16:17:21
| 7 | Erdison | NULL | 2019-05-04 00:00:00
+------+---------+------------------------------------+---------------------
6 rows in set (0.00 sec)
mysql> select count(distinct t_name) from test;
+------------------------+
| count(distinct t_name) |
+------------------------+
| 4 |
+------------------------+
1 row in set (0.07 sec)
12. 分组数据
12.1 创建分组
与聚集值的函数不同,聚集函数将整体作为操作数,而分组采用group by关键词来对每个组来进行操作。
mysql> select * from test;
+------+---------+------------------------------------+---------------------+
| t_id | t_name | t_text | t_time |
+------+---------+------------------------------------+---------------------+
| 5 | Tom | This is a cat | 2019-04-25 16:13:39 |
| 4 | Jerry | This is a mouse | 2019-04-25 15:40:55 |
| 6 | Helen | She is a student in middle school. | 2019-04-25 16:13:39 |
| 1 | Helen | NULL | 2019-04-25 16:17:21 |
| 3 | Helen | NULL | 2019-04-25 16:17:21 |
| 7 | Erdison | NULL | 2019-05-04 00:00:00 |
+------+---------+------------------------------------+---------------------+
6 rows in set (0.07 sec)
mysql> select t_name,count(*) as t_namegrp
-> from test
-> group by t_name;
+---------+-----------+
| t_name | t_namegrp |
+---------+-----------+
| Erdison | 1 |
| Helen | 3 |
| Jerry | 1 |
| Tom | 1 |
+---------+-----------+
4 rows in set (0.09 sec)
12.2 过滤分组
过滤分组,我们可以采用having 关键词来进行过滤掉满足条件的组聚集
mysql> select t_name,count(*) as t_namegrp
-> from test
-> group by t_name
-> having t_namegrp>1;
+--------+-----------+
| t_name | t_namegrp |
+--------+-----------+
| Helen | 3 |
+--------+-----------+
1 row in set (0.00 sec)
12.3 分组和排序
mysql> select t_name,count(*) as t_namegrp
-> from test
-> where length(t_name)>3
-> group by t_name
-> having t_namegrp>0
-> order by t_namegrp
-> limit 0,3;
+---------+-----------+
| t_name | t_namegrp |
+---------+-----------+
| Jerry | 1 |
| Erdison | 1 |
| Helen | 3 |
+---------+-----------+
3 rows in set (0.00 sec)
此例子也给出了相应的语句的先后顺序。
13. 使用子查询
13.1 利用子查询进行过滤
顾名思义就是查询里嵌套查询
mysql> select * from _test;
+------+--------+---------------------+
| t_id | _name | _time |
+------+--------+---------------------+
| 2 | Linda | 2019-04-02 12:00:00 |
| 3 | Lucy | 2019-05-01 00:00:00 |
| 4 | Tomson | 0196-04-23 00:00:00 |
+------+--------+---------------------+
3 rows in set (0.00 sec)
mysql> select * from test;
+------+---------+------------------------------------+---------------------+
| t_id | t_name | t_text | t_time |
+------+---------+------------------------------------+---------------------+
| 5 | Tom | This is a cat | 2019-04-25 16:13:39 |
| 4 | Jerry | This is a mouse | 2019-04-25 15:40:55 |
| 6 | Helen | She is a student in middle school. | 2019-04-25 16:13:39 |
| 1 | Helen | NULL | 2019-04-25 16:17:21 |
| 3 | Helen | NULL | 2019-04-25 16:17:21 |
| 7 | Erdison | NULL | 2019-05-04 00:00:00 |
| 8 | Linda | NULL | 2019-04-02 12:00:00 |
| 9 | Lucy | NULL | 2019-05-01 00:00:00 |
| 10 | Tomson | NULL | 0196-04-23 00:00:00 |
+------+---------+------------------------------------+---------------------+
9 rows in set (0.00 sec)
mysql> select t_name from test
-> where t_id in(
-> select t_id from _test
-> where t_text is null);
+--------+
| t_name |
+--------+
| Helen |
+--------+
1 row in set (0.06 sec)
mysql> select t_name from test
-> where t_id in(
-> select t_id from _test
-> where date(_time) between '0196-04-23' and '2019-05-01');
+--------+
| t_name |
+--------+
| Helen |
| Jerry |
+--------+
2 rows in set (0.00 sec)
13.2 作为计算字段使用子查询
mysql> select t_id,t_name,(select count(*) from _test
-> where _test.t_id=test.t_id) as same_id
-> from test order by t_id;
+------+---------+---------+
| t_id | t_name | same_id |
+------+---------+---------+
| 1 | Helen | 0 |
| 3 | Helen | 1 |
| 4 | Jerry | 1 |
| 5 | Tom | 0 |
| 6 | Helen | 0 |
| 7 | Erdison | 0 |
| 8 | Linda | 0 |
| 9 | Lucy | 0 |
| 10 | Tomson | 0 |
+------+---------+---------+
9 rows in set (0.00 sec)