sql >> Databáze >  >> RDS >> Mysql

Seskupení podle klauzule v mySQL a postgreSQL, proč chyba v postgreSQL?

Musíte použít AGREGÁTNÍ FUNKCI :

Agregační funkce počítají jeden výsledek ze sady vstupních hodnot.

SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table 
GROUP BY col2;

db<>ukázka houslí

Zpracování MySQL pro GROUP BY :

Ve standardním SQL nemůže dotaz obsahující klauzuli GROUP BY odkazovat na neagregované sloupce ve výběrovém seznamu, které nejsou pojmenovány v klauzuli GROUP BY

a:

MySQL rozšiřuje použití GROUP BY tak, že výběrový seznam může odkazovat na neagregované sloupce, které nejsou uvedeny v klauzuli GROUP BY. To znamená, že předchozí dotaz je v MySQL legální. Tuto funkci můžete použít k dosažení lepšího výkonu tím, že se vyhnete zbytečnému řazení a seskupování sloupců. To je však užitečné především v případě, že všechny hodnoty v každém neagregovaném sloupci, který není uveden v GROUP BY, jsou pro každou skupinu stejné. Server si může vybrat libovolnou hodnotu z každé skupiny, takže pokud nejsou stejné, zvolené hodnoty jsou neurčité

Takže s verzí MySQL bez explicitní agregační funkce můžete skončit s nedetermininistickými hodnotami. Důrazně doporučuji použít konkrétní agregační funkci.

UPRAVIT:

Z MySQL Handling of GROUP BY :

SQL92 a starší nepovolují dotazy, pro které výběrový seznam, podmínka HAVING nebo seznam ORDER BY odkazují na neagregované sloupce, které nejsou pojmenovány v klauzuli GROUP BY.

SQL99 a novější povolují takové neagregáty pro volitelnou funkci T301 pokud jsou funkčně závislé na sloupcích GROUP BY: Pokud takový vztah mezi jménem a správcem existuje, je dotaz legální. Tak by tomu bylo například v případě, že by byl uchován primární klíč zákazníků.

Příklad:

SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o
JOIN customers AS c
  ON o.custid = c.custid
GROUP BY o.custid;


  1. Systém automatického e-mailu pro odeslání souhrnné zprávy databáze

  2. volání uloženého procesu přes dblink

  3. Filtrovat podle COUNT(*)?

  4. Měření výkonu databáze pod tlakem