GROUP BY ve DISTINCT arasında herhangi bir fark var mı


310

Geçen gün SQL hakkında basit bir şey öğrendim:

SELECT c FROM myTbl GROUP BY C

Şununla aynı sonucu verir:

SELECT DISTINCT C FROM myTbl

Merak ettiğim şey, bir SQL motorunun komutu işleme biçiminde farklı bir şey var mı, yoksa gerçekten aynı şey mi?

Ben şahsen ayrı sözdizimini tercih ediyorum, ama eminim alışkanlıktan başka her şeyden daha fazla.

EDIT: Bu kümeler hakkında bir soru değil. Kullanımı GROUP BYtoplam işlevleri ile anlaşılır.


11
Bu, toplamalar hakkında bir soru değildir, hiçbir toplama işlevi olmadığında farklı olarak aynı şekilde işlev gören bir GROUP BY işlevidir
Brettski

2
Ayrıca SELECT c FROM myTbl UNION SELECT c FROM myTblaynı sonucu da elde edebilirsiniz ... Peki SELECT DISTINCT bu kadar kolay olduğunda neden işleri karmaşık hale getirir.
jarlh

'Mantıksal yürütme sırası' GROUP BY'SEÇ' 'den çok daha erken ve DISTINCTselect'i izliyor.
Used_By_Already

Bahsetmediğim çok küçük bir fark DISTINCT, alanın gerçekten seçilmesiyle sonuçlanmasıdır - yani, sonuç kümesinde değer görünecektir. GROUP BYalanı seçmeden kopyaları etkili bir şekilde kaldırabilir. Bu, çoğu durumda biraz ilgisizdir, ancak diğerlerinde tam olarak istediğiniz şey olabilir. Bunun GROUP BYyerine sonuna kadar kullanırsanız DISTINCT, muhtemelen kodda açıklayıcı bir yorum yapılması gerekir.
rinogo

Sonuç olarak, yinelenen kaldırma, yürütme planındaki farklı noktalarda gerçekleştiği için, yinelenen kaldırma, bu dizinin bu dizin üzerinde bir tür veya belki de kullanılmasını gerektirdiğinden, diğerinden daha verimli olabilir. Bu nedenle, erken dup çıkarmanın bir avantajı olabilir veya avantajı, farklı bir endeksin erken kullanılmasından ve birkaç satır kaldığında ve sıralama ihmal edilebilir olduğunda bir tür yemek yemekten gelebilir.
bielawski

Yanıtlar:


246

MusiGenesis'in yanıtı, sorunuzun belirttiği şekilde işlevsel olarak doğru cevaptır; SQL Server, "Group By" kullanıyorsanız ve herhangi bir toplama işlevi kullanmıyorsanız, aslında ne demek istediğinizin "Distinct" olduğunu fark edecek kadar akıllıdır ve bu nedenle, "Distinct" i kullandığınız gibi bir yürütme planı oluşturur. ."

Bununla birlikte, Hank'in yanı sıra "Group By" ve "Distinct" in daha sade bir şekilde tedavi edilmesinin, dikkat etmezseniz bazı zararlı yakalamalara yol açabileceğini belirtmek önemlidir . Bunun "toplamalarla ilgili bir soru" olmadığını söylemek tamamen doğru değildir, çünkü biri SQL Server anahtar sözcükleri arasındaki işlevsel farkları soruyorsunuz. Bunlardan biri toplamalarla kullanılmak üzere olan biri olmayan.

Bir çekiç bazen bir vidayı sürmek için çalışabilir, ancak kullanışlı bir tornavida varsa, neden rahatsız edesin?

(bu benzetmenin amaçları için Hammer : Screwdriver :: GroupBy : Distinctve screw => get list of unique values in a table column)


Skeolan ile seninle tamamen hemfikirim. Bu işlevselliğe rastladığımda oldukça şaşırdım. Kullanmayı planladığım bir şey değil, ama çalıştığım bu yeni yerde bir şeyler yapıldı.
Brettski

