sql >> Database >  >> RDS >> Mysql

MySQL 5.7 &only_full_group_by

  1. Ja. Niet-geaggregeerde kolommen zijn kolommen die geen aggregatiefunctie gebruiken, zoals MAX , COUNT , SUM , GROUP_CONCAT , enz.

  2. Kolom a is functioneel afhankelijk van kolom b als de waarde van b impliceert een bepaalde waarde van a . Dit betekent over het algemeen dat b is een unieke sleutel voor de tabel, en a is een andere kolom in die tabel.

  3. Uniek bepaald door is hetzelfde als functionele afhankelijkheid.

  4. Het alternatief zou zijn om alle niet-geaggregeerde kolommen op te sommen in de GROUP BY lijst:GROUP BY a.Z, a.Y, a.X .

De reden voor dit alles is dat wanneer u kolommen selecteert die niet in de GROUP BY lijst, komen ze uit willekeurige rijen in de gegroepeerde rijen. Dit leidt tot veel voorkomende fouten. Een veelgemaakte fout is bijvoorbeeld om te schrijven:

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

en verwacht ip_address om het adres van de meest recente login voor elke gebruiker te bevatten. Maar het zal eigenlijk elke . bevatten van de adressen waarmee ze zich hebben aangemeld, niet die van de rij met MAX(timestamp) . Zie SQL Selecteer alleen rijen met maximale waarde in een kolom voor de juiste manier om dat te doen.

De uitzondering voor functionele afhankelijkheid is meestal handig bij 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

Sinds user_id is de primaire sleutel van de users tabel, bepaalt het op unieke wijze user_name , dus het is niet nodig om dat expliciet te vermelden in GROUP BY .




  1. rake db:create throws database bestaat niet fout met postgresql

  2. Resultaten beperken in Oracle

  3. Ruimte berekenen en besparen in PostgreSQL

  4. utl_file.fopen Parameters in Oracle