如何使用SQL系列 之 如何在SQL中使用GROUP BY和ORDER BY

这篇具有很好参考价值的文章主要介绍了如何使用SQL系列 之 如何在SQL中使用GROUP BY和ORDER BY。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

结构化查询语言(SQL)数据库可以跨多个表存储和管理大量数据。对于大型数据集,理解如何排序数据是很重要的,特别是对于分析结果集或为报告或外部通信组织数据。

SQL中有两个常用的用于数据排序的语句:GROUP BYORDER BYGROUP BY语句根据查询中指定的列对数据进行分组,并与聚集函数一起使用。ORDER BY允许您按字母或数字以及升序或降序组织结果集。

在本教程中,你将使用GROUP BYORDER BY语句在SQL中对查询结果进行排序。你还将练习在查询中实现聚合函数和WHERE子句,以便进一步对结果进行排序。

前期准备

为了学习本指南,你需要一台运行某种使用SQL的关系数据库管理系统(RDBMS)的计算机。

注意:请注意,许多RDBMS使用它们自己独特的SQL实现。虽然本教程中概述的命令适用于大多数RDBMS,但如果你在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。

你还需要一个装载了一些示例数据的数据库和表,可以在其中练习使用相关命令。

连接到MySQL并设置一个示例数据库

如果SQL数据库系统运行在远程服务器上,请从本地设备SSH到服务器:

ssh sammy@your_server_ip

然后打开MySQL服务器提示符,将==sammy==替换为你的MySQL用户账户的名称:

mysql -u sammy -p

创建一个名为movieDB的数据库:

CREATE DATABASE movieDB;

如果数据库成功创建,您将收到这样的输出:

OutputQuery OK, 1 row affected (0.01 sec)

要选择movieDB数据库,运行以下USE语句:

USE movieDB;
OutputDatabase changed

选择数据库后,在其中创建一个表。在本教程的示例中,我们将创建一个表,用于存储本地电影院的放映信息。这个表将以下7个字段:

  • theater_id:存储每个剧院的展厅的int数据类型的值,并作为表的主键,这意味着这一列中的每个值都将作为其各自行的唯一标识符。

  • date:使用DATE数据类型来存储电影放映的年、月、日的特定日期。该数据类型遵循以下参数:4位数字表示年份,最多2位数字表示月和日(YYYY-MM-DD)。

  • time:用TIME数据类型以小时、分钟和秒(HH:MM:SS)表示电影的计划放映。

  • movie_name:使用varchar数据类型存储电影的名称,最多40个字符。

  • movie_genre:使用不超过30个字符的varchar数据类型,保存每部电影各自类型的信息。

  • guest_total:显示参加电影放映的总人数,数据类型为int

  • ticket_cost:使用decimal数据类型,精度为4,刻度为1,这意味着这一列的值可以有4位数字,小数点右侧有2位数字。这一列表示特定电影放映的票价。

通过运行下面的CREATE TABLE命令,创建一个名为movie_theater的表,其中包含这些列:

CREATE TABLE movie_theater (
theater_id int, 
date DATE,
time TIME, 
movie_name varchar(40),
movie_genre varchar(30),
guest_total int,
ticket_cost decimal(4,2),
PRIMARY KEY (theater_id)
); 

接下来,向空表中插入一些示例数据:

INSERT INTO movie_theater
(theater_id, date, time, movie_name, movie_genre, guest_total, ticket_cost)
VALUES
(1, '2022-05-27', '10:00:00', 'Top Gun Maverick', 'Action', 131, 18.00),
(2, '2022-05-27', '10:00:00', 'Downton Abbey A New Era', 'Drama', 90, 18.00),
(3, '2022-05-27', '10:00:00', 'Men', 'Horror', 100, 18.00),
(4, '2022-05-27', '10:00:00', 'The Bad Guys', 'Animation', 83, 18.00),
(5, '2022-05-28', '09:00:00', 'Top Gun Maverick', 'Action', 112, 8.00),
(6, '2022-05-28', '09:00:00', 'Downton Abbey A New Era', 'Drama', 137, 8.00),
(7, '2022-05-28', '09:00:00', 'Men', 'Horror', 25, 8.00),
(8, '2022-05-28', '09:00:00', 'The Bad Guys', 'Animation', 142, 8.00),
(9, '2022-05-28', '05:00:00', 'Top Gun Maverick', 'Action', 150, 13.00),
(10, '2022-05-28', '05:00:00', 'Downton Abbey A New Era', 'Drama', 118, 13.00),
(11, '2022-05-28', '05:00:00', 'Men', 'Horror', 88, 13.00),
(12, '2022-05-28', '05:00:00', 'The Bad Guys', 'Animation', 130, 13.00);
OutputQuery OK, 12 rows affected (0.00 sec)
Records: 12  Duplicates: 0  Warnings: 0

