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 : Distinct및 screw => 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.