GROUP BY와 DISTINCT간에 차이점이 있습니까?


310

다른 날에 SQL에 대해 간단한 것을 배웠습니다.

SELECT c FROM myTbl GROUP BY C

다음과 같은 결과가 나타납니다.

SELECT DISTINCT C FROM myTbl

내가 궁금한 것은 SQL 엔진이 명령을 처리하는 방식에 다른 것이 있습니까? 아니면 실제로 같은 것입니까?

나는 개인적으로 뚜렷한 구문을 선호하지만 다른 것보다 습관이 더 확실하다고 확신합니다.

편집 : 이것은 집계에 대한 질문이 아닙니다. GROUP BY집계 함수와 함께 사용하는 것이 이해됩니다.


11
이것은 집계에 대한 질문이 아니며 집계 함수가 없을 때 구별과 동일하게 작동하는 GROUP BY 기능입니다.
Brettski

2
당신은 또한 SELECT c FROM myTbl UNION SELECT c FROM myTbl같은 결과를 얻을 수 있습니다 ... 그러나 왜 SELECT DISTINCT가 그렇게 쉬운 일을 복잡하게 합니까 .
jarlh

'논리 실행 순서'는 GROUP BY'SELECT'보다 훨씬 빠르며 DISTINCTselect를 따릅니다.
Used_By_Already

내가 언급하지 않은 매우 작은 차이점 중 하나 DISTINCT는 실제로 필드를 선택하는 결과입니다. 즉, 값이 결과 집합에 나타납니다. GROUP BY실제로 필드를 선택하지 않고도 중복을 효과적으로 제거 할 수 있습니다. 이것은 대부분의 경우 관련성이 없지만 다른 사람이 원하는 것일 수도 있습니다. GROUP BY대신에 사용 DISTINCT하면 코드의 설명 주석이 필요합니다.
rinogo

결론은 중복 제거가 실행 계획의 다른 지점에서 발생하기 때문에 dup 제거에는 해당 인덱스에 대해이 인덱스를 정렬하거나 사용해야 할 수 있기 때문에 다른 것보다 더 효율적일 수 있습니다. 따라서 초기 Dup 제거의 이점이 있거나 초기에 다른 인덱스를 사용하고 남은 행이 적고 정렬이 무시할 때 정렬을 먹는 경우 이점이있을 수 있습니다.
bielawski

답변:


246

MusiGenesis 의 응답은 명시된대로 귀하의 질문과 관련하여 기능적으로 올바른 것입니다. SQL Server는 "그룹화"를 사용하고 집계 함수를 사용하지 않는 경우 실제로 의미하는 것은 "고유"이므로 "Distinct"를 사용하는 것처럼 실행 계획을 생성한다는 사실을 충분히 잘 알고 있습니다. "

그러나 "Group By"와 "Distinct"에 대한 무심한 처리는 조심하지 않으면 일부 심각한 문제를 야기 할 수 있다는 Hank 의 반응 에 주목하는 것이 중요하다고 생각합니다 . 두 개의 SQL 쿼리 키워드 사이의 기능적 차이에 대해 질문하기 때문에 이것이 "집계에 대한 질문이 아니라"고 말하는 것은 전적으로 옳지 않습니다. 하나는 집계함께 사용되며 다른 하나는 그렇지 않습니다.

망치로 나사를 운전하는 경우도 있지만, 드라이버가 있으면 왜 귀찮습니까?

(이 비유의 목적 Hammer : Screwdriver :: GroupBy : Distinctscrew => get list of unique values in a table column)


Skeolan과 완전히 동의합니다. 이 기능을 접했을 때 매우 놀랐습니다. 그것은 내가 사용하려는 것이 아니지만 내가 일하고있는이 새로운 장소에서 일이 완료된 방법입니다.
Brettski

