在 SQL 中,區分 聚合列 和 非聚合列(nonaggregated column)

文章目錄

      • 1. 什么是聚合列?
      • 2. 什么是非聚合列?
      • 3. 在 `GROUP BY` 查詢中的非聚合列
        • 問題示例
        • 解決方案
      • 4. 為什么 `only_full_group_by` 要求非聚合列出現在 `GROUP BY` 中?
      • 5. 如何判斷一個列是聚合列還是非聚合列?
      • 6. 總結

在 SQL 中, 非聚合列是指那些沒有使用聚合函數(如 COUNTSUMAVGMAXMIN 等)的列。理解這個概念的關鍵在于區分 聚合列非聚合列


1. 什么是聚合列?

聚合列是指使用了聚合函數的列。聚合函數會對一組值進行計算,并返回一個單一的值。例如:

  • COUNT(*):計算行數。
  • SUM(column):計算某列的總和。
  • AVG(column):計算某列的平均值。
  • MAX(column):返回某列的最大值。
  • MIN(column):返回某列的最小值。

示例

SELECT COUNT(*) AS total_users FROM users;
  • 這里的 COUNT(*) 是一個聚合列,因為它使用了聚合函數 COUNT

2. 什么是非聚合列?

非聚合列是指沒有使用聚合函數的列。這些列直接來自表中的數據,而不是通過計算得到的。

示例

SELECT name, age FROM users;
  • 這里的 nameage 都是非聚合列,因為它們直接來自表中的數據,沒有使用任何聚合函數。

3. 在 GROUP BY 查詢中的非聚合列

當使用 GROUP BY 時,查詢會將數據按指定的列分組。對于非聚合列,MySQL 需要明確知道如何選擇值,因為每個分組可能包含多行數據。

問題示例

假設有一個表 users,數據如下:

idnameage
1Alice20
2Bob20
3Charlie25

執行以下查詢:

SELECT name, age, COUNT(*) FROM users GROUP BY age;
  • 這里的 age 是分組列,COUNT(*) 是聚合列。
  • name 是非聚合列,它沒有出現在 GROUP BY 子句中,也沒有使用聚合函數。
  • MySQL 不知道在分組后應該選擇哪個 name 值(因為 age=20 對應兩個 nameAliceBob)。
解決方案
  1. 將非聚合列添加到 GROUP BY 子句中

    SELECT name, age, COUNT(*) FROM users GROUP BY name, age;
    
    • 這樣,MySQL 會按 nameage 分組,確保每個分組只有一行數據。
  2. 使用聚合函數處理非聚合列

    SELECT MAX(name), age, COUNT(*) FROM users GROUP BY age;
    
    • 這里使用 MAX(name),表示選擇每個分組中 name 的最大值。

4. 為什么 only_full_group_by 要求非聚合列出現在 GROUP BY 中?

only_full_group_by 模式的目的是確保查詢結果的明確性。如果沒有這個限制,MySQL 可能會隨機選擇一個值作為非聚合列的結果,導致查詢結果不可預測。

示例

SELECT name, age, COUNT(*) FROM users GROUP BY age;
  • 如果 age=20 對應兩個 nameAliceBob),MySQL 可能隨機返回 AliceBob,這會導致結果不一致。

通過啟用 only_full_group_by,MySQL 會強制要求所有非聚合列都出現在 GROUP BY 子句中,從而避免這種不確定性。


5. 如何判斷一個列是聚合列還是非聚合列?

  • 聚合列:使用了聚合函數(如 COUNTSUMAVGMAXMIN 等)。
  • 非聚合列:直接來自表中的數據,沒有使用聚合函數。

示例

SELECT name, age, COUNT(*) AS total_users FROM users GROUP BY name, age;
  • nameage 是非聚合列。
  • COUNT(*) 是聚合列。

6. 總結

  • 非聚合列是指沒有使用聚合函數的列,直接來自表中的數據。
  • GROUP BY 查詢中,所有非聚合列必須出現在 GROUP BY 子句中,或者使用聚合函數處理。
  • only_full_group_by 模式的作用是確保查詢結果的明確性,避免不明確的值。

通過理解聚合列和非聚合列的區別,可以更好地編寫符合 only_full_group_by 要求的 SQL 查詢。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64964.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ETL處理工具Kettle入門

1. Kettle簡介 Kettle(現已更名為Pentaho Data Integration,簡稱PDI)是一個開源的ETL工具,能夠進行數據的抽取(Extract)、轉換(Transform)和加載(Load)。它是…

petalinux2017.4對linux4.9.0打實時補丁

準備工作: 1.windows:安裝vivado 2017.4,xilinx sdk 2017.4 2.ubuntu16.04:安裝petalinux 2017 3.黑金ax7020,sd卡 一、準備linux內核的操作系統 1.1 Petalinux配置 Petalinux使用教程-CSDN博客非常詳細&#xf…

Maven 教程之 pom.xml 詳解

Maven 教程之 pom.xml 詳解 pom.xml 簡介 什么是 pom POM 是 Project Object Model 的縮寫,即項目對象模型。 pom.xml 就是 maven 的配置文件,用以描述項目的各種信息。 pom 配置一覽 <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi

Golang的緩存一致性策略

Golang的緩存一致性策略 一致性哈希算法 在Golang中&#xff0c;緩存一致性策略通常使用一致性哈希算法來實現。一致性哈希算法能夠有效地解決緩存節點的動態擴容、縮容時數據重新分布的問題&#xff0c;同時能夠保證數據訪問的均衡性。 一致性哈希算法的核心思想是將節點的哈希…

【機器學習:一、機器學習簡介】

