sql >> Databasteknik >  >> RDS >> Mysql

MySQL 5.7 &only_full_group_by

  1. Ja. Icke aggregerade kolumner är alla kolumner som inte använder en aggregeringsfunktion som MAX , COUNT , SUM , GROUP_CONCAT , etc.

  2. Kolumn a är funktionellt beroende av kolumn b om värdet på b innebär ett särskilt värde på a . Detta betyder i allmänhet att b är en unik nyckel för tabellen och a är någon annan kolumn i den tabellen.

  3. Unikt bestämt av är detsamma som funktionellt beroende.

  4. Alternativet skulle vara att lista alla icke aggregerade kolumner i GROUP BY lista:GROUP BY a.Z, a.Y, a.X .

Anledningen till allt detta är att när du väljer kolumner som inte finns i GROUP BY listan kommer de från godtyckliga rader i de grupperade raderna. Detta leder till många vanliga fel. Ett vanligt misstag är till exempel att skriva:

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

och förvänta dig ip_address för att innehålla adressen till den senaste inloggningen för varje användare. Men den kommer faktiskt att innehålla alla av adresserna de loggade in från, inte den från raden med MAX(timestamp) . Se SQL Välj endast rader med maxvärde på en kolumn för det korrekta sättet att göra det.

Undantaget för funktionellt beroende är vanligtvis användbart med joins.

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

Sedan user_id är den primära nyckeln för users tabell, bestämmer den unikt user_name , så det är inte nödvändigt att lista det uttryckligen i GROUP BY .




  1. UNION efter ORDER BY och LIMIT

  2. Rutinmässiga rekommendationer för säkerhetskopiering av innehåll

  3. Hur kör man en stor MySQL-datainfogningsskriptfil med kommandoraden i Windows 7?

  4. SQL-fråga returnerar data från flera tabeller