적어도 Oracle 12에서는 DISTINCT, UNION으로 구별되는 값 가져 오기 및 GROUP BY가 다르게 작동하는 경우가 있습니다. 나는 오늘 일찍 DISTINCT와 UNION에 의해 ​​구별되는 오라클 오류가 발생하는 경우가 있었지만 GROUP BY가 작동했습니다. 뷰에서 하나의 열만 선택하고 집계를 사용하지 않았습니다. 나는 왜 그것이 왜 필요한지 당황했지만, 실행에 약간의 차이가 있음을 확인합니다. 다른 사람들이 지적했듯이 선택을 사용하지 않고 GROUP BY 열을 그룹화 할 수도 있지만 집계 없이는 거의 필요하지 않습니다.
ZeroK

1
SQL에 관해서는 항상 스크루 드라이버와 해머를 모두 사용할 수 있습니다. 왜 망치를 사용하여 나사로 운전합니까?
jarlh

당신과 관련하여 분명하게 말하면 해머 == GroupBy 및 드라이버 ==이 경우 구별됩니까?
HopeKing

와우,이 열 살짜리 질문에는 여전히 다리가 있습니다! "고유 값 목록"이 나사 인 경우 "고유"는 드라이버입니다. 유추를 더 명확하게하기 위해 답을 업데이트하겠습니다.
Skeolan

136

GROUP BY당신이 집계 함수를 사용할 수 있습니다 같은 AVG, MAX, MIN, SUM,와 COUNT. 반면에 DISTINCT중복을 제거합니다.

예를 들어 많은 구매 기록이 있고 각 부서에서 소비 한 금액을 알고 싶은 경우 다음과 같은 작업을 수행 할 수 있습니다.

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

부서 이름과 amount해당 부서의 모든 행에있는 모든 값 의 합계를 포함하는 부서 당 하나의 행이 제공됩니다 .


2
GROUP BY의 사용을 이해합니다. 질문은 집계 함수가 없을 때 별개의 데이터 세트를 반환한다는 사실에 근거합니다.
Brettski

2
GROUP BY는 그룹화하는 열의 값에 대해 암시 적으로 DISTINCT를 수행하기 때문에 (협약에 대해서는 죄송합니다).
Joe Pineda

DISTINCT+ 집계 함수 를 사용할 수 없습니까? 이 같은select distinct department, SUM(amount) from ...
Shafizadeh

@Sajad, 당신은 그렇게 할 수 있지만 여전히 GROUP BY가 있어야하므로 DISTINCT는 당신을 위해 아무것도하지 않습니다.
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:0:::::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는 쿼리 전체에서 select 별칭을 사용할 수 있습니다 (내가 아는 것은 Teradata이지만 예외입니다).
Used_By_Already

@Used_By_Already : 물론, 일부 데이터베이스는 그렇게합니다. 많은 데이터베이스 (안 예에만 부분에서 그 별명의 사용을 허용 WHERE하지만, 아마도 GROUP BY). 어쨌든, 나는 그것이 나쁜 생각이라고 생각하며 이식성과 유지 보수 이유로 그 기능을 사용하지 않는 것이 좋습니다. "갑자기"는 더 이상 작동하지 않습니다 (예 : 집계 함수 또는 창 함수의 별칭을 지정할 때).
Lukas Eder

never using that feature for portability and maintenance reasons!! 100 % 동의 ... & 나는 지금 당신의 블로그를 너무 좋아하고 있습니다. 건배.
Used_By_Already

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

위의 모든 의견을 읽었지만 집계 비트와 별도로 Group By와 Distinct의 주요 차이점을 지적한 사람은 없었습니다.

Distinct는 모든 행을 반환 한 다음 중복 제거하는 반면 Group By는 알고리즘이 행을 하나씩 읽을 때 중복 제거합니다.

이것은 그들이 다른 결과를 낼 수 있다는 것을 의미합니다!

