Чи є різниця між GROUP BY та DISTINCT


310

Я дізнався щось про SQL днями:

SELECT c FROM myTbl GROUP BY C

Має такий же результат, як:

SELECT DISTINCT C FROM myTbl

Мені цікаво, чи є щось інше в тому, як движок SQL обробляє команду, чи вони справді те саме?

Я особисто віддаю перевагу виразному синтаксису, але впевнений, що це більше за звичкою, ніж будь-що інше.

EDIT: Це питання не про агрегати. GROUP BYЗрозуміло використання із сукупними функціями.


11
Це не питання щодо агрегатів, це група, яка функціонує так само, як і окрема, коли функція сукупності відсутня
Бретцький

2
Ви також можете зробити SELECT c FROM myTbl UNION SELECT c FROM myTblі отримати той самий результат ... Але навіщо ускладнювати речі, коли ВИБІР ВИДАЛЕННЯ так просто.
jarlh

"Логічний порядок виконання" у програмі GROUP BYнабагато раніше, ніж "SELECT" і DISTINCTнаступний вибір.
Б / у_By_Already

Єдина незначна різниця, яку я не бачив, - це те, що DISTINCTфактично вибирається поле - тобто значення з'явиться в наборі результатів. GROUP BYможе ефективно видаляти дублікати, не фактично вибираючи поле. У більшості випадків це дещо не має значення, але в інших може бути саме те, що ви хочете. Якщо ви GROUP BYзамість цього використовуєте замість цього DISTINCT, пояснюючий коментар у коді, ймовірно, є обґрунтованим.
rinogo

Суть полягає в тому, що оскільки видалення дублікатів відбувається в різних точках плану виконання, одне може бути ефективнішим, ніж інше, оскільки для видалення дубліка потрібен сорт або, можливо, використання цього індексу над цим індексом. Таким чином, може бути перевага від раннього видалення дублювання або перевага може бути використана іншим індексом на ранніх термінах та поїданням сорту пізніше, коли залишилося небагато рядків, і сортування незначне.
bielawski

Відповіді:


246

Відповідь MusiGenesis є функціонально правильною щодо Вашого запитання; SQL Server досить розумний, щоб зрозуміти, що якщо ви використовуєте "Групувати за" і не використовуєте жодних сукупних функцій, то, що ви насправді маєте на увазі, є "Відмінність" - і, отже, він генерує план виконання, як якщо б ви просто використовували "Розрізнювати" . "

Однак, я думаю, що важливо відзначити відповідь Хенка також - кавалерське поводження "Group By" та "Distinct" може призвести до деяких згубних випадків, якщо ви не будете обережні. Не зовсім коректно сказати, що це "не питання щодо агрегатів", оскільки ви запитуєте про функціональну різницю двох ключових слів SQL-запиту, одне з яких призначене для використання з агрегатами, а одне - ні.

Молоток може спрацьовувати, коли іноді заїжджаєш гвинтом, але якщо у тебе викрутка зручна, навіщо турбуватись?

(для цілей цієї аналогії Hammer : Screwdriver :: GroupBy : Distinctта screw => get list of unique values in a table column)


Я цілком з вами згоден Скеолан. Я був дуже здивований, коли натрапив на цю функціональність. Це не те, що я планую використовувати, але спосіб, як це було зроблено на цьому новому місці, в якому я працюю.
Брецький

Принаймні, в Oracle 12 трапляються випадки, коли ВИДАЛЯТИ, отримуючи відмінні значення від UNION та GROUP BY, працюють по-різному. Раніше сьогодні у мене був випадок, коли DISTINCT та відмінність від UNION викликають помилку оракула, але GROUP BY працював; Я вибирав лише 1 стовпець із представлення даних і не використовував агрегації; Я все ще здивований, чому це вимагало, але це підтверджує, що є певна різниця у виконанні. Як зазначають інші, він також дозволяє вам групувати за стовпцями "GRY BY", але це рідко потрібно без агрегування.
ZeroK

1
Що стосується SQL, у вас завжди є як викрутка, так і молоток. Навіщо використовувати молоток для приводу гвинта?
jarlh

Просто, щоб було зрозуміло щодо вашої аналогії - чи ваш молоток == GroupBy і викрутка == Відмітний у цьому випадку?
HopeKing

