SQL clause“ GROUP BY 1” หมายถึงอะไร?


202

มีคนส่งมาให้ผมแบบสอบถาม SQL ที่ข้อประกอบด้วยคำสั่ง:GROUP BYGROUP BY 1

นี่ต้องเป็นตัวพิมพ์ผิดใช่มั้ย ไม่มีคอลัมน์ที่ให้นามแฝง 1. สิ่งนี้หมายความว่าอย่างไร ฉันคิดถูกหรือเปล่าว่านี่ต้องเป็นตัวพิมพ์ผิดใช่ไหม


6
มันไม่ใช่การพิมพ์ผิดมันเป็นคอลัมน์แรกของชุดผลลัพธ์ของคุณ
Lamak

9
โปรดทราบว่าไวยากรณ์นี้ไม่สามารถพกพาได้ มันจะทำงานต่างจากฐานข้อมูลอื่นที่ไม่ใช่ mysql ตัวอย่างเช่นใน Oracle ถือว่าเป็นค่าคงที่
Russell Reed

2
@RussellReed ใช่ น่าเสียดาย (เนื่องจากการใช้นามแฝงมีประโยชน์มากในบางครั้ง) ansi sql ไม่อนุญาตให้จัดกลุ่มตามลำดับคอลัมน์ เหตุผลก็คือกลุ่มเกิดขึ้นก่อนการฉาย แต่ .. เมื่อเรามีการจัดกลุ่มนิพจน์ที่มีหลายสิบบรรทัด .. เราจะจบลงด้วย .. mutiplesหลายสิบบรรทัดในคำสั่ง sql สุดท้าย
javadba

คำตอบ:


231

มันหมายถึงการจัดกลุ่มตามคอลัมน์แรกโดยไม่คำนึงถึงสิ่งที่เรียกว่า ORDER BYคุณสามารถทำเช่นเดียวกันกับ


74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

ในแบบสอบถามดังกล่าวGROUP BY 1หมายถึงซึ่งเป็นfirst column in select statement account_id

ORDER BYนอกจากนี้คุณยังสามารถระบุใน

หมายเหตุ: หมายเลขใน ORDER BY และ GROUP BY มักเริ่มต้นด้วย 1 ไม่ใช่ด้วย 0


25

นอกเหนือจากการจัดกลุ่มตามชื่อฟิลด์คุณอาจจัดกลุ่มตามลำดับหรือตำแหน่งของฟิลด์ภายในตาราง 1 สอดคล้องกับฟิลด์แรก (โดยไม่คำนึงถึงชื่อ) 2 คือฟิลด์ที่สองเป็นต้น

โดยทั่วไปจะไม่แนะนำหากคุณจัดกลุ่มกับบางอย่างที่เฉพาะเจาะจงเนื่องจากโครงสร้างตาราง / มุมมองอาจเปลี่ยนแปลง นอกจากนี้อาจเป็นเรื่องยากที่จะเข้าใจอย่างรวดเร็วว่าการสืบค้น SQL ของคุณกำลังทำอะไรหากคุณยังไม่ได้จดจำเขตข้อมูลตาราง

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


10
+1 สำหรับ "อย่าทำอย่างนี้" และฉันจะเพิ่มว่าเหตุผลที่ดีที่สุดที่จะหลีกเลี่ยงคือมันไม่สามารถอ่านได้
Yuck


5

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


4

มันจะจัดกลุ่มตามตำแหน่งคอลัมน์ที่คุณใส่หลังจากกลุ่มตามข้อ

ตัวอย่างเช่นถ้าคุณใช้ ' SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' SALESMAN_NAMEก็จะจัดกลุ่มตาม

หนึ่งความเสี่ยงในการทำเช่นนั้นคือถ้าคุณเรียกใช้ ' Select *' และด้วยเหตุผลบางอย่างที่คุณสร้างตารางด้วยคอลัมน์ในลำดับที่แตกต่างกันมันจะให้ผลลัพธ์ที่แตกต่างจากที่คุณคาดไว้

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