อะไรคือความแตกต่างระหว่าง GROUP BY และ ORDER BY ใน sql


119

คุณใช้อันไหนโดยทั่วไป? ตัวอย่างเป็นกำลังใจอย่างยิ่ง!

ฉันอ้างถึง MySql แต่นึกไม่ออกว่าแนวคิดที่แตกต่างไปจาก DBMS อื่น

คำตอบ:


79

ORDER BY จะเปลี่ยนลำดับการคืนสินค้า

GROUP BY จะรวมระเบียนตามคอลัมน์ที่ระบุซึ่งช่วยให้คุณสามารถใช้ฟังก์ชันการรวมในคอลัมน์ที่ไม่ได้จัดกลุ่ม (เช่น SUM, COUNT, AVG เป็นต้น)


130
คำพูดนี้แทบจะไม่มีเหตุผลหากไม่มีตัวอย่างประกอบ
JohnMerlino

2
ฉันคิดว่าตัวอย่างที่สองในหน้าในลิงก์เพียงพอที่จะเข้าใจความแตกต่างtutorialspoint.com/sql/sql-group-by.htm
nishantbhardwaj2002

คุณช่วยยกตัวอย่างได้ไหม
ข้าวสาร

249

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

2
จะเกิดอะไรขึ้นถ้าตารางมีageคอลัมน์โดย Peters มีอายุต่างกันและแบบสอบถามคือ SELECT NAME, AGE FROM TABLE GROUP BY NAME?
Varun

1
คุณไม่สามารถส่งคืนคอลัมน์ที่ไม่ได้อยู่ในกลุ่มของคุณโดยหรือมีวิธีการ ดังนั้นคุณอาจต้องเพิ่มอายุเพื่อจัดกลุ่มตามหรือทำบางอย่างเช่น Max (Age)
RiddlerDev

78

ORDER BY:เรียงลำดับข้อมูลจากน้อยไปมากหรือมากไปหาน้อย

พิจารณาตารางลูกค้า :

+----+----------+-----+-----------+----------+
| 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 |
    +----+----------+-----+-----------+----------+

ตามที่คุณได้อนุมานว่าไม่มีประโยชน์หากไม่มีฟังก์ชัน SQL เช่น sum, avg เป็นต้น ..

ดังนั้นให้อ่านคำจำกัดความนี้เพื่อทำความเข้าใจการใช้ GROUP BY อย่างเหมาะสม:

คำสั่ง GROUP BY ทำงานบนแถวที่ส่งคืนโดยแบบสอบถามโดยการสรุปแถวที่เหมือนกันเป็นกลุ่มเดียว / กลุ่มที่แตกต่างกันและส่งกลับแถวเดียวพร้อมกับสรุปสำหรับแต่ละกลุ่มโดยใช้ฟังก์ชัน Aggregate ที่เหมาะสมในรายการ 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 |
+---------+-------------+

25

ความแตกต่างคือความหมายของชื่อ: กลุ่มโดยดำเนินการจัดกลุ่มและเรียงลำดับตามประเภท

หากคุณทำเช่นSELECT * FROM Customers ORDER BY Nameนั้นคุณจะได้รับรายการผลลัพธ์ที่จัดเรียงตามชื่อลูกค้า

หากคุณSELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActiveได้รับจำนวนลูกค้าที่ใช้งานและไม่ได้ใช้งาน จัดกลุ่มโดยรวมผลลัพธ์ตามฟิลด์ที่คุณระบุ


3
ยิ่งไปกว่านั้น: หากคุณ GROUP ผลลัพธ์จะไม่จำเป็นต้องเรียงลำดับ แม้ว่าในหลาย ๆ กรณีอาจเป็นไปตามลำดับที่ใช้งานง่าย แต่ก็ไม่ได้รับการรับรองโดย GROUP clause หากคุณต้องการจัดเรียงกลุ่มของคุณให้ใช้ ORDER BY ที่ชัดเจนหลัง GROUP BY เสมอ
Dave Costa

16

มีความหมายแตกต่างกันโดยสิ้นเชิงและไม่เกี่ยวข้องกันเลย

ORDER BYช่วยให้คุณสามารถจัดเรียงชุดผลลัพธ์ตามเกณฑ์ที่แตกต่างกันเช่นเรียงลำดับแรกตามชื่อจาก az จากนั้นจัดเรียงตามราคาสูงสุดไปต่ำสุด

(สั่งซื้อตามชื่อราคา DESC)

