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

Které DBMS umožňují řazení podle atributu, který není obsažen v klauzuli select?

Váš dotaz je zcela legální syntaxe, můžete seřadit podle sloupců, které nejsou přítomny ve výběru.

Pokud potřebujete úplné specifikace o právním uspořádání, ve standardu SQL 2003 má dlouhý seznam příkazů o tom, co by příkaz měl a neměl obsahovat, (02-Foundation, strana 415, oddíl 7.13 , pod část 28). To potvrzuje, že váš dotaz je legální syntaxe.

Domnívám se, že váš zmatek může být způsoben výběrem a/nebo řazením podle sloupců, které nejsou přítomny ve skupině podle, nebo řazením podle sloupců, které nejsou ve výběru při použití odlišných.

Oba mají stejný základní problém a MySQL je jediný, pokud vím, který to umožňuje.

Problém je v tom, že při použití seskupit podle nebo rozlišit nejsou potřeba žádné sloupce, které nejsou obsaženy ani v jednom, takže nezáleží na tom, zda mají více různých hodnot v řádcích, protože nejsou nikdy potřeba. Představte si tento jednoduchý soubor dat:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |
3   |    B    |    Y     |

Pokud napíšete:

SELECT  DISTINCT Column1
FROM    T;

Dostanete

 Column1 
---------
     A   
     B   

Pokud potom přidáte ORDER BY Column2 , který ze dvou sloupců 2 byste použili k seřazení A, X nebo Z? Není deterministické, jak vybrat hodnotu pro sloupec2.

Totéž platí pro výběr sloupců, které nejsou ve skupině podle. Pro zjednodušení si představte první dva řádky předchozí tabulky:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |
2   |    A    |    Z     |

V MySQL můžete psát

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1;

To ve skutečnosti porušuje standard SQL, ale funguje to v MySQL, ale problém je, že to není deterministické, výsledek:

ID  | Column1 | Column2  |
----|---------+----------|
1   |    A    |    X     |

Není více ani méně správné než

ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

Takže to, co říkáte, je dát mi jeden řádek pro každou odlišnou hodnotu Column1 , které obě sady výsledků splňují, jak tedy víte, kterou získáte? No nemáte, zdá se, že je to docela populární mylná představa, že můžete přidat a ORDER BY klauzule k ovlivnění výsledků, takže například následující dotaz:

SELECT  ID, Column1, Column2
FROM    T
GROUP BY Column1
ORDER BY ID DESC;

Zajistí, že získáte následující výsledek:

ID  | Column1 | Column2  |  
----|---------+----------|
2   |    A    |    Y     |

kvůli ORDER BY ID DESC , to však není pravda (jak je ukázáno zde ).

dokumenty MySQL stav:

Takže i když máte objednávku, toto neplatí, dokud nebude vybrán jeden řádek na skupinu a tento jeden řádek není určující.

Standard SQL povoluje sloupce ve výběrovém seznamu, které nejsou obsaženy v GROUP BY nebo agregační funkci, avšak tyto sloupce musí být funkčně závislé na sloupci v GROUP BY. Z SQL-2003-Standard (5WD-02-Foundation-2003-09 - strana 346) - http ://www.wiscorp.com/sql_2003_standard.zip

Například ID ve vzorové tabulce je PRIMÁRNÍ KLÍČ, takže víme, že je v tabulce jedinečný, takže následující dotaz odpovídá standardu SQL a běžel by v MySQL a selhal by v současné době v mnoha DBMS (V době psaní Postgresql je nejbližší DBMS, kterou znám ke správné implementaci standardu - Příklad zde ):

SELECT  ID, Column1, Column2
FROM    T
GROUP BY ID;

Protože je ID pro každý řádek jedinečné, Column1 může mít pouze jednu hodnotu pro každé ID jednu hodnotu Column2 neexistuje žádná nejednoznačnost ohledně toho, co vrátit pro každý řádek.



  1. implementace doporučení (chudého) produktu

  2. XAMPP S PHP/MySQL běží opravdu pomalu

  3. Jak vložit hodnoty do tabulky s dynamickými sloupci Jdbc/Mysql

  4. Výchozí hodnota úrovně Django DB pro sloupec