簡體   English   中英

sql中GROUP BY和ORDER BY有什么區別

[英]what is the difference between GROUP BY and ORDER BY in sql

你一般什么時候使用哪個? 非常鼓勵示例!

我指的是 MySql,但無法想象這個概念在另一個 DBMS 上會有所不同

ORDER BY 更改項目返回的順序。

GROUP BY 將按指定的列聚合記錄,這允許您對非分組列(例如 SUM、COUNT、AVG 等)執行聚合功能。

TABLE:
ID NAME
1  Peter
2  John
3  Greg
4  Peter

SELECT *
FROM TABLE
ORDER BY NAME

= 
3 Greg
2 John
1 Peter
4 Peter

SELECT Count(ID), NAME
FROM TABLE
GROUP BY NAME

= 
1 Greg
1 John 
2 Peter

SELECT NAME
FROM TABLE
GROUP BY NAME
HAVING Count(ID) > 1

=
Peter

ORDER BY:按升序或降序對數據進行排序。

考慮CUSTOMERS表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

以下是一個示例,它將按 NAME 按升序對結果進行排序:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

這將產生以下結果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
+----+----------+-----+-----------+----------+

GROUP BY:將相同的數據分組。

現在, CUSTOMERS表具有以下重復名稱的記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Ramesh   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | kaushik  |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

如果要將相同的名稱分組為單個名稱,則 GROUP BY 查詢將如下所示:

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

這將產生以下結果:(對於相同的名稱,它將選擇最后一個並最終按升序對列進行排序)

    +----+----------+-----+-----------+----------+   
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  4 | kaushik  |  25 | Mumbai    |  6500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    |  2 | Ramesh   |  25 | Delhi     |  1500.00 |
    +----+----------+-----+-----------+----------+

正如您所推斷的那樣,如果沒有 sum、avg 等 SQL 函數,它就沒有用處。

所以通過這個定義來理解 GROUP BY 的正確使用:

GROUP BY 子句通過將相同的行匯總到單個/不同的組中來處理查詢返回的行,並通過在 SELECT 列表中使用適當的聚合函數(如 COUNT()、SUM)返回帶有每個組摘要的單行()、MIN()、MAX()、AVG() 等

現在,如果您想知道每個客戶(姓名)的工資總額,那么 GROUP BY 查詢將如下所示:

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

這將產生以下結果:(相同姓名的工資之和,並在刪除相同姓名后對 NAME 列進行排序)

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+

ORDER BY 更改項目返回的順序。

GROUP BY 將按指定的列聚合記錄,這允許您對非分組列(例如 SUM、COUNT、AVG 等)執行聚合功能。

區別正是顧名思義:group by 執行分組操作,而 order by 排序。

如果您執行SELECT * FROM Customers ORDER BY Name那么您將獲得按客戶姓名排序的結果列表。

如果您執行SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive您將獲得活躍和非活躍客戶的計數。 group by 根據您指定的字段聚合結果。

它們具有完全不同的含義,根本沒有真正的相關性。

ORDER BY允許您根據不同的條件對結果集進行排序,例如先從 az 按名稱排序,然后按價格從高到低排序。

(按名稱訂購,價格 DESC)

GROUP BY允許您獲取結果集,將其分組為邏輯組,然后對這些組運行聚合查詢。 例如,您可以選擇所有員工,按工作地點對他們進行分組,然后計算每個工作地點所有員工的平均工資。

很簡單, ORDER BY對數據進行GROUP BYGROUP BY分組,或者組合數據。

ORDER BY按照上述字段對結果集進行排序,默認情況下按升序排列。

假設您以ORDER BY (student_roll_number)形式觸發查詢,它將顯示學生卷號的升序結果。 在這里, student_roll_number條目可能會出現多次。

GROUP BY情況下,我們將其與聚合函數一起使用,它根據聚合函數對數據進行分組,然后我們得到結果。 在這里,如果我們的查詢有SUM (marks)GROUP BY (student_first_name) ,它將顯示屬於每個組的學生的分數總和(其中一個組的所有成員都具有相同的名字)。

GROUP BY 用於在選擇中對行進行分組,通常在聚合行時(例如,為某些字段具有相同值的一組行計算總計、平均值等)。

ORDER BY 用於對 select 語句產生的行進行排序。

那里有一些好例子。 就像從webcheatsheet中添加我自己的,它提供了很好的清晰示例,以及讓您執行自己的SQL。

SQL Order By

SQL Group By

ORDER BY按升序或降序顯示字段。 雖然GROUP BY僅在一個輸出中顯示相同的字段名、id 等。

  1. GROUP BY 將按指定列聚合記錄,這允許您對非分組列(如 SUM、COUNT、AVG 等)執行聚合功能。 ORDER BY 更改項目返回的順序。
  2. 如果您執行 SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive,您將獲得活躍和非活躍客戶的計數。 group by 根據您指定的字段聚合結果。 如果您執行 SELECT * FROM Customers ORDER BY Name,那么您將獲得按客戶姓名排序的結果列表。
  3. 如果是GROUP,結果不一定排序; 盡管在許多情況下它們可能以直觀的順序出現,但 GROUP 子句不能保證這一點。 如果您希望對組進行排序,請始終在 GROUP BY 之后使用明確的 ORDER BY。
  4. WHERE 子句不能過濾分組數據。 訂單數據可以通過 WHERE 子句過濾。

應該注意的是GROUP BY並不總是必要的,因為(至少在 PostgreSQL 中,並且可能在其他 SQL 變體中)您可以將ORDER BY與列表一起使用,並且您仍然可以列使用ASCDESC ...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM