Có sự khác biệt nào giữa GROUP BY và DISTINCT không


310

Tôi đã học được một điều đơn giản về SQL vào ngày khác:

SELECT c FROM myTbl GROUP BY C

Có kết quả tương tự như:

SELECT DISTINCT C FROM myTbl

Điều tôi tò mò là, có gì khác trong cách mà một công cụ SQL xử lý lệnh hay chúng thực sự giống nhau không?

Cá nhân tôi thích cú pháp riêng biệt, nhưng tôi chắc chắn rằng nó không theo thói quen hơn bất cứ thứ gì khác.

EDIT: Đây không phải là một câu hỏi về tổng hợp. Việc sử dụng GROUP BYvới các hàm tổng hợp được hiểu.


11
Đây không phải là một câu hỏi về tập hợp, nó là một NHÓM THEO hoạt động giống như một sự khác biệt khi không có chức năng tổng hợp nào
Brettski

2
Bạn cũng có thể làm SELECT c FROM myTbl UNION SELECT c FROM myTblvà nhận được kết quả tương tự ... Nhưng tại sao lại phức tạp hóa mọi thứ khi CHỌN DISTINCT quá dễ dàng.
jarlh

'Thứ tự thực hiện logic' của GROUP BYsớm hơn nhiều so với 'CHỌN' và DISTINCTtheo sau chọn.
Được sử dụng_By_Al sẵn

Một điểm khác biệt rất nhỏ mà tôi chưa thấy đề cập đến là DISTINCTkết quả trong việc thực sự chọn trường - tức là giá trị sẽ xuất hiện trong tập kết quả. GROUP BYcó thể loại bỏ hiệu quả các bản sao mà không thực sự chọn trường. Điều này có phần không liên quan trong hầu hết các trường hợp, nhưng có thể chính xác là những gì bạn muốn ở người khác. Nếu bạn kết thúc sử dụng GROUP BYthay thế DISTINCT, một nhận xét giải thích trong mã có thể được bảo hành.
rinogo

Điểm mấu chốt dường như là bởi vì loại bỏ trùng lặp xảy ra tại các điểm khác nhau trong kế hoạch thực hiện, một cái có thể hiệu quả hơn cái kia bởi vì loại bỏ song công yêu cầu một loại hoặc có thể sử dụng chỉ mục này trên chỉ mục đó. Do đó, có thể có một lợi thế từ việc loại bỏ song công sớm hoặc lợi thế có thể đến từ việc sử dụng một chỉ số khác sớm và ăn một loại sau đó khi có một vài hàng còn lại và sắp xếp là không đáng kể.
bielawski

Câu trả lời:


246

Câu trả lời của MusiGenesis về mặt chức năng là câu trả lời đúng liên quan đến câu hỏi của bạn như đã nêu; Máy chủ SQL đủ thông minh để nhận ra rằng nếu bạn đang sử dụng "Nhóm theo" và không sử dụng bất kỳ hàm tổng hợp nào, thì ý nghĩa thực sự của bạn là "Khác biệt" - và do đó, nó tạo ra một kế hoạch thực hiện như thể bạn chỉ đơn giản sử dụng "Phân biệt . "

Tuy nhiên, tôi nghĩ điều quan trọng cần lưu ý là phản ứng của Hank cũng như - cách đối xử ung dung của "Nhóm theo" và "Khác biệt" có thể dẫn đến một số vấn đề nguy hiểm ở tuyến dưới nếu bạn không cẩn thận. Hoàn toàn không đúng khi nói rằng đây "không phải là câu hỏi về tổng hợp" bởi vì bạn đang hỏi về sự khác biệt về chức năng giữa hai từ khóa truy vấn SQL, một trong số đó có nghĩa là được sử dụng với tổng hợp và một trong số đó thì không.

Một cái búa có thể hoạt động để lái trong một ốc vít đôi khi, nhưng nếu bạn có một tuốc nơ vít tiện dụng, tại sao phải bận tâm?

(cho mục đích tương tự này, Hammer : Screwdriver :: GroupBy : Distinctscrew => get list of unique values in a table column)


Tôi hoàn toàn đồng ý với bạn Skeolan. Tôi đã khá ngạc nhiên khi thấy chức năng này. Đó không phải là thứ tôi dự định sử dụng, nhưng một cách mà mọi thứ đã được thực hiện tại nơi mới này tôi đang làm việc.
Brettski