Ого, у цього десятирічного питання все ще є ноги! "Відмінна" - це викрутка, якщо "список унікальних значень" - це гвинт. Я оновлю відповідь, щоб зробити аналогію яснішою.
Скеолан

136

GROUP BYдозволяє використовувати агрегатні функції, як AVG, MAX, MIN, SUMі COUNT. З іншого боку, DISTINCTпросто видаляє дублікати.

Наприклад, якщо у вас є купа записів про покупки, і ви хочете знати, скільки витратив кожен відділ, ви можете зробити щось на кшталт:

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

Це дасть вам один рядок на відділ, який містить назву відділу та суму всіх amountзначень у всіх рядках для цього відділу.


2
Використання GROUP BY Я розумію, запитання засноване на тому, що він повертає окремий набір даних, коли немає сукупної функції.
Бретцький

2
Оскільки GROUP BY неявно робить DISTINCT над значеннями стовпця, за яким ви групуєте (вибачте за какофонію).
Джо Пінеда

Чи не можливо використовувати DISTINCT+ сукупні функції? ось так:select distinct department, SUM(amount) from ...
Шафізаде

@Sajad, ти можеш це зробити так, але ти все одно повинен мати ГРУПУ ПО, так що ДИСТИНЦТ не робить для тебе нічого.
ZeroK

44

Різниці немає (принаймні, у SQL Server). Обидва запити використовують один і той же план виконання.

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

Можливо, є різниця, якщо задіяні підзапити:

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

Немає різниці (у стилі Oracle):

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


40

У чому полягає відмінність від простого дублювання функцій видалення з точки зору

Крім того, що на відміну від того DISTINCT, що GROUP BYдозволяє агрегувати дані по групі (про що згадувалося в багатьох інших відповідях), найважливішою відмінністю, на мою думку, є той факт, що дві операції "відбуваються" на двох дуже різних кроках у логічному порядку операцій, які виконуються у SELECTвиписці .

Ось найважливіші операції:

  • FROM( В тому числі JOIN, APPLYі т.д.)
  • WHERE
  • GROUP BY (може видалити дублікати)
  • Агрегації
  • HAVING
  • Віконні функції
  • SELECT
  • DISTINCT (може видалити дублікати)
  • UNION, INTERSECT, EXCEPT (Можна видалити дублікати)
  • ORDER BY
  • OFFSET
  • LIMIT

Як бачимо, логічний порядок кожної операції впливає на те, що можна зробити з нею і як вона впливає на наступні операції. Зокрема, той факт , що GROUP BYоперація «відбувається до» на SELECTоперації (проекція) означає , що:

  1. Це не залежить від проекції (що може бути перевагою)
  2. Він не може використовувати жодні значення проекції (що може бути недоліком)

1. Це не залежить від проекції

Приклад, коли не залежно від проекції є корисним, якщо ви хочете обчислити віконні функції за різними значеннями:

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

Якщо працювати з базою даних Sakila , це дає:

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

Те ж неможливо досягти DISTINCTлегко:

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

Цей запит є "неправильним" і дає щось на кшталт:

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

Це не те, чого ми хотіли. DISTINCTОперація «не відбувається після того, як " проекція, тому ми більше не можемо видалити DISTINCTрейтинги , тому що функція вікна вже розраховані і прогнозовані. Для використання DISTINCTнам слід вкласти ту частину запиту:

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

Побічна примітка: У цьому конкретному випадку ми могли б також використатиDENSE_RANK()

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

2. Він не може використовувати жодні значення проекції

Одним з недоліків SQL є його багатослівність часом. З тієї ж причини, що ми бачили раніше (а саме логічний порядок операцій), ми не можемо «легко» згрупувати те, що ми проектуємо.

Це недійсний SQL:

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

Це дійсно (повторення виразу)

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

Це також справедливо (вкладення виразу)

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

Я писав про цю тему більш глибоко в публікації в блозі


Я був чесно здивований, побачивши, що порядок страти не обговорювався одразу з цього питання. Дякую, дуже красиво пояснили також. У вашій точці 2. деякі (один?) Db дозволяють використовувати вибрані псевдоніми протягом запиту (те, про що я знаю, - це Teradata, але це виняток).
Б / у_Бай_Вже

