Til at starte med:Nej,
SELECT user_id, MAX(salary) FROM users;
er ikke i overensstemmelse med standarden. Du bruger en aggregeret funktion (MAX
) uden en GROUP BY
klausul. Ved at gøre det fortæller du DBMS'et om at aggregere alle poster til en enkelt resultatrække. Hvad fortæller du nu, at DBMS skal vise i denne resultatrække? Den maksimale løn fundet i tabellen (MAX(salary)
) og den user_id
. Der er dog ingen den user_id
; der er muligvis mange forskellige user_id
i bordet. Dette er i strid med SQL-standarden. MySQL tager sig friheden til at fortolke det ikke-aggregerede user_id
som enhver user_id
(vilkårligt udvalgt).
Så selvom forespørgslen kører, er resultatet normalt ikke det ønskede.
Denne forespørgsel:
SELECT user_id, name, MAX(salary) FROM users GROUP BY user_id;
på den anden side er standard-kompatibel. Lad os se igen, hvad denne forespørgsel gør:Denne gang er der en GROUP BY
klausul, der fortæller DBMS'en, at du vil have én resultatrække pr. user_id
. For hver user_id
du vil vise:den user_id
, den name
, og den maksimale salary
. Alle disse er gyldige udtryk; den user_id
er user_id
sig selv, den navn er det ene brugernavn, der er knyttet til user_id
, og den maksimale salary
er brugerens maksimale løn. Den uaggregerede kolonne name
er tilladt, fordi det er funktionelt afhængigt af grupperet efter user_id
. Mange DBMS understøtter dog ikke dette, fordi det kan blive ekstremt kompliceret at afgøre, om et udtryk er funktionelt afhængig af gruppen eller ej.
Med hensyn til, hvordan man viser brugerregistreringen med den maksimale løn, har du brug for en begrænsningsklausul. MySQL giver LIMIT
for dette, som kan give dig de første n rækker. Det handler dog ikke om bånd.
SELECT * FROM users ORDER BY salary DESC LIMIT 1;
er
SELECT * FROM users ORDER BY salary FETCH FIRST ROW ONLY;
i standard SQL.
For at håndtere bånd, dog som i
SELECT * FROM users ORDER BY salary FETCH FIRST ROW WITH TIES;
du har brug for en underforespørgsel i MySQL, fordi LIMIT
understøtter ikke dette:
SELECT * FROM users WHERE salary = (SELECT MAX(salary) FROM users);