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