@Used_By_Already: Звичайно, деякі бази даних роблять це. Багато баз даних дозволяють використовувати ці псевдоніми лише в частинах (наприклад, не, WHEREале можливо GROUP BY). У будь-якому випадку, я вважаю, що це погана ідея, і я пропоную ніколи не використовувати цю функцію для переносимості та обслуговування. "Раптом" він більше не працюватиме, наприклад, при зведенні функції сукупності або функції вікна.
Лукаш Едер

never using that feature for portability and maintenance reasons!! домовились на 100% ... І зараз я теж насолоджуюся вашим блогом, чудова робота. Ура.
Б / у_Бай_Вже

32

Використовуйте, DISTINCTякщо ви просто хочете видалити дублікати. Використовуйте , GROUPY BYякщо ви хочете застосувати агрегатні оператори ( MAX, SUM, GROUP_CONCAT..., або HAVINGзастереження).


19

Я вважаю, що існує можливість тонких відмінностей у їх виконанні. Я перевірив плани виконання двох функціонально еквівалентних запитів по цих рядках в 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 |
---------------------------------------------------------------------------

Середня операція дещо відрізняється: "HASH GROUP BY" порівняно з "HASH UNIQUE", але орієнтовні витрати тощо ідентичні. Потім я виконав їх з відстеженням, і фактичні підрахунки операцій були однакові для обох (за винятком того, що другий не повинен був робити жодного фізичного читання через кешування).

Але я думаю, що оскільки назви операцій різні, виконання буде дотримуватися дещо інших кодових шляхів, і це відкриває можливість більш істотних відмінностей.

Я думаю, вам слід віддати перевагу синтаксису DISTINCT для цієї мети. Це не просто звичка, вона більш чітко вказує на мету запиту.


14

Для опублікованого вами запиту вони однакові. Але для інших запитів, які можуть бути неправдивими.

Наприклад, це не те саме, що:

SELECT C FROM myTbl GROUP BY C, D

14

Я прочитав усі вищезазначені коментарі, але не побачив, щоб хтось вказував на основну різницю між групами By і Distinct, крім біта агрегації.

Розрізнення повертає всі рядки, а потім дедублює їх, тоді як групувати шляхом дедуплікації рядків під час читання алгоритмом по черзі.

Це означає, що вони можуть давати різні результати!

Наприклад, наведені нижче коди генерують різні результати:

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

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

Якщо в таблиці є 10 імен, де 1 з них є дублікатом іншого, тоді перший запит повертає 10 рядків, тоді як другий запит повертає 9 рядків.

Причина - це те, що я сказав вище, щоб вони могли поводитися по-різному!


11
Це тому, що, хоча ви групуєте лише за Nameдругим запитом, distinctключове слово застосовується як до стовпців, так Nameі до вашого ROW_NUMBER()стовпця в selectпункті першого запиту. Якби ви також групувались за першим стовпцем у другому запиті, запити мали б повернути ті самі результати.

Це результат з order of executionз пунктів SQL , який представляє собою (в загальному сенсі) FROM and ON (joins), WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT / OFFSET / TOPтому другий запит імена зменшуються в кількості по групі і пізніше row_number () застосовується в результаті в одному ряду на унікальне ім'я. У першому запиті row_number () застосовується перед застосуванням розрізнення, і завдяки характеру функції row_number () кожен рядок отримує унікальне ціле число, тому кожен рядок повертається, навіть якщо є повторні значення імені.
Б / у_Бай_Вже

12

Якщо ви використовуєте DISTINCT з декількома стовпцями, набір результатів не згрупується, як це було з GROUP BY, і ви не можете використовувати функції сукупності з DISTINCT.


11

Вони мають різну семантику, навіть якщо вони мають однакові результати щодо ваших конкретних даних.


6

GROUP BY має дуже специфічне значення, яке відрізняється (хе) від функції DISTINCT.

GROUP BY змушує групувати результати запитів за допомогою обраного виразу, потім можуть бути застосовані сукупні функції, і вони будуть діяти на кожну групу, а не на весь набір результатів.

Ось приклад, який може допомогти:

Дано таблицю, яка виглядає приблизно так:

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

Цей запит:

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

Отримає вихід таким чином:

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

Що, очевидно, дуже відрізняється від використання DISTINCT. Якщо ви хочете згрупувати свої результати, використовуйте GROUP BY, якщо ви просто хочете унікальний список певного стовпця, використовуйте DISTINCT. Це дасть вашій базі даних можливість оптимізувати запит під ваші потреби.


