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

MySQL 5.7 &only_full_group_by

  1. Ano. Neagregované sloupce jsou všechny sloupce, které nepoužívají agregační funkci jako MAX , COUNT , SUM , GROUP_CONCAT , atd.

  2. Sloupec a je funkčně závislý na sloupci b pokud je hodnota b implikuje konkrétní hodnotu a . To obecně znamená, že b je jedinečný klíč pro tabulku a a je nějaký jiný sloupec v této tabulce.

  3. Jednoznačně určené pomocí je stejné jako funkční závislost.

  4. Alternativou by bylo vypsat všechny neagregované sloupce v GROUP BY seznam:GROUP BY a.Z, a.Y, a.X .

Důvodem toho všeho je, že když vyberete sloupce, které nejsou v GROUP BY seznamu, budou pocházet z libovolných řádků ve seskupených řádcích. To vede k mnoha běžným chybám. Běžnou chybou je například napsat:

SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id

a očekávejte ip_address obsahovat adresu posledního přihlášení pro každého uživatele. Ve skutečnosti však bude obsahovat jakékoli adres, ze kterých se přihlásili, nikoli adresy z řádku s MAX(timestamp) . Viz SQL Vybrat pouze řádky s maximální hodnotou ve sloupci pro správný způsob, jak to udělat.

Výjimka funkční závislosti je obvykle užitečná u spojení.

SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id

Od user_id je primární klíč users tabulka, jednoznačně určuje user_name , takže to není nutné výslovně uvádět v GROUP BY .




  1. alternativa k mysql_field_name v mysqli

  2. Je MS-SQL AND/OR podmíněné (provést vyhodnocení zkratu)?

  3. Počítání instancí jedinečné hodnoty v poli

  4. Jedinečná otázka citlivosti varchar na velká a malá písmena SQL