sql >> Database teknologi >  >> RDS >> Mysql

sql min funktion og anden kolonne

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);


  1. Sådan får du den bedste brug af kommentarfunktionen i MySQL

  2. Syntaksfejl på MERGE-sætning

  3. Kalde pl/sql funktion i java?

  4. Hvordan synkroniseres Mysql DB igen, hvis Master og slave har forskellige databaser i tilfælde af Mysql-replikering?