Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL GROUP BY поведение

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 BY. Това се нарича Правило за една стойност :всички колони в списъка за избор трябва да бъдат изрично част от критериите GROUP BY, или в друга част от агрегатна функция, напр. COUNT() , MAX() и др.

MySQL поддържа SQL режим ONLY_FULL_GROUP_BY което кара MySQL да връща грешка, ако се опитате да изпълните заявка, която нарушава стандартната семантика на 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 получава своя собствена група, ако ГРУПИРАМЕ по първичния ключ на foo. Така че всяка колона от foo може да има само една стойност в групата. Дори присъединяването към друга таблица, посочена от външен ключ в foo, може да има само една стойност на група, ако групите са дефинирани от първичния ключ на foo.

MySQL и SQLite ви се доверяват да проектирате логически недвусмислени заявки. Формално всяка колона в списъка за избор трябва да е функционална зависимост от колоните в критериите GROUP BY. Ако не се придържате към това, вината е ваша. :-)

Стандартният SQL е по-строг и забранява някои заявки, които могат бъдете недвусмислени - вероятно защото би било твърде сложно за RDBMS, за да бъде сигурна като цяло.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP PDO:набор от знаци, имена на набори?

  2. Вземете текущата стойност AUTO_INCREMENT за всяка таблица

  3. Условие WHERE в MySQL с 16 различни примера за заявка

  4. Балансиране на натоварването на PostgreSQL и подобрения на ProxySQL - ClusterControl 1.5

  5. Rails, MySQL и Snow Leopard