GROUP BYช่วยให้คุณสามารถใช้ชุดผลลัพธ์ของคุณจัดกลุ่มเป็นกลุ่มตรรกะแล้วเรียกใช้การสืบค้นแบบรวมในกลุ่มเหล่านั้น ตัวอย่างเช่นคุณสามารถเลือกพนักงานทั้งหมดจัดกลุ่มตามสถานที่ทำงานและคำนวณเงินเดือนเฉลี่ยของพนักงานทุกคนในสถานที่ทำงานแต่ละแห่ง


8

ง่ายORDER BYสั่งข้อมูลและGROUP BYกลุ่มหรือรวมข้อมูล

ORDER BY จัดลำดับผลลัพธ์ที่กำหนดตามฟิลด์ที่กล่าวถึงโดยค่าเริ่มต้นตามลำดับจากน้อยไปหามาก

สมมติว่าคุณกำลังเรียกใช้แบบสอบถามเนื่องจากORDER BY (student_roll_number)จะแสดงผลลัพธ์จากน้อยไปหามากของจำนวนม้วนของนักเรียน ที่นี่student_roll_numberรายการอาจเกิดขึ้นมากกว่าหนึ่งครั้ง

ในGROUP BYกรณีนี้เราใช้สิ่งนี้กับฟังก์ชันการรวมและจัดกลุ่มข้อมูลตามฟังก์ชันการรวมและเราจะได้ผลลัพธ์ ที่นี่หากคำถามของเรามีSUM (marks)พร้อมด้วยGROUP BY (student_first_name)จะแสดงผลรวมของเครื่องหมายของนักเรียนที่อยู่ในแต่ละกลุ่ม (โดยที่สมาชิกทุกคนในกลุ่มจะมีชื่อเดียวกัน)


4

GROUP BY ใช้เพื่อจัดกลุ่มแถวในการเลือกโดยปกติแล้วเมื่อรวมแถว (เช่นการคำนวณผลรวมค่าเฉลี่ย ฯลฯ สำหรับชุดของแถวที่มีค่าเดียวกันสำหรับบางฟิลด์)

ORDER BY ใช้เพื่อเรียงลำดับแถวที่เกิดจากคำสั่ง select



1

ORDER BYแสดงเขตข้อมูลจากน้อยไปมากหรือมากไปหาน้อย ในขณะที่GROUP BYแสดงชื่อฟิลด์เดียวกัน id ฯลฯ ในเอาต์พุตเดียวเท่านั้น


4
คำตอบนี้ไม่ได้ให้ข้อมูลเพิ่มเติมว่าคำตอบที่ยอมรับหรือคำตอบอื่นใดที่ได้รับนั้นยังไม่ได้ระบุไว้
newfurniturey

1
  1. GROUP BY จะรวบรวมระเบียนตามคอลัมน์ที่ระบุซึ่งช่วยให้คุณสามารถใช้ฟังก์ชันการรวมในคอลัมน์ที่ไม่ได้จัดกลุ่ม (เช่น SUM, COUNT, AVG เป็นต้น) ORDER BY จะเปลี่ยนลำดับการคืนสินค้า
  2. หากคุณเลือก IsActive COUNT (*) จากกลุ่มลูกค้าตาม IsActive คุณจะได้รับจำนวนลูกค้าที่ใช้งานและไม่ได้ใช้งาน จัดกลุ่มโดยรวมผลลัพธ์ตามฟิลด์ที่คุณระบุ หากคุณเลือก * จากลูกค้าสั่งซื้อตามชื่อคุณจะได้รับรายการผลลัพธ์ที่เรียงตามชื่อลูกค้า
  3. หากคุณ GROUP ผลลัพธ์จะไม่จำเป็นต้องเรียงลำดับ แม้ว่าในหลาย ๆ กรณีอาจเป็นไปตามลำดับที่ใช้งานง่าย แต่ก็ไม่ได้รับการรับรองโดย GROUP หากคุณต้องการจัดเรียงกลุ่มของคุณให้ใช้ ORDER BY อย่างชัดเจนหลัง GROUP BY เสมอ
  4. ไม่สามารถกรองข้อมูลที่จัดกลุ่มโดย WHERE clause ข้อมูลคำสั่งซื้อสามารถกรองได้โดย WHERE clause

0

ควรสังเกตว่าGROUP BYไม่จำเป็นเสมอไปเนื่องจาก (อย่างน้อยใน PostgreSQL และมีแนวโน้มในตัวแปร SQL อื่น ๆ ) คุณสามารถใช้ORDER BYกับรายการและคุณยังสามารถใช้ASCหรือDESC ต่อคอลัมน์ ...

SELECT name_first, name_last, dob 
FROM those_guys 
ORDER BY name_last ASC, name_first ASC, dob DESC;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.