Pro začátek:Ne,
SELECT user_id, MAX(salary) FROM users;
není v souladu se standardy. Používáte agregační funkci (MAX ) bez GROUP BY doložka. Tím sdělíte systému DBMS, aby agregoval všechny záznamy do jednoho řádku výsledku. Co nyní řeknete systému DBMS, aby se zobrazil v tomto řádku výsledků? Maximální plat nalezený v tabulce (MAX(salary) ) a the user_id . Neexistuje však žádné to user_id; možná existuje mnoho různých user_id ve stole. To porušuje standard SQL. MySQL si dovoluje interpretovat neagregované user_id jako jakýkoli user_id (libovolně vybrané).
Takže i když se dotaz spustí, jeho výsledek obvykle není požadovaný.
Tento dotaz:
SELECT user_id, name, MAX(salary) FROM users GROUP BY user_id;
na druhou stranu je v souladu se standardy. Podívejme se znovu, co dělá tento dotaz:Tentokrát je zde GROUP BY klauzule informující DBMS, že chcete jeden řádek výsledku na user_id . Pro každé user_id chcete zobrazit:the user_id , the name a maximální salary . To vše jsou platné výrazy; the user_id je user_id sám, the name je jedno uživatelské jméno spojené s user_id a maximální salary je maximální mzda uživatele. Neagregovaný sloupec name je povoleno, protože je funkčně závislé na seskupeném podle user_id . Mnoho DBMS to však nepodporuje, protože může být extrémně komplikované určit, zda je výraz funkčně závislý na skupině nebo ne.
K tomu, jak zobrazit záznam uživatele s maximální mzdou, potřebujete omezující klauzuli. MySQL poskytuje LIMIT za to, že můžete získat prvních n řádků. Nezabývá se však vazbami.
SELECT * FROM users ORDER BY salary DESC LIMIT 1;
je
SELECT * FROM users ORDER BY salary FETCH FIRST ROW ONLY;
ve standardním SQL.
Abychom se vypořádali s vazbami, ale jako v
SELECT * FROM users ORDER BY salary FETCH FIRST ROW WITH TIES;
potřebujete poddotaz v MySQL, protože LIMIT toto nepodporuje:
SELECT * FROM users WHERE salary = (SELECT MAX(salary) FROM users);