插入数据后,就可以开始在SQL中对查询结果进行排序了。

如何使用GROUP BY

GROUP BY语句的功能是将具有共享值的记录分组。在查询中,GROUP BY语句总是与聚合函数一起使用。您可能还记得,一个聚合函数总结信息,并返回一个结果。例如,你可以查询一列的总数或总和,这将在结果中产生一个值。使用GROUP BY子句,你可以实现聚合函数,为每个你想要的组获得一个结果值。

GROUP BY对于返回多个按指定组排序的期望结果很有用,而不是只按一列排序。此外,如果你选择使用FROM语句和WHERE子句,GROUP BY必须始终位于它们之后。下面是一个使用GROUP BY和聚合函数的查询结构的示例:

SELECT column_1, AGGREGATE_FUNCTION(column_2) FROM table GROUP BY column_1;

为了说明如何使用GROUP BY语句,假设你正在领导几部电影的发行活动,并且你想评估营销工作的成功。你让当地的一家剧院分享他们在周五和周六从客人那里收集的数据。首先通过运行SELECT*符号来查看数据,以选择movie_theater表中的所有列:

SELECT * FROM movie_theater;
Output+------------+------------+----------+-------------------------+-------------+-------------+-------------+
| theater_id | date       | time     | movie_name              | movie_genre | guest_total | ticket_cost |
+------------+------------+----------+-------------------------+-------------+-------------+-------------+
|          1 | 2022-05-27 | 10:00:00 | Top Gun Maverick        | Action      |         131 |       18.00 |
|          2 | 2022-05-27 | 10:00:00 | Downton Abbey A New Era | Drama       |          90 |       18.00 |
|          3 | 2022-05-27 | 10:00:00 | Men                     | Horror      |         100 |       18.00 |
|          4 | 2022-05-27 | 10:00:00 | The Bad Guys            | Animation   |          83 |       18.00 |
|          5 | 2022-05-28 | 09:00:00 | Top Gun Maverick        | Action      |         112 |        8.00 |
|          6 | 2022-05-28 | 09:00:00 | Downton Abbey A New Era | Drama       |         137 |        8.00 |
|          7 | 2022-05-28 | 09:00:00 | Men                     | Horror      |          25 |        8.00 |
|          8 | 2022-05-28 | 09:00:00 | The Bad Guys            | Animation   |         142 |        8.00 |
|          9 | 2022-05-28 | 05:00:00 | Top Gun Maverick        | Action      |         150 |       13.00 |
|         10 | 2022-05-28 | 05:00:00 | Downton Abbey A New Era | Drama       |         118 |       13.00 |
|         11 | 2022-05-28 | 05:00:00 | Men                     | Horror      |          88 |       13.00 |
|         12 | 2022-05-28 | 05:00:00 | The Bad Guys            | Animation   |         130 |       13.00 |
+------------+------------+----------+-------------------------+-------------+-------------+-------------+
12 rows in set (0.00 sec)

虽然这些数据很有用,但您希望对某些特定列进行更深入的评估并排序结果。

因为你工作在几个不同类型的电影,你有兴趣知道他们被电影观众好评。具体来说,你想知道观看每种类型电影的平均人数。使用SELECTmovie_genre列中检索各种类型的电影。然后对guest_total列应用聚合函数AVG,使用ASaverage列创建一个别名,并包含GROUP BY语句以movie_genre对结果进行分组。按这种方式分组可以得到每种电影类型的平均结果:

