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

MySQL - Výběr sloupce, který není ve skupině

Je pravda, že tato funkce umožňuje některé nejednoznačné dotazy a tiše vrací sadu výsledků s libovolnou hodnotou vybranou z tohoto sloupce. V praxi to bývá hodnota z řádku ve skupině, která je fyzicky uložena jako první.

Tyto dotazy nejsou nejednoznačné, pokud v kritériích GROUP BY vyberete pouze sloupce, které jsou funkčně závislé na sloupcích. Jinými slovy, pokud může existovat pouze jedna odlišná hodnota sloupce "nejednoznačné" na hodnotu, která definuje skupinu, není problém. Tento dotaz by byl v Microsoft SQL Server (a ANSI SQL) nezákonný, i když logicky nemůže vést k nejednoznačnosti:

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

MySQL má také režim SQL, aby se chovala podle standardu:ONLY_FULL_GROUP_BY

FWIW, SQLite také povoluje tyto nejednoznačné klauzule GROUP BY, ale vybírá hodnotu z posledního řádek ve skupině.

Alespoň ve verzi, kterou jsem testoval. Co to znamená být svévolný je, že buď MySQL nebo SQLite by mohly v budoucnu změnit svou implementaci a mít jiné chování. V nejednoznačných případech, jako je tento, byste se proto neměli spoléhat na to, že chování zůstane tak, jak je v současnosti. Je lepší přepsat vaše dotazy tak, aby byly deterministické a nebyly nejednoznačné. To je důvod, proč MySQL 5.7 nyní ve výchozím nastavení umožňuje ONLY_FULL_GROUP_BY.



  1. Spouštějte skripty SQL v prostředí Multitenant s catcon.pl

  2. Jak mohu nastavit připojovací řetězec SQL Server?

  3. Proč nemohu vytvořit spouštěče na objektech vlastněných SYS?

  4. Zábava se zprávami