Ít nhất trong Oracle 12 dường như có những trường hợp DISTINCT, nhận các giá trị riêng biệt bằng UNION và GROUP BY hoạt động khác nhau. Tôi vừa có một trường hợp sớm hơn hôm nay khi DISTINCT và phân biệt bởi UNION gây ra lỗi tiên tri, nhưng NHÓM B BYNG đã hoạt động; Tôi đã chỉ chọn 1 cột từ chế độ xem và không sử dụng bất kỳ tổng hợp nào; Tôi vẫn còn bối rối tại sao nó yêu cầu nó, nhưng nó xác nhận có một số khác biệt trong việc thực thi. Như những người khác chỉ ra, nó cũng cho phép các cột NHÓM THEO không được chọn, mặc dù điều đó hiếm khi cần thiết mà không cần tổng hợp.
ZeroK

1
Khi nói đến SQL, bạn luôn có sẵn cả tuốc nơ vít và búa. Tại sao sử dụng búa để lái xe trong một ốc vít?
jarlh

Nói rõ hơn về sự tương tự của bạn - là cái búa của bạn == GroupBy và tuốc nơ vít == Khác biệt trong trường hợp này?
HopeKing

Wow, câu hỏi mười năm tuổi này vẫn còn chân! "Khác biệt" là tuốc nơ vít, nếu "danh sách các giá trị duy nhất" là vít. Tôi sẽ cập nhật câu trả lời để làm cho sự tương tự rõ ràng hơn.
Skeolan

136

GROUP BYcho phép bạn sử dụng chức năng tổng hợp, giống như AVG, MAX, MIN, SUM, và COUNT. Mặt khác DISTINCTchỉ cần loại bỏ trùng lặp.

Ví dụ: nếu bạn có một loạt các hồ sơ mua hàng và bạn muốn biết mỗi bộ phận đã chi bao nhiêu, bạn có thể làm một cái gì đó như:

SELECT department, SUM(amount) FROM purchases GROUP BY department

Điều này sẽ cung cấp cho bạn một hàng cho mỗi bộ phận, chứa tên bộ phận và tổng của tất cả các amountgiá trị trong tất cả các hàng cho bộ phận đó.


2
Việc sử dụng GROUP BY Tôi hiểu, Câu hỏi dựa trên thực tế là nó trả về một tập dữ liệu riêng biệt khi không có hàm tổng hợp.
Brettski

2
Bởi vì NHÓM B BYNG ngầm thực hiện một DISTINCT đối với các giá trị của cột mà bạn đang nhóm (xin lỗi vì âm mưu).
Joe Pineda

Có phải là không thể sử dụng DISTINCT+ một hàm tổng hợp? như thế này:select distinct department, SUM(amount) from ...
Shafizadeh

@Sajad, Bạn có thể làm điều đó có, nhưng bạn vẫn phải có NHÓM THEO, vì vậy DISTINCT không làm gì cho bạn.
ZeroK

44

Không có sự khác biệt (ít nhất là trong SQL Server). Cả hai truy vấn sử dụng cùng một kế hoạch thực hiện.

http://sqlmag.com/database-performance-tuning/distinc-vs-group

Có thể có một sự khác biệt, nếu có phụ truy vấn liên quan:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-b between-distinc-and-group-by-distotype-vs-group-by /

Không có sự khác biệt (kiểu Oracle):

http://asktom.oracle.com/pls/asktom/f?p=100:11 0 ::::P11_QUESTION_ID:32961403234212


40

Sự khác biệt từ quan điểm chức năng loại bỏ trùng lặp đơn thuần là gì

Ngoài thực tế là không giống như DISTINCT, GROUP BYcho phép tổng hợp dữ liệu cho mỗi nhóm (đã được đề cập bởi nhiều câu trả lời khác), sự khác biệt quan trọng nhất trong quan điểm của tôi là thực tế là hai thao tác "xảy ra" ở hai bước rất khác nhau theo thứ tự logic của các hoạt động được thực hiện trong một SELECTtuyên bố .

Dưới đây là các hoạt động quan trọng nhất:

  • FROM(bao gồm JOIN, APPLY, vv)
  • WHERE
  • GROUP BY (có thể loại bỏ trùng lặp)
  • Tập hợp
  • HAVING
  • Chức năng cửa sổ
  • SELECT
  • DISTINCT (có thể loại bỏ trùng lặp)
  • UNION, INTERSECT, EXCEPT (Có thể loại bỏ bản sao)
  • ORDER BY
  • OFFSET
  • LIMIT

Như bạn có thể thấy, thứ tự logic của từng hoạt động ảnh hưởng đến những gì có thể được thực hiện với nó và cách nó ảnh hưởng đến các hoạt động tiếp theo. Đặc biệt, thực tế là các GROUP BYhoạt động "xảy ra trước khi" các SELECThoạt động (chiếu) có nghĩa là:

  1. Nó không phụ thuộc vào phép chiếu (có thể là một lợi thế)
  2. Nó không thể sử dụng bất kỳ giá trị nào từ phép chiếu (có thể là một bất lợi)

1. Nó không phụ thuộc vào hình chiếu

Một ví dụ không phụ thuộc vào phép chiếu là hữu ích nếu bạn muốn tính các hàm cửa sổ trên các giá trị riêng biệt:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film
GROUP BY rating

Khi chạy với cơ sở dữ liệu Sakila , điều này mang lại:

rating   rn
-----------
G        1
NC-17    2
PG       3
PG-13    4
R        5

Điều tương tự không thể đạt được DISTINCTmột cách dễ dàng:

SELECT DISTINCT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film

Truy vấn đó là "sai" và mang lại một cái gì đó như:

rating   rn
------------
G        1
G        2
G        3
...
G        178
NC-17    179
NC-17    180
...

Đây không phải là những gì chúng ta muốn. Các DISTINCThoạt động "xảy ra sau khi" chiếu, vì vậy chúng tôi không còn có thể loại bỏ DISTINCTxếp hạng bởi vì chức năng cửa sổ đã được tính toán và dự báo. Để sử dụng DISTINCT, chúng ta phải lồng một phần của truy vấn:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM (
  SELECT DISTINCT rating FROM film
) f

Lưu ý phụ: Trong trường hợp cụ thể này, chúng tôi cũng có thể sử dụngDENSE_RANK()

SELECT DISTINCT rating, dense_rank() OVER (ORDER BY rating) AS rn
FROM film

2. Nó không thể sử dụng bất kỳ giá trị nào từ phép chiếu

Một trong những nhược điểm của SQL là tính dài dòng của nó. Vì lý do tương tự như những gì chúng ta đã thấy trước đây (cụ thể là thứ tự logic của các hoạt động), chúng ta không thể "dễ dàng" nhóm theo thứ gì đó chúng ta đang chiếu.

Đây là SQL không hợp lệ:

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY name

Điều này là hợp lệ (lặp lại biểu thức)

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY first_name || ' ' || last_name

Điều này cũng hợp lệ (lồng biểu thức)

SELECT name
FROM (
  SELECT first_name || ' ' || last_name AS name
  FROM customer
) c
GROUP BY name

Tôi đã viết về chủ đề này sâu hơn trong một bài đăng trên blog


Tôi thực sự ngạc nhiên khi thấy rằng lệnh xử tử không được thảo luận ngay lập tức về câu hỏi này. Cảm ơn bạn, rất độc đáo giải thích quá. Theo quan điểm của bạn 2. một số (một?) Db cho phép sử dụng các bí danh được chọn trong suốt truy vấn (cái tôi biết là Teradata, nhưng nó là một ngoại lệ).
Được sử dụng_By_Al sẵn

@Used_By_Al yet: Chắc chắn, một số cơ sở dữ liệu làm điều đó. Nhiều cơ sở dữ liệu cho phép sử dụng các bí danh đó chỉ trong các phần (ví dụ không WHEREnhưng có lẽ GROUP BY). Trong mọi trường hợp, tôi nghĩ đó là một ý tưởng tồi và tôi khuyên bạn không bao giờ nên sử dụng tính năng đó vì lý do tính di động và bảo trì. "Đột nhiên" nó sẽ không hoạt động nữa, ví dụ như khi đặt bí danh cho hàm tổng hợp hoặc hàm cửa sổ.
Lukas Eder

never using that feature for portability and maintenance reasons!! đã đồng ý 100% ... và bây giờ tôi cũng đang viết blog của bạn, công việc tuyệt vời. Chúc mừng.
Được sử dụng_By_Al sẵn

