sql >> Databasteknik >  >> RDS >> Sqlserver

sql grupp efter kontra distinkt

GROUP BY mappar grupper av rader till en rad, per distinkt värde i specifikt kolumner, som inte ens nödvändigtvis måste finnas i urvalslistan.

SELECT b, c, d FROM table1 GROUP BY a;

Den här frågan är laglig SQL (korrigering: endast i MySQL; Det är faktiskt inte standard SQL och stöds inte av andra märken). MySQL accepterar det och litar på att du vet vad du gör genom att välja b , c och d på ett entydigt sätt eftersom de är funktionella beroenden av a .

Microsoft SQL Server och andra märken tillåter dock inte den här frågan, eftersom den inte lätt kan fastställa funktionella beroenden. redigera: Istället kräver standard SQL att du följer Enkelvärdesregeln , dvs varje kolumn i urvalslistan måste antingen namnges i GROUP BY sats eller annars vara ett argument till en uppsättningsfunktion.

Medan DISTINCT tittar alltid på alla kolumner i urvalslistan, och endast de kolumnerna. Det är en vanlig missuppfattning att DISTINCT låter dig ange kolumnerna:

SELECT DISTINCT(a), b, c FROM table1;

Trots att parentesen gör DISTINCT ser ut som funktionsanrop, det är det inte. Det är ett frågealternativ och ett distinkt värde i något av de tre fälten i urvalslistan leder till en distinkt rad i frågeresultatet. Ett av uttrycken i den här urvalslistan har parenteser runt sig, men detta påverkar inte resultatet.



  1. Åtgärda SQL-databas korrupt under uppgraderingsproblem

  2. Hur man undviker att dividera med noll i MySQL

  3. Kan PostgreSQL indexera arraykolumner?

  4. Introduktion av vanliga tabelluttryck i SQL Server