En azından Oracle 12'de, DISTINCT'in, UNION ile farklı değerler elde ettiği ve GROUP BY'ın farklı çalıştığı durumlar var gibi görünüyor. Sadece daha önce DISTINCT ve UNION tarafından farklı bir kehanet hatasına neden olan bir durumum vardı, ancak GROUP BY çalıştı; Bir görünümden yalnızca 1 sütun seçiyordum ve herhangi bir toplama kullanmıyordum; Hala neden gerekli olduğunu merak ediyorum, ama yürütmede bazı farklar olduğunu onaylıyor. Diğerlerinin işaret ettiği gibi, seçimde olmayan GROUP BY sütunlarını da kullanmanızı sağlar, ancak bu toplama olmadan nadiren gerekli olur.
ZeroK

1
SQL söz konusu olduğunda, her zaman bir tornavida ve çekiç kullanılabilir. Bir vidayı sürmek için neden bir çekiç kullanılır?
jarlh

Sadece size benzetme konusunda net olmak için - çekiçiniz == GroupBy ve tornavida == Bu durumda farklı mı?
HopeKing

Vay canına, bu on yaşındaki sorunun hala bacakları var! "Benzersiz değerler listesi" vida ise "Farklı" tornavidadır. Benzetmeyi daha net hale getirmek için cevabı güncelleyeceğim.
Skeolan

136

GROUP BYEğer toplama işlevleri kullanmak sağlar gibi AVG, MAX, MIN, SUM, ve COUNT. Öte yandan DISTINCTsadece kopyaları kaldırır.

Örneğin, bir sürü satın alma kaydınız varsa ve her departman tarafından ne kadar harcandığını bilmek istiyorsanız, şöyle bir şey yapabilirsiniz:

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

Bu size departman başına bir satır verir ve departman adını ve amounto departman için tüm satırlardaki tüm değerlerin toplamını içerir .


2
GROUP BY kullanımını anlıyorum, Soru, toplama işlevi olmadığında ayrı bir veri kümesi döndürmesi gerçeğine dayanmaktadır.
Brettski

2
Çünkü GROUP BY, gruplandırdığınız sütunun değerleri üzerinde dolaylı olarak bir DISTINCT yapar (kakofoni için özür dilerim).
Joe Pineda

DISTINCT+ Toplama işlevleri kullanmak mümkün değil mi? select distinct department, SUM(amount) from ...
Şunun

@Sajad, Evet yapabilirsin, ama hala GROUP BY'a sahip olmalısın, böylece DISTINCT senin için hiçbir şey yapmaz.
ZeroK


40

Yalnızca yinelenen kaldırma işlevselliği açısından fark nedir

Bunun aksine DISTINCT, grup başınaGROUP BY verilerin toplanmasına izin verdiği gerçeğinin yanı sıra (diğer birçok cevapla belirtilmiştir), bence en önemli fark, iki işlemin mantıksal sırada iki farklı adımda "gerçekleşmesi" dir. ifadede yürütülen işlemlerin listesi .SELECT

İşte en önemli işlemler:

  • FROM(dahil JOIN, APPLYvb)
  • WHERE
  • GROUP BY (kopyaları kaldırabilir)
  • toplamaları
  • HAVING
  • Pencere fonksiyonları
  • SELECT
  • DISTINCT (kopyaları kaldırabilir)
  • UNION, INTERSECT, EXCEPT (Çiftleri kaldırabilir)
  • ORDER BY
  • OFFSET
  • LIMIT

Gördüğünüz gibi, her işlemin mantıksal sırası, onunla neler yapılabileceğini ve sonraki işlemleri nasıl etkilediğini etkiler. Özellikle, aslında o GROUP BYoperasyon "önce olur"SELECT işlemi (projeksiyon) araçlarının:

  1. Projeksiyona bağlı değildir (bu bir avantaj olabilir)
  2. Projeksiyondaki hiçbir değeri kullanamaz (bu bir dezavantaj olabilir)

1. Bu projeksiyona bağlı değildir

Yansıtmaya bağlı olmamanın yararlı olduğu bir örnek, pencere işlevlerini farklı değerlerde hesaplamak istiyorsanız:

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

Sakila veritabanına karşı çalıştırıldığında , bu şu sonuçları verir:

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