SELECT movie_genre, AVG(guest_total) AS average
FROM movie_theater 
GROUP BY movie_genre;
Output+-------------+----------+
| movie_genre | average  |
+-------------+----------+
| Action      | 131.0000 |
| Drama       | 115.0000 |
| Horror      |  71.0000 |
| Animation   | 118.3333 |
+-------------+----------+
4 rows in set (0.00 sec)

这个输出提供了movie_genre组中每种电影类型的四个平均值。根据这些信息,Action的平均每场观众人数最多。

接下来,假设你想要测量影院在两天内的收入。下面的查询从date列返回值,以及由SUM聚合函数返回的值。具体来说,聚合函数SUM将一个数学方程放在括号中,使用*操作符将总客人数量乘以一张票的成本,表示为:SUM(guest_total * ticket_cost)。该查询包含AS子句,为聚合函数返回的列提供别名total_revenue。然后使用GROUP BY语句完成查询,根据date列对查询结果进行分组:

SELECT date, SUM(guest_total * ticket_cost) 
AS total_revenue 
FROM movie_theater 
GROUP BY date;
Output+------------+---------------+
| date       | total_revenue |
+------------+---------------+
| 2022-05-27 |       7272.00 |
| 2022-05-28 |       9646.00 |
+------------+---------------+
2 rows in set (0.00 sec)

因为你使用了GROUP BYdate列进行分组,所以输出的结果是每天的总票房收入,在本例中是5月27日星期五7,272元,5月28日星期六9,646元。

现在假设你想关注并分析一部电影:《坏家伙》。在这种情况下,你想弄清楚时间和价格点如何影响一个家庭观看动画电影的选择。对于这个查询,使用聚合函数MAX来获取最大的ticket_cost,确保包含AS来为price_data列创建别名。然后,使用WHERE子句将结果通过movie_name缩小到只有“the Bad Guys”,并使用and使用比较操作符 >来根据guest_total数字大于100来确定最受欢迎的电影次数。然后用GROUP BY语句完成查询,并按time分组:

SELECT time, MAX(ticket_cost) AS price_data 
FROM movie_theater
WHERE movie_name = "The Bad Guys" 
AND guest_total > 100
GROUP BY time;
Output+----------+------------+
| time     | price_data |
+----------+------------+
| 09:00:00 |       8.00 |
| 05:00:00 |      13.00 |
+----------+------------+
2 rows in set (0.00 sec)

根据这个输出,更多的客人在上午9点的早场时间去看《The Bad Guys》,这是一个更实惠的价格点,每张票8美元。然而,这些结果也显示,看电影的客人在下午5点时支付了更高的票价,为13美元,这表明家庭更喜欢在当天不会太晚的时间看电影,并且会为电影票支付更多的钱。与晚上10点的《The Bad Guys》相比,这似乎是一个公平的评价,当时只有83名观众,每张票的价格是18美元。这可以为电影院经理提供有用的信息,证明开放更多的日场和傍晚场次可以增加家庭的上座率,这些家庭正在根据首选的时间和价格点进行选择。

请注意,尽管GROUP BY几乎总是与聚合函数一起使用,但也可能有例外,尽管不太可能。然而,如果你想在没有聚合函数的情况下对结果进行分组,你可以使用DISTINCT语句来获得相同的结果。DISTINCT子句通过返回列中的唯一值来删除结果集中的重复项,并且它只能与SELECT语句一起使用。例如,如果你想将所有电影按名字分组,可以使用以下查询:

SELECT DISTINCT movie_name FROM movie_theater;
Output+-------------------------+
| movie_name              |
+-------------------------+
| Top Gun Maverick        |
| Downton Abbey A New Era |
| Men                     |
| The Bad Guys            |
+-------------------------+
4 rows in set (0.00 sec)

在查看表中的所有数据时,你会发现电影名称有重复,因为有多个放映场次。因此,DISTINCT删除了这些重复项,并有效地将唯一的值分组在单列movie_name下。这实际上与下面的查询相同,其中包含一个GROUP BY语句:

SELECT movie_name FROM movie_theater GROUP BY movie_name;