6

Будь ласка, не використовуйте GROUP BY, коли ви маєте на увазі DISTINCT, навіть якщо вони трапляються однаково. Я припускаю, що ви намагаєтесь відгородити мілісекунди від запитів, і я мушу зазначити, що час розробника на порядок дорожчий, ніж час на комп’ютері.


5

Якщо ви використовуєте GROUP BY без будь-якої сукупної функції, то внутрішньо це буде розглядатися як DISTINCT, тому в цьому випадку різниці між GROUP BY і DISTINCT не існує.

Але коли вам надано пункт DISTINCT, краще використовувати його для пошуку своїх унікальних записів, оскільки мета групи GROUP - досягти агрегації.


4

group by використовується в сукупних операціях - наприклад, коли ви хочете отримати кількість Bs, розбиті на стовпчик C

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

виразним є те, що це звучить - ви отримуєте унікальні рядки.

На сервері sql 2005 року схоже, що оптимізатор запитів здатний оптимізувати різницю у прикладних спрощених прикладах. Не знаю, якщо ви можете розраховувати на це у будь-яких ситуаціях.


3

У цьому конкретному запиті різниці немає. Але, звичайно, якщо ви додасте будь-які сукупні стовпці, тоді вам доведеться використовувати групу по.


3

З точки зору Терадати :

З точки зору набору результатів, не має значення, якщо ви використовуєте DISTINCT або GROUP BY у Терадаті. Набір відповідей буде однаковим.

З точки зору продуктивності, це не те саме.

Щоб зрозуміти, що впливає на ефективність роботи, потрібно знати, що відбувається з Teradata, виконуючи заяву з DISTINCT або GROUP BY.

У випадку з DISTINCT рядки перерозподіляються негайно без попередньої агрегації, тоді як у випадку GROUP BY на першому кроці робиться попередня агрегація і лише після цього унікальні значення перерозподіляються по AMP.

Не думайте, що GROUP BY завжди кращий з точки зору продуктивності. Коли у вас багато різних значень, крок попередньої агрегації GROUP BY не дуже ефективний. Teradata має сортувати дані для видалення дублікатів. У цьому випадку може бути краще спочатку перерозподілити, тобто скористатися оператором DISTINCT. Тільки якщо є багато повторюваних значень, оператор GROUP BY, мабуть, кращий вибір, як тільки після того, як відбудеться крок дедупликації, після перерозподілу.

Коротше кажучи, DISTINCT vs. GROUP BY у Терадаті означає:

ГРУПУВАТИ ЗА -> для багатьох дублікатів DISTINCT -> немає або лише кілька дублікатів. Інколи, використовуючи DISTINCT, у AMP у вас не вистачає місця на котушці. Причина полягає в тому, що перерозподіл відбувається негайно, і перекос може призвести до того, що в АМП не вистачає місця.

Якщо це трапиться, у вас, ймовірно, більше шансів з GROUP BY, оскільки дублікати вже видаляються на першому кроці, а менше даних переміщується по AMP.


Що таке Teradata?
Бретцький

Teradata - це система управління реляційними базами даних (RDBMS), здатна підтримувати безліч одночасних користувачів з різних клієнтських платформ. Teradata сумісний зі стандартом ANSI і повністю побудований на паралельній архітектурі.
Рам Гадіярам

2

З точки зору "мови SQL", дві конструкції є рівнозначними, і який ви обираєте, є одним із тих варіантів "способу життя", які ми всі повинні робити. Я думаю, що є хороший випадок, коли DISTINCT буде більш чітким (і, отже, більш уважно ставиться до особи, яка успадкує ваш код тощо), але це не означає, що конструкція GROUP BY є недійсним вибором.

Я вважаю, що ця "GROUP BY призначена для агрегатів" - це неправильний акцент. Люди повинні пам'ятати, що функцію набору (MAX, MIN, COUNT тощо) можна опустити, щоб вони зрозуміли наміри кодера, коли вони є.

Ідеальний оптимізатор розпізнає еквівалентні конструкції SQL і завжди підбирає ідеальний план відповідно. Для вашого реального життя SQL двигуна вибору, ви повинні протестувати :)

PS відзначте, що позиція ключового слова DISTINCT у пункті вибору може дати різні результати, наприклад контраст:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

