sql >> Databáze >  >> RDS >> Mysql

sql min funkce a další sloupec

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


  1. uložit více hodnot zaškrtávacích polí do databáze pomocí php a mysql

  2. Jak opravit CHYBU:sloupec c.relhasoids v Postgresu neexistuje?

  3. Vícejazyčná pole v tabulkách DB

  4. Odstranění duplicitních hodnot na základě pouze jednoho sloupce tabulky