引言
在上一篇中我们介绍了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(内连接,或等值连接):获取两个表中字段匹配关系的记录。
简单来说就是两个集合取交集的意思。
语法如下:
SELECT 表1.列1, 表1.列2, ..., 表2.列1, 表2.列2, ...
FROM 表1
INNER JOIN 表2
ON 表1.列 = 表2.列;
- LEFT JOIN(左连接): 获取左表所有记录,即使右表没有对应匹配的记录。
简单来说就是:
语法如下:
SELECT 表1.列1, 表1.列2, ..., 表2.列1, 表2.列2, ...
FROM 表1
LEFT JOIN 表2
ON 表1.列 = 表2.列;
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
简单来说就是:
语法如下:
SELECT 表1.列1, 表1.列2, ..., 表2.列1, 表2.列2, ...
FROM 表1
LEFT JOIN 表2
ON 表1.列 = 表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系列将持续更新,欢迎订阅收藏。