32

Sử dụng DISTINCTnếu bạn chỉ muốn loại bỏ trùng lặp. Sử dụng GROUPY BYnếu bạn muốn áp dụng khai thác tổng hợp ( MAX, SUM, GROUP_CONCAT, ..., hoặc một HAVINGkhoản).


19

Tôi hy vọng có khả năng cho sự khác biệt tinh tế trong việc thực hiện của họ. Tôi đã kiểm tra các kế hoạch thực hiện cho hai truy vấn tương đương về chức năng dọc theo các dòng này trong Oracle 10g:

core> select sta from zip group by sta;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

core> select distinct sta from zip;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH UNIQUE       |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

Hoạt động ở giữa có chút khác biệt: "HASH GROUP BY" so với "HASH UNIQUE", nhưng chi phí ước tính, v.v ... là như nhau. Sau đó tôi đã thực hiện những điều này với dấu vết trên và số lượng hoạt động thực tế là như nhau cho cả hai (ngoại trừ việc thứ hai không phải thực hiện bất kỳ đọc vật lý nào do bộ nhớ đệm).

Nhưng tôi nghĩ rằng vì các tên hoạt động là khác nhau, nên việc thực thi sẽ đi theo các đường dẫn mã hơi khác nhau và điều đó mở ra khả năng có sự khác biệt đáng kể hơn.

Tôi nghĩ bạn nên thích cú pháp DISTINCT cho mục đích này. Đó không chỉ là thói quen, nó còn chỉ rõ hơn mục đích của truy vấn.


14

Đối với truy vấn bạn đã đăng, chúng giống hệt nhau. Nhưng đối với các truy vấn khác có thể không đúng sự thật.

Ví dụ: nó không giống như:

SELECT C FROM myTbl GROUP BY C, D

14

Tôi đã đọc tất cả các ý kiến ​​trên nhưng không thấy ai chỉ ra sự khác biệt chính giữa Nhóm By và Phân biệt ngoài bit tổng hợp.

Phân biệt trả về tất cả các hàng sau đó sao chép lại chúng trong khi Nhóm Bằng cách lặp lại các hàng khi chúng được đọc theo thuật toán từng cái một.

Điều này có nghĩa là họ có thể tạo ra kết quả khác nhau!

Ví dụ: các mã dưới đây tạo ra các kết quả khác nhau:

SELECT distinct ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable

 SELECT ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable
GROUP BY Name

Nếu có 10 tên trong bảng trong đó 1 tên trùng lặp với tên khác thì truy vấn đầu tiên trả về 10 hàng trong khi truy vấn thứ hai trả về 9 hàng.

Lý do là những gì tôi đã nói ở trên để họ có thể cư xử khác nhau!


11
Đó là bởi vì trong khi bạn chỉ nhóm Nametrong truy vấn thứ hai, distincttừ khóa áp dụng cho cả cột NameROW_NUMBER()cột của bạn trong selectmệnh đề của truy vấn đầu tiên. Nếu bạn cũng được nhóm theo cột đầu tiên trong truy vấn thứ hai, các truy vấn sẽ trả về kết quả tương tự.

Đây là một kết quả của order of executioncác khoản SQL đó là (theo nghĩa chung) FROM and ON (joins), WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT / OFFSET / TOPvì vậy các truy vấn thứ hai tên đang giảm về số lượng của nhóm bằng và sau đó là row_number () được áp dụng kết quả trong một hàng mỗi tên duy nhất. Trong truy vấn đầu tiên row_number () được áp dụng trước khi phân biệt được áp dụng và do tính chất của hàm row_number (), mỗi hàng có một số nguyên duy nhất, do đó mỗi hàng được trả về ngay cả khi có các giá trị tên lặp lại.
Được sử dụng_By_Al sẵn

12

Nếu bạn sử dụng DISTINCT với nhiều cột, tập kết quả sẽ không được nhóm theo nhóm với BY BY và bạn không thể sử dụng các hàm tổng hợp với DISTINCT.


11

Họ có ngữ nghĩa khác nhau, ngay cả khi họ có kết quả tương đương trên dữ liệu cụ thể của bạn.


6

GROUP BY có một ý nghĩa rất cụ thể khác biệt (heh) với hàm DISTINCT.