Aynı şey DISTINCTkolayca gerçekleştirilemedi:

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

Bu sorgu "yanlış" ve aşağıdaki gibi bir sonuç veriyor:

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

İstediğimiz bu değil. DISTINCTOperasyon "sonra olur" artık kaldırmak böylece, projeksiyon DISTINCTpencere fonksiyonu zaten hesaplanmış ve yansıtılan çünkü derecelendirme. Kullanım için DISTINCT, biz sorgu bir parçası olduğunu yuva olurdu:

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

Yan not: Bu özel durumda,DENSE_RANK()

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

2. Projeksiyondaki hiçbir değeri kullanamaz

SQL'in dezavantajlarından biri, zaman zaman ayrıntı vermesidir. Daha önce gördüğümüzle aynı nedenden ötürü (yani mantıksal işlem sırası), yansıttığımız bir şeye göre "kolayca" gruplayamayız.

Bu geçersiz SQL:

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

Bu geçerlidir (ifadeyi tekrarlamak)

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

Bu da geçerlidir (ifadeyi iç içe yerleştirme)

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

Bu konu hakkında bir blog yazısında daha derinlemesine yazdım


İcra emrinin bu soru üzerinde hemen tartışılmadığını görmek beni gerçekten şaşırttı. Teşekkür ederim, çok güzel açıkladı. 2. noktanızda, bazı (bir?) Db'ler sorgu boyunca seçilen takma adların kullanılmasına izin verir (bildiğim Teradata, ancak bir istisnadır).
Used_By_Already

@Used_By_Already: Tabii, bazı veritabanları bunu yapıyor. Birçok veritabanı bu takma adların sadece bölümlerde kullanılmasına izin verir (örneğin değil, WHEREbelki de GROUP BY). Her durumda, bunun kötü bir fikir olduğunu düşünüyorum ve bu özelliği taşınabilirlik ve bakım nedenleriyle asla kullanmamanızı öneriyorum. "Aniden" artık çalışmaz, örneğin bir toplama işlevini veya pencere işlevini yumuşatırken.
Lukas Eder

never using that feature for portability and maintenance reasons!! % 100 kabul etti ... Ve şimdi blogunuzu da enjekte ediyorum, harika iş. Şerefe.
Used_By_Already

32

Kullan DISTINCTsadece çiftleri elemek istiyorum. Kullanın GROUPY BYEğer agrega operatörleri uygulamak istiyorsanız ( MAX, SUM, GROUP_CONCAT, ..., veya bir HAVINGmaddesi).


19

İnfazlarında küçük farklılıklar olasılığı olduğunu düşünüyorum. Oracle 10g'de bu satırlar boyunca işlevsel olarak eşdeğer iki sorgu için yürütme planlarını kontrol ettim:

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

Orta işlem biraz farklıdır: "HASH GROUP BY" ile "HASH UNIQUE" karşılaştırması yapılır, ancak tahmini maliyetler vb. Aynıdır. Daha sonra bunları izleme ile yürüttüm ve gerçek işlem sayıları her ikisi için de aynıydı (ikincisinin önbellekleme nedeniyle herhangi bir fiziksel okuma yapmak zorunda olmaması dışında).

Ancak, işlem adları farklı olduğu için, yürütmenin biraz farklı kod yollarını izleyeceğini ve bu da daha önemli farklılıklar olasılığını açtığını düşünüyorum.

Bu amaçla DISTINCT sözdizimini tercih etmelisiniz. Bu sadece alışkanlık değil, aynı zamanda sorgunun amacını daha açık bir şekilde gösterir.


14

Gönderdiğiniz sorgu için aynılar. Ancak diğer sorgular için bu doğru olmayabilir.

Örneğin, şu ile aynı değildir:

SELECT C FROM myTbl GROUP BY C, D

14

Yukarıdaki tüm yorumları okudum, ancak toplama biti dışında Group By ve Distinct arasındaki ana farka kimsenin işaret ettiğini görmedim.

Farklı tüm satırları döndürür, sonra bunların çoğaltırken Grupla, sıraları algoritma tarafından tek tek okunduklarında tekilleştirmeyi kaldırır.