现在你已经练习了在聚合函数中使用GROUP BY,接下来你将学习如何使用ORDER BY语句对查询结果进行排序。

如何使用ORDER BY

ORDER BY语句的功能是根据你在查询中指定的列对结果进行升序或降序排序。根据后面指定的列存储的数据类型,ORDER by 将按字母或数字顺序组织它们。默认情况下,ORDER By 将按升序对结果进行排序;但是,如果你喜欢降序排列,你必须在查询中包含关键字DESC。你也可以将ORDER BY语句和GROUP BY一起使用,但它必须放在后面才能正常工作。与GROUP BY类似,ORDER BY也必须位于FROM语句和WHERE子句之后。ORDER BY的通用语法如下:

SELECT column_1, column_2 FROM table ORDER BY column_1;

让我们继续使用电影院的示例数据,并练习使用ORDER BY对结果进行排序。从下面的查询开始,它从guest_total列中检索值,并用ORDER BY语句组织这些数值:

SELECT guest_total FROM movie_theater 
ORDER BY guest_total;
Output+-------------+
| guest_total |
+-------------+
|          25 |
|          83 |
|          88 |
|          90 |
|         100 |
|         112 |
|         118 |
|         130 |
|         131 |
|         137 |
|         142 |
|         150 |
+-------------+
12 rows in set (0.00 sec)

因为你的查询指定了一个数值列,所以ORDER BY语句按照数值和升序排列结果,从guest_total列的25开始。

如果你想按降序对列进行排序,可以在查询语句的末尾添加DESC关键字。此外,如果你想根据movie_name下的字符值对数据进行排序,可以在查询中指定。让我们使用ORDER BY来执行这种类型的查询,以将movie_name列的字符值降序排列。通过包含一个WHERE子句来从time列中检索在10:00 pm放映的电影数据,从而进一步排序结果:

SELECT movie_name FROM movie_theater
WHERE time = '10:00:00' 
ORDER BY movie_name DESC;
Output+-------------------------+
| movie_name              |
+-------------------------+
| Top Gun Maverick        |
| The Bad Guys            |
| Men                     |
| Downton Abbey A New Era |
+-------------------------+
4 rows in set (0.01 sec)

这个结果集列出了晚上10点放映的四部不同的电影,按字母顺序降序排列,从《Top Gun Maverick》到《Downtown Abbey A New Era》。

对于下一个查询,将ORDER BYGROUP BY语句与聚合函数SUM结合起来,生成每部电影的总收益。但是,假设电影院错算了总人数,并且忘了包括那些预先购买并预定了每场12人的电影票的特殊派对。

在这个查询中使用SUM,通过实现运算符+,然后将12加到guest_total中,来包含每次电影放映的额外12位客人。一定要附上这个括号。然后,用运算符“*”乘以ticket_cost,并通过最后的圆括号完成数学方程。添加AS子句为名为total_revenue的新列创建别名。然后,使用GROUP BY来根据从movie_name列检索到的数据对每部电影的total_revenue结果进行分组。最后,使用ORDER BY将新列total_revenue下的结果以升序排列:

SELECT movie_name, SUM((guest_total + 12) * ticket_cost) 
AS total_revenue
FROM movie_theater 
GROUP BY movie_name 
ORDER BY total_revenue;
Output+-------------------------+---------------+
| movie_name              | total_revenue |
+-------------------------+---------------+
| Men                     |       3612.00 |
| Downton Abbey A New Era |       4718.00 |
| The Bad Guys            |       4788.00 |
| Top Gun Maverick        |       5672.00 |
+-------------------------+---------------+
4 rows in set (0.00 sec)

这个结果集告诉我们每部电影加上额外的12位观众的总票房收入,并将总票房收入从低到高排序。由此我们得知,《Top Gun Maverick》的票房收入最高,而《Men》的票房收入最低。与此同时,《The Bad Guys》和《Downton Abbey A New Era》在总票房上非常接近。

在本节中,你实践了多种实现ORDER BY语句的方法,以及如何指定你喜欢的顺序,例如字符型和数值型数据的升序和降序。你还学习了如何包含WHERE子句以缩小结果范围,并使用聚合函数和数学方程使用GROUP BYORDER BY语句执行查询。