NHÓM BY làm cho các kết quả truy vấn được nhóm lại bằng biểu thức đã chọn, các hàm tổng hợp sau đó có thể được áp dụng và các hàm này sẽ hoạt động trên mỗi nhóm, thay vì toàn bộ tập kết quả.

Đây là một ví dụ có thể giúp:

Đưa ra một bảng trông như thế này:

name
------
barry
dave
bill
dave
dave
barry
john

Truy vấn này:

SELECT name, count(*) AS count FROM table GROUP BY name;

Sẽ tạo ra sản lượng như thế này:

name    count
-------------
barry   2
dave    3
bill    1
john    1

Điều này rõ ràng rất khác với việc sử dụng DISTINCT. Nếu bạn muốn nhóm kết quả của mình, hãy sử dụng NHÓM THEO, nếu bạn chỉ muốn một danh sách duy nhất của một cột cụ thể, hãy sử dụng DISTINCT. Điều này sẽ cung cấp cho cơ sở dữ liệu của bạn một cơ hội để tối ưu hóa truy vấn cho nhu cầu của bạn.


6

Vui lòng không sử dụng NHÓM THEO khi bạn có nghĩa là DISTINCT, ngay cả khi chúng xảy ra như nhau. Tôi cho rằng bạn đang cố gắng loại bỏ một phần nghìn giây khỏi các truy vấn và tôi phải chỉ ra rằng thời gian của nhà phát triển là các đơn đặt hàng lớn hơn thời gian của máy tính.


5

Nếu bạn đang sử dụng GROUP BY mà không có bất kỳ chức năng tổng hợp nào thì bên trong nó sẽ được coi là DISTINCT, vì vậy trong trường hợp này, không có sự khác biệt giữa GROUP BY và DISTINCT.

Nhưng khi bạn được cung cấp mệnh đề DISTINCT tốt hơn để sử dụng nó để tìm các bản ghi duy nhất của bạn vì mục tiêu của GROUP BY là để đạt được tổng hợp.


4

nhóm theo được sử dụng trong các hoạt động tổng hợp - như khi bạn muốn nhận được số lượng Bs được chia nhỏ theo cột C

select C, count(B) from myTbl group by C

khác biệt là những gì nó nghe như - bạn có được hàng độc đáo.

Trong máy chủ sql 2005, có vẻ như trình tối ưu hóa truy vấn có thể tối ưu hóa sự khác biệt trong các ví dụ đơn giản mà tôi đã chạy. Mặc dù vậy, nếu bạn có thể tin tưởng vào điều đó trong mọi tình huống.


3

Trong truy vấn cụ thể đó không có sự khác biệt. Nhưng, tất nhiên, nếu bạn thêm bất kỳ cột tổng hợp nào thì bạn sẽ phải sử dụng nhóm theo.


3

Trong phối cảnh Teradata :

Từ quan điểm của tập kết quả, sẽ không có vấn đề gì nếu bạn sử dụng DISTINCT hoặc GROUP BY trong Teradata. Bộ câu trả lời sẽ giống nhau.

Từ quan điểm hiệu suất, nó không giống nhau.

Để hiểu những gì ảnh hưởng đến hiệu suất, bạn cần biết những gì xảy ra trên Teradata khi thực hiện một câu lệnh với DISTINCT hoặc GROUP BY.

Trong trường hợp DISTINCT, các hàng được phân phối lại ngay lập tức mà không có bất kỳ sự phân chia nào diễn ra, trong trường hợp của NHÓM THEO, trong bước đầu tiên, quá trình preaggregation được thực hiện và chỉ sau đó là các giá trị duy nhất được phân phối lại trên các AMP.

Bây giờ đừng nghĩ rằng GROUP BY luôn tốt hơn từ quan điểm hiệu suất. Khi bạn có nhiều giá trị khác nhau, bước preaggregation của GROUP BY không hiệu quả lắm. Teradata phải sắp xếp dữ liệu để loại bỏ trùng lặp. Trong trường hợp này, trước tiên có thể tốt hơn cho phân phối lại, tức là sử dụng câu lệnh DISTINCT. Chỉ khi có nhiều giá trị trùng lặp, câu lệnh GROUP BY có lẽ là lựa chọn tốt hơn vì chỉ khi bước lặp lại diễn ra, sau khi phân phối lại.

