引言
結(jié)構(gòu)化查詢語言(SQL)數(shù)據(jù)庫可以跨多個表存儲和管理大量數(shù)據(jù)。對于大型數(shù)據(jù)集,理解如何排序數(shù)據(jù)是很重要的,特別是對于分析結(jié)果集或為報告或外部通信組織數(shù)據(jù)。
SQL中有兩個常用的用于數(shù)據(jù)排序的語句:GROUP BY
和ORDER BY
。GROUP BY
語句根據(jù)查詢中指定的列對數(shù)據(jù)進行分組,并與聚集函數(shù)一起使用。ORDER BY
允許您按字母或數(shù)字以及升序或降序組織結(jié)果集。
在本教程中,你將使用GROUP BY
和ORDER BY
語句在SQL中對查詢結(jié)果進行排序。你還將練習(xí)在查詢中實現(xiàn)聚合函數(shù)和WHERE
子句,以便進一步對結(jié)果進行排序。
前期準(zhǔn)備
為了學(xué)習(xí)本指南,你需要一臺運行某種使用SQL的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)的計算機。
注意:請注意,許多RDBMS使用它們自己獨特的SQL實現(xiàn)。雖然本教程中概述的命令適用于大多數(shù)RDBMS,但如果你在MySQL以外的系統(tǒng)上測試它們,確切的語法或輸出可能會有所不同。
你還需要一個裝載了一些示例數(shù)據(jù)的數(shù)據(jù)庫和表,可以在其中練習(xí)使用相關(guān)命令。
連接到MySQL并設(shè)置一個示例數(shù)據(jù)庫
如果SQL數(shù)據(jù)庫系統(tǒng)運行在遠程服務(wù)器上,請從本地設(shè)備SSH到服務(wù)器:
ssh sammy@your_server_ip
然后打開MySQL服務(wù)器提示符,將==sammy==
替換為你的MySQL用戶賬戶的名稱:
mysql -u sammy -p
創(chuàng)建一個名為movieDB
的數(shù)據(jù)庫:
CREATE DATABASE movieDB;
如果數(shù)據(jù)庫成功創(chuàng)建,您將收到這樣的輸出:
OutputQuery OK, 1 row affected (0.01 sec)
要選擇movieDB
數(shù)據(jù)庫,運行以下USE
語句:
USE movieDB;
OutputDatabase changed
選擇數(shù)據(jù)庫后,在其中創(chuàng)建一個表。在本教程的示例中,我們將創(chuàng)建一個表,用于存儲本地電影院的放映信息。這個表將以下7個字段:
-
theater_id
:存儲每個劇院的展廳的int
數(shù)據(jù)類型的值,并作為表的主鍵,這意味著這一列中的每個值都將作為其各自行的唯一標(biāo)識符。 -
date
:使用DATE
數(shù)據(jù)類型來存儲電影放映的年、月、日的特定日期。該數(shù)據(jù)類型遵循以下參數(shù):4位數(shù)字表示年份,最多2位數(shù)字表示月和日(YYYY-MM-DD
)。 -
time
:用TIME
數(shù)據(jù)類型以小時、分鐘和秒(HH:MM:SS
)表示電影的計劃放映。 -
movie_name
:使用varchar
數(shù)據(jù)類型存儲電影的名稱,最多40個字符。 -
movie_genre
:使用不超過30個字符的varchar
數(shù)據(jù)類型,保存每部電影各自類型的信息。 -
guest_total
:顯示參加電影放映的總?cè)藬?shù),數(shù)據(jù)類型為int
。 -
ticket_cost
:使用decimal
數(shù)據(jù)類型,精度為4,刻度為1,這意味著這一列的值可以有4位數(shù)字,小數(shù)點右側(cè)有2位數(shù)字。這一列表示特定電影放映的票價。
通過運行下面的CREATE TABLE
命令,創(chuàng)建一個名為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)
);
接下來,向空表中插入一些示例數(shù)據(jù):
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
插入數(shù)據(jù)后,就可以開始在SQL中對查詢結(jié)果進行排序了。
如何使用GROUP BY
GROUP BY
語句的功能是將具有共享值的記錄分組。在查詢中,GROUP BY
語句總是與聚合函數(shù)一起使用。您可能還記得,一個聚合函數(shù)總結(jié)信息,并返回一個結(jié)果。例如,你可以查詢一列的總數(shù)或總和,這將在結(jié)果中產(chǎn)生一個值。使用GROUP BY
子句,你可以實現(xiàn)聚合函數(shù),為每個你想要的組獲得一個結(jié)果值。
GROUP BY
對于返回多個按指定組排序的期望結(jié)果很有用,而不是只按一列排序。此外,如果你選擇使用FROM
語句和WHERE
子句,GROUP BY
必須始終位于它們之后。下面是一個使用GROUP BY
和聚合函數(shù)的查詢結(jié)構(gòu)的示例:
SELECT column_1, AGGREGATE_FUNCTION(column_2) FROM table GROUP BY column_1;
為了說明如何使用GROUP BY
語句,假設(shè)你正在領(lǐng)導(dǎo)幾部電影的發(fā)行活動,并且你想評估營銷工作的成功。你讓當(dāng)?shù)氐囊患覄≡悍窒硭麄冊谥芪搴椭芰鶑目腿四抢锸占臄?shù)據(jù)。首先通過運行SELECT
和*
符號來查看數(shù)據(jù),以選擇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)
雖然這些數(shù)據(jù)很有用,但您希望對某些特定列進行更深入的評估并排序結(jié)果。
因為你工作在幾個不同類型的電影,你有興趣知道他們被電影觀眾好評。具體來說,你想知道觀看每種類型電影的平均人數(shù)。使用SELECT
從movie_genre
列中檢索各種類型的電影。然后對guest_total
列應(yīng)用聚合函數(shù)AVG
,使用AS
為average
列創(chuàng)建一個別名,并包含GROUP BY
語句以movie_genre
對結(jié)果進行分組。按這種方式分組可以得到每種電影類型的平均結(jié)果:
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
組中每種電影類型的四個平均值。根據(jù)這些信息,Action
的平均每場觀眾人數(shù)最多。
接下來,假設(shè)你想要測量影院在兩天內(nèi)的收入。下面的查詢從date
列返回值,以及由SUM
聚合函數(shù)返回的值。具體來說,聚合函數(shù)SUM
將一個數(shù)學(xué)方程放在括號中,使用*
操作符將總客人數(shù)量乘以一張票的成本,表示為:SUM(guest_total * ticket_cost)
。該查詢包含AS
子句,為聚合函數(shù)返回的列提供別名total_revenue
。然后使用GROUP BY
語句完成查詢,根據(jù)date
列對查詢結(jié)果進行分組:
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 BY
對date
列進行分組,所以輸出的結(jié)果是每天的總票房收入,在本例中是5月27日星期五7,272元,5月28日星期六9,646元。
現(xiàn)在假設(shè)你想關(guān)注并分析一部電影:《壞家伙》。在這種情況下,你想弄清楚時間和價格點如何影響一個家庭觀看動畫電影的選擇。對于這個查詢,使用聚合函數(shù)MAX
來獲取最大的ticket_cost
,確保包含AS
來為price_data
列創(chuàng)建別名。然后,使用WHERE
子句將結(jié)果通過movie_name
縮小到只有“the Bad Guys”,并使用and
使用比較操作符?>
來根據(jù)guest_total
數(shù)字大于100來確定最受歡迎的電影次數(shù)。然后用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)
根據(jù)這個輸出,更多的客人在上午9點的早場時間去看《The Bad Guys》,這是一個更實惠的價格點,每張票8美元。然而,這些結(jié)果也顯示,看電影的客人在下午5點時支付了更高的票價,為13美元,這表明家庭更喜歡在當(dāng)天不會太晚的時間看電影,并且會為電影票支付更多的錢。與晚上10點的《The Bad Guys》相比,這似乎是一個公平的評價,當(dāng)時只有83名觀眾,每張票的價格是18美元。這可以為電影院經(jīng)理提供有用的信息,證明開放更多的日場和傍晚場次可以增加家庭的上座率,這些家庭正在根據(jù)首選的時間和價格點進行選擇。
請注意,盡管GROUP BY
幾乎總是與聚合函數(shù)一起使用,但也可能有例外,盡管不太可能。然而,如果你想在沒有聚合函數(shù)的情況下對結(jié)果進行分組,你可以使用DISTINCT
語句來獲得相同的結(jié)果。DISTINCT
子句通過返回列中的唯一值來刪除結(jié)果集中的重復(fù)項,并且它只能與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)
在查看表中的所有數(shù)據(jù)時,你會發(fā)現(xiàn)電影名稱有重復(fù),因為有多個放映場次。因此,DISTINCT
刪除了這些重復(fù)項,并有效地將唯一的值分組在單列movie_name
下。這實際上與下面的查詢相同,其中包含一個GROUP BY
語句:
SELECT movie_name FROM movie_theater GROUP BY movie_name;
現(xiàn)在你已經(jīng)練習(xí)了在聚合函數(shù)中使用GROUP BY
,接下來你將學(xué)習(xí)如何使用ORDER BY
語句對查詢結(jié)果進行排序。
如何使用ORDER BY
ORDER BY
語句的功能是根據(jù)你在查詢中指定的列對結(jié)果進行升序或降序排序。根據(jù)后面指定的列存儲的數(shù)據(jù)類型,ORDER by
將按字母或數(shù)字順序組織它們。默認情況下,ORDER By
將按升序?qū)Y(jié)果進行排序;但是,如果你喜歡降序排列,你必須在查詢中包含關(guān)鍵字DESC
。你也可以將ORDER BY
語句和GROUP BY
一起使用,但它必須放在后面才能正常工作。與GROUP BY
類似,ORDER BY
也必須位于FROM
語句和WHERE
子句之后。ORDER BY
的通用語法如下:
SELECT column_1, column_2 FROM table ORDER BY column_1;
讓我們繼續(xù)使用電影院的示例數(shù)據(jù),并練習(xí)使用ORDER BY
對結(jié)果進行排序。從下面的查詢開始,它從guest_total
列中檢索值,并用ORDER BY
語句組織這些數(shù)值:
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)
因為你的查詢指定了一個數(shù)值列,所以ORDER BY
語句按照數(shù)值和升序排列結(jié)果,從guest_total
列的25開始。
如果你想按降序?qū)α羞M行排序,可以在查詢語句的末尾添加DESC
關(guān)鍵字。此外,如果你想根據(jù)movie_name
下的字符值對數(shù)據(jù)進行排序,可以在查詢中指定。讓我們使用ORDER BY
來執(zhí)行這種類型的查詢,以將movie_name
列的字符值降序排列。通過包含一個WHERE
子句來從time
列中檢索在10:00 pm放映的電影數(shù)據(jù),從而進一步排序結(jié)果:
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)
這個結(jié)果集列出了晚上10點放映的四部不同的電影,按字母順序降序排列,從《Top Gun Maverick》到《Downtown Abbey A New Era》。
對于下一個查詢,將ORDER BY
和GROUP BY
語句與聚合函數(shù)SUM
結(jié)合起來,生成每部電影的總收益。但是,假設(shè)電影院錯算了總?cè)藬?shù),并且忘了包括那些預(yù)先購買并預(yù)定了每場12人的電影票的特殊派對。
在這個查詢中使用SUM
,通過實現(xiàn)運算符+
,然后將12
加到guest_total
中,來包含每次電影放映的額外12位客人。一定要附上這個括號。然后,用運算符“*”乘以ticket_cost
,并通過最后的圓括號完成數(shù)學(xué)方程。添加AS
子句為名為total_revenue
的新列創(chuàng)建別名。然后,使用GROUP BY
來根據(jù)從movie_name
列檢索到的數(shù)據(jù)對每部電影的total_revenue
結(jié)果進行分組。最后,使用ORDER BY
將新列total_revenue
下的結(jié)果以升序排列:
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)
這個結(jié)果集告訴我們每部電影加上額外的12位觀眾的總票房收入,并將總票房收入從低到高排序。由此我們得知,《Top Gun Maverick》的票房收入最高,而《Men》的票房收入最低。與此同時,《The Bad Guys》和《Downton Abbey A New Era》在總票房上非常接近。
在本節(jié)中,你實踐了多種實現(xiàn)ORDER BY
語句的方法,以及如何指定你喜歡的順序,例如字符型和數(shù)值型數(shù)據(jù)的升序和降序。你還學(xué)習(xí)了如何包含WHERE
子句以縮小結(jié)果范圍,并使用聚合函數(shù)和數(shù)學(xué)方程使用GROUP BY
和ORDER BY
語句執(zhí)行查詢。文章來源:http://www.zghlxwxcb.cn/news/detail-704042.html
總結(jié)
理解如何使用GROUP BY
和ORDER BY
語句對于對結(jié)果和數(shù)據(jù)進行排序是很重要的。你是想在一個組下組織多個結(jié)果,還是按字母和降序組織其中一列,還是同時進行這兩種操作。你還了解了使用WHERE
子句進一步排序結(jié)果的其他方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-704042.html
到了這里,關(guān)于如何使用SQL系列 之 如何在SQL中使用GROUP BY和ORDER BY的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!