Bu, farklı sonuçlar üretebilecekleri anlamına gelir!

Örneğin, aşağıdaki kodlar farklı sonuçlar üretir:

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

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

Tabloda 1 adının diğerinin kopyası olduğu 10 ad varsa, ilk sorgu 10 satır, ikinci sorgu 9 satır döndürür.

Bunun nedeni yukarıda söylediğim şeydir, böylece farklı davranabilirler!


11
Yalnızca göre gruplama yaparken Çünkü Nameikinci sorguda, distinctanahtar kelime sütunlar için geçerlidir Nameve ROW_NUMBER()sütunun selectilk sorgunun maddesi. Ayrıca ikinci sorgudaki ilk sütuna göre gruplasaydınız, sorgular aynı sonuçları döndürürdü.

Bu bir çıktısı olarak elde edilen order of execution(genel anlamda) SQL maddelerinin FROM and ON (joins), WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT / OFFSET / TOPbir satır elde uygulanır adları, grup sayısı azaltılır ikinci sorgu ve daha sonra ROW_NUMBER (), böylece benzersiz isim başına. İlk sorguda row_number (), farklı uygulanmadan önce uygulanır ve row_number () işlevinin doğası gereği her satır benzersiz bir tamsayı alır, böylece yinelenen ad değerleri olsa bile her satır döndürülür.
Used_By_Already

12

DISTINCT işlevini birden çok sütunla kullanırsanız, sonuç kümesi GROUP BY ile olduğu gibi gruplandırılmaz ve DISTINCT ile toplama işlevlerini kullanamazsınız.


11

Belirli verilerinizde eşdeğer sonuçlar elde etseler bile, farklı anlambilimleri vardır.


6

GROUP BY, DISTINCT işlevinden farklı (heh) çok özel bir anlama sahiptir.

GROUP BY, sorgu sonuçlarının seçilen ifade kullanılarak gruplandırılmasına neden olur, daha sonra toplama işlevleri uygulanabilir ve bunlar sonuç kümesinin tamamı yerine her grup üzerinde etkili olur.

İşte size yardımcı olabilecek bir örnek:

Şuna benzer bir tablo verildi:

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

Bu sorgu:

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

Bunun gibi çıktılar üretecek:

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

Hangi DISTINCT kullanmaktan çok farklı. Sonuçlarınızı gruplandırmak istiyorsanız GROUP BY kullanın, yalnızca belirli bir sütunun benzersiz bir listesini istiyorsanız DISTINCT kullanın. Bu, veritabanınıza sorguyu ihtiyaçlarınız için optimize etme şansı verecektir.


6

Lütfen aynı işi yapsalar bile, DISTINCT demek istediğinizde GROUP BY kullanmayın. Sorgulardan milisaniye tıraş olmaya çalıştığınızı varsayıyorum ve geliştirici zamanının bilgisayar zamanından daha pahalı büyüklük siparişleri olduğunu belirtmeliyim.


5

Herhangi bir toplama işlevi olmadan GROUP BY kullanıyorsanız, dahili olarak DISTINCT olarak işlem görecektir, bu durumda GROUP BY ve DISTINCT arasında bir fark yoktur.

Ancak DISTINCT yan tümcesi sağlandığında, benzersiz kayıtlarınızı bulmak için kullanmak daha iyidir çünkü GROUP BY'ın amacı birleştirme elde etmektir.


4

group by, toplu işlemlerde kullanılır - C sütununa göre ayrılmış bir Bs sayısı almak istediğinizde olduğu gibi

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

farklı göründüğü gibi - benzersiz satırlar elde edersiniz.

Sql server 2005'te, sorgu optimize edici çalıştırdığım basit örneklerde farkı optimize edebiliyor gibi görünüyor. Yine de, her durumda buna güvenebilirseniz.


3

Bu sorguda hiçbir fark yoktur. Ancak, elbette, herhangi bir toplu sütun eklerseniz, gruplama ölçütü kullanmanız gerekir.


3

Teradata perspektifinde :

Sonuç kümesi açısından Teradata'da DISTINCT veya GROUP BY kullanmanız önemli değildir. Yanıt seti aynı olacaktır.

