【MySQL进阶之路丨第十篇】一文带你精通MySQL排序、分组、连接

本文详细介绍了MySQL中的排序、分组和连接操作。通过示例展示了如何使用ORDER BY进行排序,使用GROUP BY进行分组以及如何利用JOIN子句进行多表查询,包括INNER JOIN、LEFT JOIN和RIGHT JOIN。这些内容有助于提升对MySQL数据库的掌握。

引言

在这里插入图片描述

在上一篇中我们介绍了MySQL子句;在开发中,掌握数据的排序、分组、连接等操作和语句是十分重要的。
这一篇我们使用命令行方式来帮助读者掌握MySQL中数据的排序、分组与连接。

上一篇链接:MySQL | 一文带你精通MySQL子句


MySQL排序

MySQL中可以使用ORDER BY语句对查询结果进行排序。ORDER BY语句按照指定的列或表达式对结果进行排序,可以按升序(默认)或降序排列。

模板如下:

SELECT column1, column2, ...
FROM table
ORDER BY {{column}} {{order}};

将需要排序的列名替换为{{column}},并将排序顺序(ASC或DESC)替换为{{order}}

MySQL中可以使用ORDER BY语句对查询结果进行排序。ORDER BY语句按照指定的列或表达式对结果进行排序,可以按升序(默认)或降序排列。

以下是一些常见的排序示例:

1.按单个列排序:

SELECT column1, column2, ...
FROM table
ORDER BY column1 ASC; -- 按升序排序

或:

SELECT column1, column2, ...
FROM table
ORDER BY column1 DESC; -- 按降序排序

2.按多个列排序:

SELECT column1, column2, ...
FROM table
ORDER BY column1 ASC, column2 DESC; -- 先按column1升序排序,再按column2降序排序

3.对计算列或表达式进行排序:

SELECT column1, column2, expression AS alias
FROM table
ORDER BY alias ASC; -- 按计算列或表达式的升序排序

举个例子,目前存在users表如图所示:

在这里插入图片描述

我们会发现,username一列十分的杂乱,于是我们尝试将其按字母升序排列

语句如下:

SELECT username
FROM users
ORDER BY username ASC; 

从结果中可以看到,username列已经被升序排列了

在这里插入图片描述

那么如果我对username列进行升序,对password列进行降序,又会怎么样呢?

SELECT username,password
FROM users
ORDER BY username ASC,password DESC;

通过下面的回显我们会发现,sql语句的升序功能实现了,但降序功能并没有实现,这是因为username与password是一一对应的关系,如果用户名的升序功能实现,密码的降序功能也实现,那么就会使原始数据顺序被打乱,造成a的密码不再是a的密码了

在这里插入图片描述


MySQL分组

GROUP BY 语句根据一个或多个列对结果集进行分组,进而执行聚合操作。在分组的列上我们可以使用聚合函数。

一些常见的聚合函数包括:

  • COUNT():计算每个分组中的行数。
  • SUM():计算每个分组中某一列的总和。
  • AVG():计算每个分组中某一列的平均值。
  • MAX():找出每个分组中某一列的最大值。
  • MIN():找出每个分组中某一列的最小值。

分组基本语法如下:

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

举个例子,现有一个职工表employees:

在这里插入图片描述

我们按照department列对employees表进行分组。然后,我们计算了每个部门中的员工数量(使用COUNT(*)),以及平均工资(使用AVG(salary)

SELECT department, COUNT(*) as count, AVG(salary) as avg_salary
FROM employees
GROUP BY department;

结果如下所示:

在这里插入图片描述


MySQL连接

在前几篇中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。

接下来将向大家介绍如何在两个或多个表中查询数据。

在MySQL中,我们可以使用多种方法进行多表查询,如使用JOIN子句、子查询、UNION操作等。下面介绍一些常用的多表查询方法。

1.使用JOIN子句:JOIN子句用于根据两个或多个表之间的关联关系将它们连接起来。常见的JOIN类型有INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。

SELECT *
FROM table1
JOIN table2 ON table1.column = table2.column;

在这个示例中,我们使用INNER JOIN将table1和table2两个表连接在一起,并使用ON子句指定它们之间的关联条件。

2.使用子查询:你可以在查询语句中嵌套子查询,将一个查询的结果作为另一个查询的源数据。

SELECT column1, column2
FROM table1
WHERE column1 IN (SELECT column3 FROM table2);

在这个示例中,我们使用子查询将table2中的column3作为过滤条件,仅返回table1中与之关联的记录。

3.使用UNION操作:UNION操作用于将两个或多个查询的结果合并成一个结果集。

SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

在这个示例中,我们将table1和table2的查询结果合并为一个结果集,并且确保两个查询的列数和列类型相同。

本文中重点学习JOIN子句

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

简单来说就是两个集合取交集的意思。

在这里插入图片描述

语法如下:

SELECT1.1,1.2, ...,2.1,2.2, ...
FROM1
INNER JOIN2
ON1.=2.;
  • LEFT JOIN(左连接): 获取左表所有记录,即使右表没有对应匹配的记录。

简单来说就是:

在这里插入图片描述

语法如下:

SELECT1.1,1.2, ...,2.1,2.2, ...
FROM1
LEFT JOIN2
ON1.=2.;
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

简单来说就是:

在这里插入图片描述

语法如下:

SELECT1.1,1.2, ...,2.1,2.2, ...
FROM1
LEFT JOIN2
ON1.=2.;

举个例子:

先有两个表,分别如下所示

在这里插入图片描述

在这里插入图片描述

接下来我们就使用MySQL的INNER JOIN来连接以上两张表,从而读取1—tbl表中所有author字段在2—tbl表对应的count字段值:

SELECT a.author, b.count FROM 1—tbl a INNER JOIN 2—tbl b ON a.author = b.author;

相当于

SELECT a.author, b.count FROM 1—tbl a, 2—tbl b WHERE a.author = b.author;

结果如下所示:

在这里插入图片描述

使用LEFT JOIN如下:

SELECT a.author, b.count FROM 1—tbl a LEFT JOIN 2—tbl b ON a.author = b.author;

相当于:

SELECT a.author, b.count
FROM 1—tbl a, 2—tbl b
WHERE a.author = b.author OR b.author IS NULL;

回显如下:

在这里插入图片描述

可以看到,语句返回了1—tbl中的bbb

使用RIGHT JOIN也是一样的:

SELECT a.author, b.count FROM 1—tbl a RIGHT JOIN 2—tbl b ON a.author = b.author;

相当于:

SELECT a.author, b.count
FROM 1—tbl a, 2—tbl b
WHERE a.author = b.author OR a.author IS NULL;

由于2—tbl中并没有另外的author,因此这个语句返回的数据与INNER JOIN相同:

在这里插入图片描述

至此,MySQL多表查询就介绍完了,希望读者躬身实践。


总结

以上为 【MySQL进阶之路丨第十篇】,带领读者掌握 MySQL 排序、分组与连接,通过具体实操实现对MySQL数据库的深度理解。MySQL系列将持续更新,欢迎订阅收藏

在这里插入图片描述

评论 95
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值