Nói tóm lại, DISTINCT so với GROUP BY trong Teradata có nghĩa là:

NHÓM THEO -> cho nhiều bản sao DISTINCT -> không hoặc chỉ một vài bản sao. Đôi khi, khi sử dụng DISTINCT, bạn hết dung lượng bộ đệm trên AMP. Lý do là việc phân phối lại diễn ra ngay lập tức và xiên có thể khiến AMP hết dung lượng.

Nếu điều này xảy ra, có lẽ bạn có cơ hội tốt hơn với GROUP BY, vì các bản sao đã bị xóa trong bước đầu tiên và ít dữ liệu được di chuyển qua các AMP.


Teradata
Brettski

Teradata là một Hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS), có khả năng hỗ trợ nhiều người dùng đồng thời từ các nền tảng máy khách khác nhau. Teradata tương thích với tiêu chuẩn ANSI và được xây dựng hoàn toàn trên kiến ​​trúc song song.
Ram Ghadiyaram

2

Từ phối cảnh 'SQL, ngôn ngữ', hai cấu trúc tương đương nhau và cái nào bạn chọn là một trong những lựa chọn 'lối sống' mà tất cả chúng ta phải thực hiện. Tôi nghĩ rằng có một trường hợp tốt cho DISTINCT rõ ràng hơn (và do đó quan tâm hơn đến người sẽ kế thừa mã của bạn, v.v.) nhưng điều đó không có nghĩa là cấu trúc GROUP BY là một lựa chọn không hợp lệ.

Tôi nghĩ rằng 'NHÓM THEO là dành cho tổng hợp' là sự nhấn mạnh sai. Dân gian cần lưu ý rằng chức năng thiết lập (MAX, MIN, COUNT, v.v.) có thể được bỏ qua để họ có thể hiểu ý định của người viết mã khi có.

Trình tối ưu hóa lý tưởng sẽ nhận ra các cấu trúc SQL tương đương và sẽ luôn chọn kế hoạch lý tưởng phù hợp. Đối với công cụ SQL thực tế của bạn, bạn phải kiểm tra :)

PS lưu ý vị trí của từ khóa DISTINCT trong mệnh đề select có thể tạo ra các kết quả khác nhau, ví dụ như độ tương phản:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

1

Bạn chỉ nhận thấy điều đó bởi vì bạn đang chọn một cột duy nhất.

Hãy thử chọn hai lĩnh vực và xem những gì sẽ xảy ra.

Nhóm By dự định sẽ được sử dụng như thế này:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

Mà sẽ hiển thị tổng của tất cả các giao dịch cho mỗi người.


Đây không phải là một câu hỏi tổng hợp. Trong ví dụ của bạn, CHỌN c, d TỪ NHÓM mytbl B CNG C, D; trên thực tế sẽ trả về cùng một bộ dữ liệu như CHỌN DISTINCT C, D TỪ mytbl; Đây là nguyên tắc cơ bản của câu hỏi
Brettski

1

Tôi biết đó là một bài viết cũ. Nhưng điều xảy ra là tôi đã có một truy vấn sử dụng nhóm chỉ bằng cách trả về các giá trị riêng biệt khi sử dụng truy vấn đó trong cóc và báo cáo mọi thứ đều hoạt động tốt, ý tôi là thời gian phản hồi tốt. Khi chúng tôi di chuyển từ Oracle 9i đến 11g, thời gian phản hồi trong Toad rất tuyệt vời nhưng trong bản báo cáo, mất khoảng 35 phút để hoàn thành báo cáo khi sử dụng phiên bản trước đó mất khoảng 5 phút.

Giải pháp là thay đổi nhóm bằng cách sử dụng DISTINCT và bây giờ báo cáo sẽ chạy trong khoảng 30 giây.

Tôi hy vọng điều này hữu ích cho những người có cùng hoàn cảnh.


1

Về mặt sử dụng, GROUP BY được sử dụng để nhóm các hàng bạn muốn tính toán. DISTINCT sẽ không làm bất kỳ tính toán. Nó sẽ hiển thị không có hàng trùng lặp.

Tôi luôn sử dụng DISTINCT nếu tôi muốn trình bày dữ liệu mà không trùng lặp.

