[SQL] MySQL의 GROUP BY 동작
SQLMySQL의 GROUP BY 동작
다음 표 'foo는'주어
ID | First Name | Last Name
----------------------------
67 John Smith
----------------------------
67 Bill Jacobs
무엇 FIRST_NAME과 LAST_NAME 것 다음 쿼리 리턴 그 이유는 무엇입니까?
SELECT * FROM foo WHERE ID = 67 GROUP BY ID
해결법
-
==============================
1.MySQL은 임의로 행을 선택합니다. 실제로, 일반적으로 사용되는 MySQL의 스토리지 엔진은 물리적 스토리지에 대한 그룹의 첫 번째 행에서 값을 반환합니다.
MySQL은 임의로 행을 선택합니다. 실제로, 일반적으로 사용되는 MySQL의 스토리지 엔진은 물리적 스토리지에 대한 그룹의 첫 번째 행에서 값을 반환합니다.
create table foo (id serial primary key, category varchar(10)); insert into foo (category) values ('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar'); select * from foo group by category; +----+----------+ | id | category | +----+----------+ | 4 | bar | | 1 | foo | +----+----------+
다른 사람들은 MySQL은 당신이 임의의 잠재적으로 오해의 소지 결과에도 불구하고이 쿼리를 실행 할 수 있다는 정확합니다. 표준 SQL, 그리고 대부분의 다른 RDBMS 벤더는, 쿼리에 의해 모호한 GROUP의이 종류를 허용. 이는 단일 값 규칙이라고 : 선택 목록의 모든 열이 집계 함수, 예를 들어, 내부 명시 적 기준에 따라 그룹의 일부, 또는 다른해야합니다 COUNT (), MAX (), 등
MySQL은 당신이 SQL 표준 의미를 위반하는 쿼리를 실행하려고하면 차종이 오류를 반환 MYSQL 것을 ONLY_FULL_GROUP_BY는 SQL 모드를 지원합니다.
AFAIK은, SQLite는은 그룹화 된 쿼리에서 모호한 열 수있는 유일한 다른 RDBMS입니다. SQLite는 그룹의 마지막 행에서 값을 반환합니다 :
select * from foo group by category; 6|bar 3|foo
우리는 모호한 아직 여전히 SQL 표준 의미를 위반하지 않을 쿼리를 상상할 수있다.
SELECT foo.*, parent_of_foo.* FROM foo JOIN parent_of_foo ON (foo.parent_id = parent_of_foo.parent_id) GROUP BY foo_id;
이 모호한 결과를 생산할 수있는 논리적 방법은 없습니다. foo는의 기본 키 BY 우리의 GROUP 경우 foo는 각 행은, 자신의 그룹을 가져옵니다. foo는에서 모든 열은 그룹에서 하나의 값을 가질 수 있습니다. 그룹이 foo는의 기본 키에 의해 정의 된 경우에도 그룹 당 하나의 값을 가질 수 foo는에서 외래 키가 참조하는 다른 테이블에 합류.
MySQL과 SQLite는 당신이 논리적으로 명확한 쿼리를 설계하는 신뢰합니다. 공식적으로, 선택 목록의 모든 열을 기준으로 그룹의 컬럼의 기능 의존해야합니다. 이 준수하지 않을 경우, 그것은 당신의 잘못입니다. :-)
표준 SQL은 더 엄격하고 명확한 될 수있는 몇 가지 질의를 허용하지 않습니다 -는 RDBMS가 일반적으로 확인하는 것이 너무 복잡 할 것입니다 아마 때문이다.
-
==============================
2.표준 SQL의 행동과 일치하지 않습니다에 의해 MySQL의 그룹은, MySQL은 쉽게 다른 열을 얻을하지만 동시에 u는 u는 얻을 것이다 어느 확신 할 수 없다합니다.
표준 SQL의 행동과 일치하지 않습니다에 의해 MySQL의 그룹은, MySQL은 쉽게 다른 열을 얻을하지만 동시에 u는 u는 얻을 것이다 어느 확신 할 수 없다합니다.
최신 정보: 이 페이지를 참조하십시오 : http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html
-
==============================
3.그것은 당신이 얻을거야 결과, 이는 정의되어 있지 않습니다.
그것은 당신이 얻을거야 결과, 이는 정의되어 있지 않습니다.
이 동작조차 허용 한 이유 난 항상 궁금했다. 정말, 나는 그런 코드는 단지 오류 발생 텐데 (즉 보통의 MySQL의 아무도, 양호하게하는 해독 한 "당신의 문에 문제가 없다,하지만 어디 몰라"물건).
-
==============================
4.그것은 매우 가능성이 두 번째 (마지막) 행의 성과 이름이 뽑힐 것입니다.
그것은 매우 가능성이 두 번째 (마지막) 행의 성과 이름이 뽑힐 것입니다.
당신은 당신이 그룹화 된 행을 정렬하고 싶습니다 방법에 대한 힌트를 제공하기 위해 ORDER BY 절을 추가 할 수 있습니다.
-
==============================
5.표준 SQL에서이 SQL은 같은 서버 프로세서 오류 무언가 실패한다
표준 SQL에서이 SQL은 같은 서버 프로세서 오류 무언가 실패한다
"그들이함으로써 그룹도, 또는 집계 함수의 일부가 아닌 FIRSTNAME 및 LASTNAME은 SELECT 절에 포함 할 수 없습니다."
합니까 MySQL은 실제로 데이터를 반환?
-
==============================
6.진실. 이 당신이 얻을 것이다 행 그러므로 distinctization (?)하고 (즉 가장 최근의, 가장 오래된, 무엇이든) 이전에 행의 순서를 지정할 수 있습니다 제외하고 실제로는, 예를 들어 포스트 그레스에서 DISTINCT ON 모드를 선택하는 것이 더 해당한다.
진실. 이 당신이 얻을 것이다 행 그러므로 distinctization (?)하고 (즉 가장 최근의, 가장 오래된, 무엇이든) 이전에 행의 순서를 지정할 수 있습니다 제외하고 실제로는, 예를 들어 포스트 그레스에서 DISTINCT ON 모드를 선택하는 것이 더 해당한다.
"SQL 준수"모드에서 참고 MySQL은 당신의 예에서와 같이 nonspecified 열이 GROUP BY를 거부합니다.
from https://stackoverflow.com/questions/1645921/mysql-group-by-behavior by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 연도를 무시 날짜 계산을해야합니까? (0) | 2020.05.03 |
---|---|
[SQL] SQL 점 표기법 (0) | 2020.05.03 |
[SQL] SQL Server에 대한 그룹화 된 문자열 집계 / LISTAGG (0) | 2020.05.03 |
[SQL] MySQL의 절차에 값을 통해 문자열 및 루프를 분할 (0) | 2020.05.03 |
[SQL] "당신은 지정된 집계 함수를 포함하지 않는 쿼리를 실행하려고" (0) | 2020.05.03 |