Mệnh đề SQL NHÓM B BYNG 1 BY có nghĩa là gì?


203

Ai đó đã gửi cho tôi một truy vấn SQL trong đó GROUP BYmệnh đề bao gồm câu lệnh : GROUP BY 1.

Đây phải là một lỗi đánh máy phải không? Không có cột nào được đưa ra bí danh 1. Điều này có nghĩa là gì? Tôi có đúng không khi cho rằng đây phải là một lỗi đánh máy?


6
Đây không phải là một lỗi đánh máy, đó là cột đầu tiên trong tập kết quả của bạn
Lamak

9
Lưu ý rằng cú pháp này là không di động. Nó sẽ hoạt động khác nhau trên các cơ sở dữ liệu khác với mysql. Trong Oracle, ví dụ, nó được coi là một hằng số.
Russell Reed

2
@RussellReed Có. thật không may (vì sử dụng một bí danh đôi khi rất hữu ích) ansi sql không cho phép nhóm theo thứ tự cột. Lý do là nhóm xảy ra trước khi chiếu. Nhưng sau đó .. những gì khi chúng ta có các biểu thức nhóm với hàng chục dòng .. chúng ta kết thúc với .. các chuỗi của hàng chục dòng trong câu lệnh sql cuối cùng.
javadba

Câu trả lời:


232

Nó có nghĩa là nhóm theo cột đầu tiên bất kể nó được gọi là gì. Bạn có thể làm tương tự với ORDER BY.


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

FROM account
GROUP BY 1;

Trong truy vấn trên GROUP BY 1đề cập đến first column in select statementđó là account_id.

Bạn cũng có thể chỉ định trong ORDER BY.

Lưu ý: Số trong ORDER BY và GROUP BY luôn bắt đầu bằng 1 chứ không phải 0.


25

Ngoài việc nhóm theo tên trường, bạn cũng có thể nhóm theo thứ tự hoặc vị trí của trường trong bảng. 1 tương ứng với trường đầu tiên (không phân biệt tên), 2 là trường thứ hai, v.v.

Điều này thường không được khuyến khích nếu bạn đang nhóm vào một cái gì đó cụ thể, vì cấu trúc bảng / khung nhìn có thể thay đổi. Ngoài ra, có thể khó có thể nhanh chóng hiểu được truy vấn SQL của bạn đang làm gì nếu bạn không ghi nhớ các trường bảng.

Nếu bạn đang trả về một bộ duy nhất hoặc nhanh chóng thực hiện tra cứu tạm thời, đây là cú pháp tốc ký tốt để giảm việc nhập. Nếu bạn dự định chạy lại truy vấn vào một lúc nào đó, tôi khuyên bạn nên thay thế truy vấn đó để tránh nhầm lẫn trong tương lai và các biến chứng không mong muốn (do thay đổi lược đồ).


10
+1 cho "không làm điều này" và tôi thêm rằng lý do tốt nhất để tránh điều đó là nó không thể đọc được.
Yuck


5

Điều đó có nghĩa là nhóm sql theo cột thứ 1 trong mệnh đề lựa chọn của bạn, chúng tôi luôn sử dụng điều này GROUP BY 1cùng với ORDER BY 1, ngoài ra bạn cũng có thể sử dụng như thế này GROUP BY 1,2,3.., tất nhiên nó thuận tiện cho chúng tôi nhưng bạn cần chú ý đến điều kiện đó kết quả có thể không phải là bạn muốn nếu ai đó đã sửa đổi các cột được chọn của bạn và nó không được hiển thị


4

Nó sẽ nhóm theo vị trí cột bạn đặt sau nhóm theo mệnh đề.

ví dụ: nếu bạn chạy ' SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' nó sẽ nhóm theo SALESMAN_NAME.

Một rủi ro khi làm điều đó là nếu bạn chạy ' Select *' và vì một số lý do bạn tạo lại bảng với các cột theo thứ tự khác, nó sẽ cho bạn một kết quả khác so với bạn mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.