Nếu tôi muốn thực hiện các phép tính như tổng hợp tổng số lượng xoài, tôi sẽ sử dụng NHÓM THEO


0

Cách tôi luôn hiểu đó là việc sử dụng riêng biệt giống như việc phân nhóm theo từng lĩnh vực bạn đã chọn theo thứ tự bạn đã chọn chúng.

I E:

select distinct a, b, c from table;

giống như:

select a, b, c from table group by a, b, c

Đồng ý, nhưng sẽ giống như chọn c, b, a từ nhóm bảng theo a, b, c
Dheer

Vâng, nó sẽ giống nhau
Caius Jard

0

Hiệu quả tự do là hoàn toàn khác nhau. Nếu bạn chỉ muốn chọn "giá trị trả về" ngoại trừ trùng lặp, sử dụng phân biệt sẽ tốt hơn nhóm theo. Bởi vì "nhóm theo" bao gồm (sắp xếp + loại bỏ), "khác biệt" bao gồm (loại bỏ)



0

Đôi khi chúng có thể cho bạn kết quả giống nhau nhưng chúng được sử dụng theo nghĩa / trường hợp khác nhau. Sự khác biệt chính là trong cú pháp.

Ít chú ý ví dụ dưới đây. DISTINCTđược sử dụng để lọc ra các bộ giá trị trùng lặp. (6, cs, 9.1) và (1, cs, 5.5) là hai bộ khác nhau. Vì vậy, DISTINCTsẽ hiển thị cả hai hàng trong khi GROUP BY Branchsẽ chỉ hiển thị một bộ.

 SELECT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT DISTINCT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT * FROM student GROUP BY Branch;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    2 | mech   |  6.3 |
+------+--------+------+
4 rows in set (0.001 sec)

Đôi khi, kết quả có thể đạt được bằng GROUP BYmệnh đề là không thể đạt đượcDISTINCT không sử dụng một số điều khoản hoặc điều kiện bổ sung. Ví dụ trong trường hợp trên.

Để có được kết quả tương tự như DISTINCTbạn phải vượt qua tất cả các tên cột trong GROUP BYmệnh đề như dưới đây. Vì vậy, xem sự khác biệt cú pháp. Bạn phải có kiến ​​thức về tất cả các tên cột để sử dụng GROUP BYmệnh đề trong trường hợp đó.

SELECT * FROM student GROUP BY Id, Branch, CGPA;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    1 | cs     |  5.5 |
|    2 | mech   |  6.3 |
|    3 | civil  |  7.2 |
|    4 | eee    |  8.2 |
|    6 | cs     |  9.1 |
+------+--------+------+

Ngoài ra, tôi đã nhận thấy GROUP BYhiển thị các kết quả theo thứ tự tăng dần theo mặc địnhDISTINCT không. Nhưng tôi không chắc về điều này. Nó có thể là nhà cung cấp khác nhau khôn ngoan.

Nguồn: https://dbjpanda.me/dbms/lacular/sql/sql-syntax-with-examples#group-by


0

Nói chung, chúng tôi có thể sử dụng DISTINCTđể loại bỏ các bản sao trên Cột cụ thể trong bảng.

Trong trường hợp của 'GROUP BY' chúng ta có thể Áp dụng các chức năng tập hợp như AVG, MAX, MIN,SUM , và COUNTtrên cột cụ thể và lấy tên cột và nó kết hợp chức năng kết quả trên cùng một cột.

Thí dụ :

select  specialColumn,sum(specialColumn) from yourTableName group by specialColumn;

-1

Không có sự khác biệt đáng kể giữa nhóm theo và mệnh đề riêng biệt ngoại trừ việc sử dụng các hàm tổng hợp. Cả hai có thể được sử dụng để phân biệt các giá trị nhưng nếu trong quan điểm hiệu suất của nhóm xem là tốt hơn. Khi từ khóa riêng biệt được sử dụng, bên trong nó đã sử dụng thao tác sắp xếp có thể được xem trong kế hoạch thực hiện.

Hãy thử ví dụ đơn giản

Khai báo bảng @tmpresult (Id tinyint)

Chèn vào @tmpresult Chọn 5 Union all Chọn 2 Union all Chọn 3 Union all Chọn 4

Chọn Id khác biệt từ @tmpresult


khác biệt và nhóm bởi cả hai sẽ
vignesh
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.