文章目录
前言
在对MySQL数据库的增、删、改、查操作有一定了解之后,就可以学习一些 SQL 语句的高级使用方法。
SQL语句的熟练使用,在平时的运维工作中可以提供不小的帮助,尤其是在一些规模较小的公司,运维身兼数职,
可能会有不少数据库的相关工作。本章将从不同的方面出发介绍 SQL 语句的高级运用方法。
一、按关键字排序
使用SELECT语句可以将需要的数据从MySQL数据库中查询出来,如果对查询的结果进行排序,该如何去实现呢?
可以使用 ORDER BY 语句来完成排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,
也可以针对多个字段。以下就是MySQL中ORDER BY语句的语法结构。
1.1语法结构
排序的字段可以根据具体需求进行选择,没有限制。排序的关键字可以使用 ASC 或者DESC。ASC 是按照升序进行排序的,
是默认的排序方式,即 ASC 可以省略。SELECT 语句中如果没有指定具体的排序方式,则默认按 ASC 方式进行排序。
DESC 是按降序方式进行排列。
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;
当然 ORDER BY 前面也可以使用 WHERE 子句对查询结果进一步过滤。
例如,执行以下操作可查询等级大于等于 45 级的用户,并按降序进行排序。
create database player;
use player;
create table player (id int(4) not null,name varchar(10) not null,level int(3) not null,primary key (`id`));
insert into player (id,name,level) values ('30','抢宝真多呀',47);
insert into player (id,name,level) values ('15','新五皇·白胡子',46);
insert into player (id,name,level) values ('63','新五皇–敬神',46);
insert into player (id,name,level) values ('199','D 丶狙击王',46);
insert into player (id,name,level) values ('298','唐三',46);
insert into player (id,name,level) values ('51','新五皇·暴雪',45);
insert into player (id,name,level) values ('272','D 丶抢人头辅助',45);
mysql> select id,name,level from player where level>=45 order by level desc;
+-----+----------------------+-------+
| id | name | level |
+-----+----------------------+-------+
| 30 | 抢宝真多呀 | 47 |
| 15 | 新五皇·白胡子 | 46 |
| 63 | 新五皇–敬神 | 46 |
| 199 | D 丶狙击王 | 46 |
| 298 | 唐三 | 46 |
| 51 | 新五皇·暴雪 | 45 |
| 272 | D 丶抢人头辅助 | 45 |
+-----+----------------------+-------+
7 rows in set (0.00 sec)
对于排序要求,多数情况下一个字段就可以实现。其实 ORDER BY 语句也可以使用多个字段来进行排序,
当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按 照第二个字段进行排序。
例如,执行以下操作可查询等级在 45 级及以上的用户,并以 level 降序排列和 id 降序排列。
mysql> select id,name,level from player where level>=45 order by level desc,id desc;
+-----+----------------------+-------+
| id | name | level |
+-----+----------------------+-------+
| 30 | 抢宝真多呀 | 47 |
| 298 | 唐三 | 46 |
| 199 | D 丶狙击王 | 46 |
| 63 | 新五皇–敬神 | 46 |
| 15 | 新五皇·白胡子 | 46 |
| 272 | D 丶抢人头辅助 | 45 |
| 51 | 新五皇·暴雪 | 45 |
+-----+----------------------+-------+
7 rows in set (0.00 sec)
以上结果不难看出order by 后面第一个参数优先级高,level先进行倒叙排序,然后是id进行排序,并且level有一样的值的记录时,id是在level值一样的记录里进行倒叙排列。
order by 使用时要注意
- ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,
- 优先级是按先后顺序而定。下面以A和B分别表示两个字段。
- ##ORDER BY A,B desc 指A用升序,B用降序;##
- ##ORDER BY A asc,B desc 指A用升序,B用降序;##
- ##ORDER BY A desc,B desc 指A用降序,B用降序;##
二、对结果进行分组
通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现。
GROUP BY 从字面上看,是以 BY 后面的内容对查询出的数据进行分组,就是将一个“数据集”
划分成若干个“小区域”,然后针对这些个“小区域”进行数据处理。
GROUP BY通常都是结合聚合函数一起使用的,常用的聚合函数包括:
计数(COUNT)、求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),
这些聚合函数的用法在后面函数小节会有更详细的讲解。GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。
2.1语法结构
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator valueGROUP BY column_name;
GROUP BY除了配合聚合函数一起使用外,还可以引入WHERE子句。首先通过WHERE过滤掉一部分不符合需求的查询结果,
然后再对结果进行分组。如果有排序的需求, 也可以引入ORDER BY语句。例如,执行以下操作即可统计等级在 45 级及以上,
以等级为分组,每个等级有多少人。
mysql> select count(name),level from player where level>=45 group by level;
+-------------+-------+
| count(name) | level |
+-------------+-------+
| 2 | 45 |
| 4 | 46 |
| 1 | 47 |
+-------------+-------+
3 rows in set (0.00 sec)
从以上结果可以看出,每个等级的人数已经统计出来了,但是数量是无序的。如果结果条目变得更多,
很难一眼看出哪个等级的人数是最多的,所以需要对数量进行排序。而GROUP BY 结合 ORDER BY
即可实现分组并排序的查询。例如,查询等级在 45 级及以上, 按等级进行分组,并将每个等级的人
数按降序排序,具体操作如下。
mysql