Performans açısından bakıldığında, bu aynı değildir.

Performansı neyin etkilediğini anlamak için, DISTINCT veya GROUP BY ile bir ifade yürütürken Teradata'da neler olduğunu bilmeniz gerekir.

DISTINCT söz konusu olduğunda, sıralar herhangi bir ön ayırma yapılmadan hemen yeniden dağıtılırken, GROUP BY durumunda ilk adımda bir ön ayırma yapılır ve ancak o zaman AMP'ler arasında yeniden dağıtılan benzersiz değerlerdir.

Şimdi GROUP BY'ın performans açısından her zaman daha iyi olduğunu düşünmeyin. Birçok farklı değeriniz olduğunda, GROUP BY'ın önceden toplanma adımı çok verimli değildir. Teradata, kopyaları kaldırmak için verileri sıralamak zorundadır. Bu durumda, önce yeniden dağıtım için daha iyi olabilir, yani DISTINCT deyimini kullanın. Yalnızca yinelenen çok sayıda değer varsa, yeniden dağıtım adımından sonra yeniden dağıtım işleminden sonra GROUP BY deyimi muhtemelen daha iyi bir seçimdir.

Kısacası, Teradata'daki DISTINCT ve GROUP BY:

GROUP BY -> birçok kopya için DISTINCT -> hayır veya sadece birkaç kopya. Bazen, DISTINCT kullanırken, bir AMP'de biriktirme alanınız tükenir. Bunun nedeni, yeniden dağıtımın hemen gerçekleşmesidir ve eğriltme, AMP'lerin alanının bitmesine neden olabilir.

Böyle bir durumda, kopyalar ilk adımda zaten kaldırıldığından ve daha az veri AMP'ler arasında taşındığından, GROUP BY ile muhtemelen daha iyi bir şansınız vardır.


Nedir Teradata?
Brettski

Teradata, çeşitli istemci platformlarından birçok eşzamanlı kullanıcıyı destekleyebilen bir İlişkisel Veritabanı Yönetim Sistemidir (RDBMS). Teradata, ANSI standardıyla uyumludur ve tamamen paralel mimari üzerine inşa edilmiştir.
Ram Ghadiyaram

2

'SQL dil' perspektifinden bakıldığında, iki yapı eşdeğerdir ve seçtiğiniz yapı, hepimizin yapması gereken 'yaşam tarzı' seçimlerinden biridir. DISTINCT daha açık (ve bu nedenle kodunuzu devralacak kişi için daha düşünceli) için iyi bir durum olduğunu düşünüyorum ama bu GROUP BY yapı geçersiz bir seçim olduğu anlamına gelmez.

Bence bu 'GROUP BY kümeler içindir' yanlış vurgu. Halk, kodlayıcının amacını anlayabilmeleri için ayar fonksiyonunun (MAX, MIN, COUNT, vb.) Atlanabileceğini bilmelidir.

İdeal iyileştirici eşdeğer SQL yapılarını tanıyacak ve her zaman buna göre ideal planı seçecektir. Seçtiğiniz gerçek hayattaki SQL motorunuz için test etmelisiniz :)

Not: DISTINCT anahtar sözcüğünün select yan tümcesindeki konumunun farklı sonuçlar üretebileceğini unutmayın, örneğin kontrast:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

1

Bunu sadece tek bir sütun seçtiğiniz için fark ediyorsunuz.

İki alan seçmeyi deneyin ve ne olduğunu görün.

Group By şu şekilde kullanılmak üzere tasarlanmıştır:

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

Bu, her bir kişi için tüm işlemlerin toplamını gösterir.


Bu toplu bir mesele değildir. Örneğinizde, mytbl GROUP BY C, D'den c, d SEÇİN; aslında miTbl'den SELECT DISTINCT C, D ile aynı veri kümesini döndürecektir; Bu sorunun temelleri
Brettski

1