1

Ви це помічаєте лише тому, що вибираєте одну колонку.

Спробуйте вибрати два поля і подивитися, що станеться.

Група By призначена для використання таким чином:

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

Що б показувало суму всіх транзакцій для кожної людини.


Це не питання агрегатів. У вашому прикладі виберіть c, d ВІД mytbl GROUP BY C, D; насправді поверне той самий набір даних, що і SELECT DISTINCT C, D FROM mytbl; Ось основи питання
Бретцький

1

Я знаю, що це стара публікація. Але трапляється, що у мене був запит, який використовував групу просто для повернення чітких значень при використанні цього запиту у звітах про жабу та oracle, що все працювало нормально, я маю на увазі хороший час відповіді. Коли ми перейшли з Oracle 9i до 11g, час відгуку у програмі Toad було чудовим, але у репортажі на завершення звіту на використання попередньої версії було потрібно близько 5 хвилин.

Рішення полягало в тому, щоб змінити групу і використовувати DISTINCT, і тепер звіт працює приблизно за 30 секунд.

Я сподіваюся, що це корисно для когось із однаковою ситуацією.


1

З точки зору використання, GROUP BY використовується для групування тих рядків, які ви хочете обчислити. DISTINCT не проводить жодного розрахунку. Він не відображатиме повторюваних рядків.

Я завжди використовував DISTINCT, якщо хочу представити дані без дублікатів.

Якщо я хочу зробити розрахунки, такі як підбиття загальної кількості манго, я буду використовувати GROUP BY


0

Те, як я завжди розумів, це те, що використання розрізнення - це те саме, що групувати по кожному вибраному вами полі в порядку, який ви вибрали.

тобто:

select distinct a, b, c from table;

те саме, що:

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

Погоджено, але чи буде це так само, як вибрати c, b, a з групи таблиці по a, b, c
Dheer

Так, було б те саме
Кайус Джард

0

Функціональна ефективність зовсім інша. Якщо ви хочете вибрати лише "повернене значення", окрім дублікату, використовувати відмінний краще, ніж групувати за. Оскільки "групи за" включають (сортування + видалення), "окремі" включають (видалення)



0

Іноді вони можуть давати вам однакові результати, але вони призначені для використання в іншому сенсі / випадку. Основна відмінність - у синтаксисі.

Хвилинно помічайте приклад нижче. DISTINCTвикористовується для фільтрації дублюючого набору значень. (6, cs, 9.1) та (1, cs, 5.5) - це дві різні множини. Так DISTINCTбуде відображатися обидва рядки, тоді GROUP BY Branchяк буде відображатися лише один набір.

 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)

Іноді результатів, які можуть бути досягнуті GROUP BYпунктом, неможливо досягти, DISTINCTне застосовуючи додаткові умови чи умови. Наприклад, у верхньому випадку.

Щоб отримати такий самий результат, як DISTINCTвам потрібно передати всі назви стовпців у GROUP BYнаведеному нижче пункті. Тож бачте синтаксичну різницю. Ви повинні мати знання про всі назви стовпців, щоб використовувати GROUP BYв цьому випадку пункт.

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

Також я помітив GROUP BY, що за замовчуванням відображає результати у порядку зростання, що DISTINCTне робить. Але я не впевнений у цьому. Він може відрізнятися від постачальника.

Джерело: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by


0

Як правило, ми можемо використовувати DISTINCTдля усунення дублікатів у конкретному стовпці таблиці.

У разі «GROUP BY» ми можемо застосувати агрегацію функції , такі як AVG, MAX, MIN, SUMі COUNTна певному стовпці і принести ім'я стовпця і агрегація функції результат на тій же колонці.

Приклад:

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

-1

Не існує суттєвої різниці між груповим та виразним пунктом, крім використання сукупних функцій. Обидва можуть бути використані для розрізнення значень, але якщо в точці продуктивності точку зору краще. Коли використовується ключове слово окремо, він використовував операцію сортування, яку можна переглянути в плані виконання.

Спробуйте простий приклад

Оголосити таблицю @tmpresult (id tinyint)

Вставити в @tmpresult Виберіть 5 Союз усіх Виберіть 2 Союз усіх Виберіть 3 Союз усіх Виберіть 4

Виберіть окремий Id From @tmpresult


виразні та згруповані за обома
заповітами
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.