機器學習是當前人工智能領域的重要分支&#xff0c;其目標是通過算法從數據中提取模式和知識&#xff0c;并進行預測或決策。以下從 機器學習概述、有監督學習 和 無監督學習 三個方面進行介紹。 機器學習概述 機器學習定義 機器學習&#xff08;Machine Learning&#xff0…

藍橋杯JAVA--003

需求 2.代碼 public class RegularExpressionMatching {public boolean isMatch(String s, String p) {if (p.isEmpty()) {return s.isEmpty();}boolean firstMatch !s.isEmpty() && (s.charAt(0) p.charAt(0) || p.charAt(0) .);if (p.length() > 2 && p…

被催更了,2025元旦源碼繼續免費送

“時間從來不會停下&#xff0c;它只會匆匆流逝。抓住每一刻&#xff0c;我們才不會辜負自己。” 聯系作者免費領&#x1f496;源&#x1f496;碼。 三聯支持&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd;歡迎留言討論 更多內容敬請期待。如有需要源碼可以聯系作者免…

WebRTC的線程事件處理

1. 不同平臺下處理事件的API&#xff1a; Linux系統下&#xff0c;處理事件的API是epoll或者select&#xff1b;Windows系統下&#xff0c;處理事件的API是WSAEventSelect&#xff0c;完全端口&#xff1b;Mac系統下&#xff0c;kqueue 2. WebRTC下的事件處理類&#xff1a; …

關于Zotero

1、文獻數據庫&#xff1a; Zotero的安裝 Zotero安裝使用_zotero只能安裝在c盤嗎-CSDN博客 2、如何使用zotero插件 我剛下載的時候就結合使用的是下面的這兩個博主的分享&#xff0c;感覺暫時是足夠的。 Zotero入&#x1f6aa;基礎 - 小紅書 Green Frog申請easyscholar密鑰…

企業三要素如何用PHP實現調用

一、什么是企業三要素&#xff1f; 企業三要素即傳入的企業名稱、法人名稱、社會統一信用代碼或注冊號&#xff0c;校驗此三項是否一致。 二、具體怎么樣通過PHP實現接口調用&#xff1f; 下面我們以阿里云為例&#xff0c;通過PHP示例代碼進行調用&#xff0c;參考如下&…

Go 語言中強大的配置管理庫—Viper

Viper 是 Go 語言中強大的配置管理庫&#xff0c;廣泛用于云原生和微服務開發中。它支持多種配置文件格式&#xff08;如 YAML、JSON、TOML 等&#xff09;、環境變量、命令行參數以及遠程配置管理。 Viper 的主要功能 1. 支持多種格式的配置文件&#xff1a; ? YAML、JSON…

鴻蒙-封裝loading動畫

import { AnimatorOptions, AnimatorResult } from "kit.ArkUI" export enum SpinImageType { RedLoading, WhiteLoading } Component export struct SpinImage { Prop type?: SpinImageType Prop url?: string State animatedValue: number 0 …

今日復盤103周五(189)

1、早上&#xff0c;看了一下二手書里的十種主要游戲類型的相關內容。 其實收獲不大&#xff0c;主要是引發思考。 2、白天&#xff0c;持續多日的模式1的白模原型關卡結束&#xff0c;開始轉做準正式資源的關卡&#xff0c; 但進度低于預期。 并不是改改參數那么簡單輕松&a…

OJ隨機鏈表的復制題目分析

題目內容&#xff1a; 138. 隨機鏈表的復制 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 這道題目&#xff0c;第一眼感覺非常亂&#xff0c;這是正常的&#xff0c;但是我們經過仔細分析示例明白后&#xff0c;其實也并不是那么難。現在讓我們一起來分析分析…

uc/os-II 原理及應用(一) 嵌入式實時系統基本概念

基于嵌入式實時操作系統μCOS-II原理及應用(第2版)-任哲 自行網上尋找資源。 計算機系統的中分為計算機硬件系統與計算機軟件系統&#xff0c;計算機軟件系統由上到下分為&#xff0c;應用軟件&#xff0c;系統軟件&#xff0c;操作系統;操作系統一般在計算機軟件的最低層&…

C++ 并發專題 - std::promise 和 std::future 介紹

一&#xff1a;概述 std::promise 和 std::future 是C標準庫的兩種工具&#xff0c;主要用于實現線程之間的異步通信。它們屬于C并發庫的一部分&#xff0c;提供了一種安全&#xff0c;優雅的方式來在線程之間傳遞結果或狀態。 二&#xff1a;std::promise 介紹 std::promise …

【Multisim用74ls92和90做六十進制】2022-6-12

緣由Multisim如何用74ls92和90做六十進制-其他-CSDN問答 74LS92、74LS90參考

【UE5 C++課程系列筆記】21——弱指針的簡單使用

目錄 概念 聲明和初始化 轉換為共享指針 打破循環引用 弱指針使用警告 概念 在UE C 中&#xff0c;弱指針&#xff08;TWeakPtr &#xff09;也是一種智能指針類型&#xff0c;主要用于解決循環引用問題以及在不需要強引用保證對象始終有效的場景下&#xff0c;提供一種可…

數據庫知識匯總2

一. 范式 定義&#xff1a;范式是符合某一種級別的關系模式的集合。 關系數據庫中的關系必須滿足一定的要求。滿足不同程度要求的為不同范式&#xff1b; 一個低一級范式的關系模式&#xff0c;通過模式分解&#xff08;schema decomposition&#xff09;可以轉換為若干個高一…

C# 設計模式(結構型模式):橋接模式

C# 設計模式&#xff08;結構型模式&#xff09;&#xff1a;橋接模式 在軟件設計中&#xff0c;我們經常會遇到系統的變化頻繁&#xff0c;或者需要靈活擴展功能的場景。這時&#xff0c;橋接模式&#xff08;Bridge Pattern&#xff09;便顯得尤為重要。橋接模式是一個結構型…