sql >> Databasteknik >  >> RDS >> Mysql

Vilka DBMS tillåter en order by av ett attribut som inte finns i select-satsen?

Din fråga är helt laglig syntax, du kan sortera efter kolumner som inte finns i urvalet.

Om du behöver de fullständiga specifikationerna för juridisk ordning, har den i SQL Standard 2003 en lång lista med uttalanden om vad ordningen av bör och inte bör innehålla, (02-Foundation, sida 415, avsnitt 7.13 , sub del 28). Detta bekräftar att din fråga är laglig syntax.

Jag tror att din förvirring kan bero på att du väljer och/eller sorterar efter kolumner som inte finns i gruppen efter, eller sorterar efter kolumner som inte finns i urvalet när du använder distinkt.

Båda har samma grundläggande problem, och MySQL är den enda som jag vet som tillåter antingen.

Problemet är detta, att när du använder grupp efter eller distinkt, behövs inga kolumner som inte finns i någondera, så det spelar ingen roll om de har flera olika värden över rader eftersom de aldrig behövs. Föreställ dig denna enkla datauppsättning:

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

Om du skriver:

SELECT  DISTINCT Column1
FROM    T;

Du skulle få

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

Om du sedan lägger till ORDER BY Column2 , vilken av de två kolumn2 skulle du använda för att beställa A efter, X eller Z? Det är inte deterministiskt hur man väljer ett värde för kolumn2.

Detsamma gäller för att välja kolumner som inte ingår i gruppen efter. För att förenkla, föreställ dig bara de två första raderna i föregående tabell:

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

I MySQL kan du skriva

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

Detta bryter faktiskt SQL-standarden, men det fungerar i MySQL, men problemet är att det är icke-deterministiskt, resultatet:

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

Är varken mer eller mindre korrekt än

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

Så det du säger är att ge mig en rad för varje distinkt värde på Column1 , vilka båda resultatuppsättningarna uppfyller, så hur vet du vilken du kommer att få? Det gör du inte, det verkar vara en ganska populär missuppfattning att du kan lägga till och ORDER BY klausul för att påverka resultaten, så till exempel följande fråga:

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

Skulle se till att du får följande resultat:

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

på grund av ORDER BY ID DESC , men detta är inte sant (som visas här ).

MySQL-dokumenten ange:

Så även om du har en ordning gäller detta inte förrän efter att en rad per grupp har valts, och den här raden är icke-deterministisk.

SQL-standarden tillåter kolumner i urvalslistan som inte finns i GROUP BY eller en aggregerad funktion, men dessa kolumner måste vara funktionellt beroende av en kolumn i GROUP BY. Från SQL-2003-Standard (5WD-02-Foundation-2003-09 - sida 346) - http ://www.wiscorp.com/sql_2003_standard.zip

Till exempel är ID i exempeltabellen PRIMÄRNYCKELN, så vi vet att den är unik i tabellen, så följande fråga överensstämmer med SQL-standarden och skulle köras i MySQL och misslyckas i många DBMS för närvarande (I skrivande stund Postgresql är det närmaste DBMS jag känner till att korrekt implementera standarden - Exempel här ):

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

Eftersom ID är unikt för varje rad kan det bara finnas ett värde för Column1 för varje ID, ett värde av Column2 det finns ingen tvetydighet om vad som ska returneras för varje rad.



  1. Databasstorleksberäkning?

  2. MySQL DROP VIEW

  3. Hur man får väl indexerade MySQL-tabeller att sammanfogas effektivt

  4. Det går inte att konvertera MySQL datum/tid värde till System.DateTime. Kunde inte lagra 0/0/0000 0:00:00 värde?