Eski bir yazı olduğunu biliyorum. Ama kurbağa ve oracle raporlarında bu sorguyu kullanırken sadece farklı değerler döndürmek için grup tarafından kullanılan bir sorgu vardı her şeyin yolunda gittiğini, iyi bir yanıt süresi demek istiyorum. Oracle 9i'den 11g'ye geçtiğimizde, Toad'daki yanıt süresi mükemmeldi, ancak raporda önceki sürümü kullanırken raporu bitirmek yaklaşık 35 dakika sürdü.

Çözüm grubu değiştirmek ve DISTINCT kullanmaktı ve şimdi rapor yaklaşık 30 saniye içinde çalışıyor.

Umarım bu durum aynı duruma sahip biri için faydalıdır.


1

Kullanım açısından, hesaplamak istediğiniz satırları gruplandırmak için GROUP BY kullanılır. DISTINCT hiçbir hesaplama yapmaz. Yinelenen satır göstermez.

Yinelenmeden veri sunmak istersem her zaman DISTINCT kullandım.

Toplam mango miktarını toplamak gibi hesaplamalar yapmak istersem GROUP BY kullanacağım


0

Her zaman anladığım şekilde, farklı kullanmak, seçtiğiniz her alana göre onları seçtiğiniz sırayla gruplamakla aynıdır.

yani:

select distinct a, b, c from table;

aynıdır:

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

Kabul etti, ancak a, b, c ile tablo grubundan seçin c, b, a ile aynı olurdu
Dheer

Evet, aynı olurdu
Caius Jard

0

Fonksiyonel verimlilik tamamen farklıdır. Yinelenen dışında yalnızca "dönüş değeri" ni seçmek isterseniz, farklı olanı kullanmak gruplamadan daha iyidir. "Gruplama ölçütü" içerme (sıralama + kaldırma) içerdiğinden, "farklı" dahil etme (kaldırma)



0

Bazen size aynı sonuçları verebilirler, ancak farklı anlamda / durumlarda kullanılması amaçlanmıştır. Temel fark sözdizimindedir.

Aşağıdaki örneğe dikkat edin. DISTINCTyinelenen değerler kümesini filtrelemek için kullanılır. (6, cs, 9.1) ve (1, cs, 5.5) iki farklı kümedir. Yani sadece bir kümeyi DISTINCTgösterirken her iki satırı GROUP BY Branchda gösterecektir.

 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)

Bazen GROUP BYfıkra ile elde edilebilecek sonuçların,DISTINCT bazı ilave fıkra veya koşullar kullanılmadan . Örneğin yukarıdaki durumda.

Aynı sonucu elde etmek DISTINCTiçin tüm sütun adlarını GROUP BYaşağıdaki gibi yan tümcede geçirmeniz gerekir. Yani sözdizimsel farka bakın. Bu GROUP BYdurumda yan tümcesi kullanmak için tüm sütun adları hakkında bilgi sahibi olmanız gerekir .

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

Ayrıca ben GROUP BYsonuçları varsayılan olarak artan sırada görüntüler fark ettim DISTINCT. Ama bundan emin değilim. Farklı satıcılar farklı olabilir.

Kaynak: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by


0

Genellikle DISTINCTtablodaki Belirli Sütundaki kopyaları ortadan kaldırmak için kullanabiliriz .

'GROUP BY' Durumunda biz gibi Toplama İşlevleri uygulayın edebilir AVG, MAX, MIN, SUM, ve COUNTÖzgül sütun üzerinde ve sütun adını alıp aynı sütunda toplama işlevi sonucu.

Misal :

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

-1

Toplama işlevlerinin kullanılması dışında, gruplama ölçütü ile ayrı yan tümce arasında önemli bir fark yoktur. Her ikisi de değerleri ayırt etmek için kullanılabilir, ancak performans bakış açısına göre daha iyi ise. Farklı anahtar kelime kullanıldığında, dahili olarak yürütme planında görüntülenebilecek sıralama işlemi kullandı.

Basit bir örnek deneyin

@Tmpresult tablosu bildir (Id tinyint)

@Tmpresult'a ekle 5 Birlik seçin Tümü 2 Birlik seçin Tümü 3 Birlik tümü seçin 4

Farklı bir kimlik seçin @tmpresult


her iki grup tarafından ayrı ve grup
vignesh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.