总结

理解如何使用GROUP BYORDER BY语句对于对结果和数据进行排序是很重要的。你是想在一个组下组织多个结果,还是按字母和降序组织其中一列,还是同时进行这两种操作。你还了解了使用WHERE子句进一步排序结果的其他方法。文章来源地址https://www.toymoban.com/news/detail-704042.html

到了这里,关于如何使用SQL系列 之 如何在SQL中使用GROUP BY和ORDER BY的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL优化(3):order by优化

    MySQL的排序,有两种方式: Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index : 通过有序索引顺序扫描直接返回有序数据,这种情况即为 using

    2024年02月01日
    浏览(48)
  • SQL ORDER BY 关键字

    ORDER BY 用于对结果集进行排序。 ORDER BY 用于对结果集按照一个列或者多个列进行排序。 ORDER BY 默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 。 ORDER BY 子句后面的列名指示按哪些列进行排序。如果您指定多个列

    2024年02月16日
    浏览(46)
  • [SQL挖掘机] - ORDER BY语句

    当您想对查询结果进行排序时,可以使用 ORDER BY 子句。ORDER BY 子句允许您按照一个或多个列的值对结果进行排序。 在上述语法中,我们首先指定要选择的列,并在 order by 子句中指定要排序的列。可以同时指定多个列,它们将按照指定的顺序逐个排序。 其中, asc 表示升序排序

    2024年02月15日
    浏览(46)
  • sql的order by 按照自定义的顺序排列

    SQL 的 ORDER BY 子句可以按照自定义的顺序进行排列。 可以使用 CASE 表达式来指定自定义的排序顺序。以下是一个示例: 假设我们有一个表格 students 包含字段 name 和 grade ,我们想按照自定义的顺序对 name 字段进行排序,可以这样写: 使用了 CASE 表达式来为每个名字指定一个数

    2024年02月20日
    浏览(36)
  • MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录

    使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 默认按升序排序。要按降序排序结果,使用 DESC 。 示例按名称按字母顺序排序结果: ORDER BY DESC 使用 DESC 以降序排序结果。 示例按名称以字母逆序排序结果: 您可以使用\\\"DELETE FROM\\\"语句从现有表格中

    2024年02月05日
    浏览(80)
  • [SQL挖掘机] - GROUP BY语句

    group by 是 sql 中用于对结果集进行分组的。通过使用 group by,可以根据一个或多个列的值将结果集中的行分组,并对每个分组应用某种聚合函数(如 count、sum、avg 等)以生成汇总信息。这样可以方便地对数据进行分类、统计和分析。 group by 语句通常与 select 语句结合使

    2024年02月15日
    浏览(60)
  • 6、hive的select(GROUP BY、ORDER BY、CLUSTER BY、SORT BY、LIMIT、union、CTE)、join使用详解及示例

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月11日
    浏览(54)
  • mysql GROUP BY 怎么 order by 排序

    在 MySQL 中使用 GROUP BY 子句时,如果需要对结果进行排序,可以使用 ORDER BY 子句来对分组后的结果进行排序。 ORDER BY 子句应该放在 GROUP BY 子句之后,使用逗号来分隔需要排序的列,并在排序列后指定排序顺序。例如: 在这个例子中,SELECT 语句选择了表 table1 中的列 column1 和

    2024年02月16日
    浏览(57)
  • SQL group by、where和having语句用法

    SQL 语句中的 GROUP BY 子句用于将具有相同值的行分组在一起,通常与聚合函数(如 COUNT、SUM、AVG 等)一起使用。WHERE 子句用于筛选符合条件的行。HAVING 子句则在分组后对分组结果进行进一步筛选。 以下是一个使用 SQL 语句中的 GROUP BY、WHERE 和 HAVING 子句的示例: 在这个示例中

    2024年02月07日
    浏览(59)
  • SQL 报错 sql_mode=only_full_group_by 问题

    SQL 报错 sql_mode=only_full_group_by 问题 原因分析 一、原理层面 这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题: mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了\\\"SQL92标准\\\"。 很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql

    2024年02月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包