예를 들어 아래 코드는 다른 결과를 생성합니다.

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 () 그래서 고유 이름마다. 첫 번째 쿼리에서는 distinct가 적용되기 전에 row_number ()가 적용되며 row_number () 함수의 특성으로 인해 모든 행이 고유 한 정수를 얻으므로 반복되는 이름 값이 있어도 모든 행이 반환됩니다.
Used_By_Already

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

동일하게 작동하더라도 DISTINCT를 의미 할 때 GROUP BY를 사용하지 마십시오. 쿼리에서 밀리 초를 단축하려고한다고 가정하고 개발자 시간은 컴퓨터 시간보다 훨씬 비싸다는 것을 지적해야합니다.


5

집계 함수없이 GROUP BY를 사용하는 경우 내부적으로 DISTINCT로 취급되므로이 경우 GROUP BY와 DISTINCT간에 차이가 없습니다.

그러나 GROUP BY의 목표는 집계를 달성하는 것이기 때문에 DISTINCT 절이 제공되면 고유 레코드를 찾기 위해 더 잘 사용할 수 있습니다.


4

group by는 집계 작업에 사용됩니다 (예 : 열 C로 분류 된 B 수를 가져 오려는 경우)

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

독창적 인 행을 얻을 수 있습니다.

SQL Server 2005에서는 쿼리 최적화 프로그램이 내가 실행 한 간단한 예제의 차이점을 최적화 할 수있는 것처럼 보입니다. 그래도 모든 상황에서 그것을 믿을 수 있다면 Dunno.


3

이 특정 쿼리에는 차이가 없습니다. 그러나 물론 집계 열을 추가하면 group by를 사용해야합니다.


3

테라 데이타 관점에서 :

결과 세트 관점에서 Teradata에서 DISTINCT 또는 GROUP BY를 사용하는지 여부는 중요하지 않습니다. 답변 세트는 동일합니다.

성능 관점에서는 동일하지 않습니다.

성능에 어떤 영향을 미치는지 이해하려면 DISTINCT 또는 GROUP BY를 사용하여 명령문을 실행할 때 Teradata에서 어떤 일이 발생하는지 알아야합니다.

DISTINCT의 경우 행은 사전 집계없이 즉시 재분배되며, GROUP BY의 경우 첫 번째 단계에서 사전 집계가 수행 된 다음 AMP에 고유 한 값이 재분배됩니다.

GROUP BY가 항상 성능 관점에서 더 좋다고 생각하지 마십시오. 다른 값이 많은 경우 GROUP BY의 사전 집계 단계가 그리 효율적이지 않습니다. Teradata는 중복을 제거하기 위해 데이터를 정렬해야합니다. 이 경우 먼저 재분배하는 것이 좋습니다 (예 : DISTINCT 문). 중복 값이 ​​많은 경우에만 재분배 후 중복 제거 단계가 한 번만 수행되므로 GROUP BY 문이 더 나은 선택 일 수 있습니다.

간단히 말해, Teradata에서 DISTINCT와 GROUP BY는 다음을 의미합니다.

많은 복제에 대해 GROUP BY-> DISTINCT-> 복제가 없거나 몇 개만 있습니다. 때때로 DISTINCT를 사용할 때 AMP의 스풀 공간이 부족합니다. 그 이유는 재분배가 즉시 이루어지고 비뚤어지면 AMP 공간이 부족해질 수 있기 때문입니다.

이 경우 첫 번째 단계에서 중복이 이미 제거되고 AMP에서 더 적은 데이터가 이동되므로 GROUP BY를 사용하는 것이 좋습니다.


무엇입니까 Teradata?
Brettski

Teradata는 다양한 클라이언트 플랫폼에서 많은 동시 사용자를 지원할 수있는 관계형 데이터베이스 관리 시스템 (RDBMS)입니다. Teradata는 ANSI 표준과 호환되며 병렬 아키텍처를 기반으로합니다.
Ram Ghadiyaram 2018 년

2

