你不知道的MySQL高级语句

前言

在对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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值