'SQL 언어'관점에서 두 구성은 동일하며, 어느 것이 든 우리가 선택해야하는 '라이프 스타일'중 하나입니다. DISTINCT가 더 명시 적으로 좋은 사례가 있다고 생각합니다 (따라서 코드 등을 상속받는 사람에게 더 배려)하지만 GROUP BY 구문이 잘못된 선택임을 의미하지는 않습니다.

이 'GROUP BY는 집계 용입니다'는 잘못된 강조라고 생각합니다. 사람들은 코더의 의도를 이해할 수 있도록 설정 기능 (MAX, MIN, COUNT 등)을 생략 할 수 있음을 알고 있어야합니다.

이상적인 옵티마이 저는 동등한 SQL 구문을 인식하고 항상 이상적인 계획을 선택합니다. 실제 SQL 엔진을 선택하려면 다음을 테스트해야합니다. :)

추신 : select 절에서 DISTINCT 키워드의 위치는 다음과 같은 다른 결과를 생성 할 수 있습니다.

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

1

단일 열을 선택하기 때문에 주목할 만합니다.

두 개의 필드를 선택하고 어떻게되는지보십시오.

Group By는 다음과 같이 사용됩니다.

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

각 개인에 대한 모든 거래의 합계를 보여줍니다.


이것은 집계 문제가 아닙니다. 귀하의 예에서, SELECT c, d FROM mytbl GROUP BY C, D; 실제로 SELECT DISTINCT C, D FROM mytbl과 동일한 데이터 세트를 리턴합니다. 이것이 문제의 기본입니다
Brettski

1

오래된 게시물이라는 것을 알고 있습니다. 그러나 두꺼비에서 oracle 보고서를 사용할 때 고유 한 값을 반환하기 위해 그룹을 사용하는 쿼리가 있었으므로 모든 것이 잘 작동한다고 응답했습니다. Oracle 9i에서 11g로 마이그레이션 할 때 Toad의 응답 시간은 우수했지만 보고서에서는 이전 버전을 사용할 때 보고서를 완료하는 데 약 35 분이 걸렸습니다. 약 5 분이 걸렸습니다.

해결책은 그룹을 변경하고 DISTINCT를 사용하는 것이 었으며 이제 보고서는 약 30 초 안에 실행됩니다.

나는 이것이 같은 상황에있는 누군가에게 유용하기를 바랍니다.


1

사용량 측면에서 GROUP BY는 계산하려는 행을 그룹화하는 데 사용됩니다. DISTINCT는 계산을 수행하지 않습니다. 중복 행이 표시되지 않습니다.

중복없이 데이터를 표시하려면 항상 DISTINCT를 사용했습니다.

총 망고 수를 합산하는 것과 같은 계산을 원한다면 GROUP BY를 사용합니다.


0

내가 항상 이해 한 방식은 distinct를 사용하는 것은 선택한 모든 필드를 선택한 순서대로 그룹화하는 것과 같습니다.

즉 :

select distinct a, b, c from table;

와 같다:

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

동의하지만 테이블 그룹에서 a, b, c로 select c, b, a와 동일
Dheer

예, 동일합니다
Caius Jard

0

기능 효율성은 완전히 다릅니다. 중복 값을 제외하고 "반환 값"만 선택하려면 그룹화보다 distinct를 사용하는 것이 좋습니다. "group by"include (sorting + 제거)이므로 "distinct"include (제거)



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

집계 함수 사용을 제외하고 그룹화 기준과 고유 조항 간에는 큰 차이가 없습니다. 둘 다 값을 구별하는 데 사용할 수 있지만 성능 관점에서 그룹화하는 것이 좋습니다. distinct 키워드가 사용될 때 내부적으로 실행 계획에서 볼 수있는 정렬 작업을 사용했습니다.

간단한 예를보십시오

@tmpresult 테이블 선언 (id tinyint)

@tmpresult에 삽입 Select 5 Union all 선택 2 Union all 선택 3 Union all 선택 4

@tmpresult에서 고유 한 ID를 선택하십시오.


의지에 따라 구별되고 그룹화
vignesh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.