国产成人精品亚洲日本在线_欧美精品v国产精品v_亚洲欧洲日韩国产一区二区三区_亚洲乱码一二三四区

9000px;">

<address id="tjdjd"></address>
<address id="tjdjd"></address>

    <address id="tjdjd"><nobr id="tjdjd"><progress id="tjdjd"></progress></nobr></address>

      <form id="tjdjd"><listing id="tjdjd"><meter id="tjdjd"></meter></listing></form>
      <address id="tjdjd"></address><address id="tjdjd"></address>

      當前位置 主頁 > 技術大全 >

        MySQL 行轉列完全指南:從基礎 CASE WHEN 到動態 SQL 的深度實踐

        欄目:技術大全 時間:2025-09-23 23:44

        MySQL中的"行轉列"是一個經典且非常實用的數據處理技巧,通常用于將數據從一種易于存儲的格式轉換為一種更易于閱讀和報告的格式。下面我將詳細解釋其概念、方法和應用場景。
        核心概念:什么是行轉列?
        - **行數據**:通常指數據庫中最自然的存儲格式,每一行代表一條獨立的記錄。
        | 學生姓名 | 科目 | 成績 |
        | :------- | :--- | :--- |
        | 張三 | 語文 | 90 |
        | 張三 | 數學 | 85 |
        | 李四 | 語文 | 95 |
        | 李四 | 數學 | 70 |
         
        - **列數據**(行轉列后的目標):將某一列的唯一值(如`科目`)轉換為新的列名,并將其對應的值(如`成績`)填充到新列下。
        | 學生姓名 | 語文 | 數學 |
        | :------- | :--- | :--- |
        | 張三 | 90 | 85 |
        | 李四 | 95 | 70 |
         
        這種轉換也稱為**數據透視(PIVOT)**。
         
        ---
         
        ### 實現行轉列的幾種方法
         
        假設我們有上文的成績表 `scores`。
         
        方法一:使用 `CASE WHEN` + 聚合函數(最通用、最靈活)
         
        這是最經典和兼容性最好的方法,適用于幾乎所有版本的 MySQL。
         
        **思路**:
        1. 使用 `GROUP BY` 按唯一標識(如`學生姓名`)分組,確保一行一個學生。
        2. 對每個需要轉換的列值,使用 `CASE WHEN`(或 `IF`)語句判斷并提取對應的值。
        3. 使用 `MAX` 或 `MIN`、`SUM` 等聚合函數對提取出的值進行聚合(通常用于確保每個分組下只有一個非空值)。
         
        **SQL 示例**:
        ```sql
        SELECT
        學生姓名,
        MAX(CASE WHEN 科目 = '語文' THEN 成績 ELSE NULL END) AS 語文,
        MAX(CASE WHEN 科目 = '數學' THEN 成績 ELSE NULL END) AS 數學
        -- , ...可以繼續添加其他科目
        FROM scores
        GROUP BY 學生姓名;
        ```
         
        **結果**:
        | 學生姓名 | 語文 | 數學 |
        | :------- | :--- | :--- |
        | 張三 | 90 | 85 |
        | 李四 | 95 | 70 |
         
        **為什么用 `MAX`?**
        因為 `GROUP BY` 后,每個學生的每門科目理論上只有一條記錄。`MAX` 的作用是取回那條唯一記錄的值。如果不用聚合函數,SQL 會報錯。你也可以用 `MIN` 或 `SUM`,效果相同。
         
        方法二:使用 `IF()` + 聚合函數(MySQL 的簡潔寫法)
         
        `IF(condition, value_if_true, value_if_false)` 是 `CASE WHEN` 的簡化版,邏輯更清晰。
         
        **SQL 示例**:
        ```sql
        SELECT
        學生姓名,
        MAX(IF(科目 = '語文', 成績, NULL)) AS 語文,
        MAX(IF(科目 = '數學', 成績, NULL)) AS 數學
        FROM scores
        GROUP BY 學生姓名;
        ```
        效果與方法一完全相同。
         
        方法三:使用 `GROUP_CONCAT`(另一種形式的“行轉列”)
         
        有時“轉列”的目的不是生成多個新列,而是將多行數據**合并到一個單元格**中,用分隔符連接。這時 `GROUP_CONCAT` 非常有用。
         
        **SQL 示例**:
        ```sql
        SELECT
        學生姓名,
        GROUP_CONCAT(科目, ':', 成績 SEPARATOR '; ') AS 成績單
        FROM scores
        GROUP BY 學生姓名;
        ```
         
        **結果**:
        | 學生姓名 | 成績單 |
        | :------- | :----------------- |
        | 張三 | 語文:90; 數學:85 |
        | 李四 | 語文:95; 數學:70 |
         
        ---
         
        高級應用:動態行轉列
         
        上面的方法有個巨大缺陷:**需要手動編寫每個要轉換的列值(如‘語文’、‘數學’)**。如果科目是不確定的(例如隨時會增加‘英語’、‘物理’),上面的 SQL 就無法滿足需求。
         
        這時需要使用**存儲過程(Stored Procedure)** 來**動態**生成 SQL 語句。
         
        **思路**:
        1. 查詢出所有需要轉換為列名的唯一值(如所有科目)。
        2. 使用字符串拼接函數(如 `CONCAT`, `GROUP_CONCAT`)構造出包含所有 `CASE WHEN` 語句的 SQL 字符串。
        3. 使用預處理語句(`PREPARE` & `EXECUTE`)來執行這個動態生成的 SQL 字符串。
         
        **示例代碼**:
        ```sql
        -- 1. 定義變量存儲動態生成的SQL
        SET @sql = NULL;
         
        -- 2. 查詢所有不重復的科目,并拼接成 MAX(CASE WHEN...) 的格式
        SELECT
        GROUP_CONCAT(DISTINCT
        CONCAT(
        'MAX(IF(科目 = ''',
        科目,
        ''', 成績, NULL)) AS ',
        CONCAT('`', 科目, '`') -- 用反引號包裹科目名,防止它是關鍵字
        )
        ) INTO @sql
        FROM scores;
         
        -- 3. 拼接完整的SQL語句
        SET @sql = CONCAT('SELECT 學生姓名, ', @sql, ' FROM scores GROUP BY 學生姓名');
         
        -- 4. 預處理并執行動態SQL
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        ```
         
        **執行結果**:無論科目如何變化,這段代碼都會自動生成一個將所有科目作為列名的透視表。
         
        | 學生姓名 | 語文 | 數學 | 英語 | (其他任何科目...) |
        | :------- | :--- | :--- | :--- | :------------------ |
        | 張三 | 90 | 85 | 92 | ... |
        | 李四 | 95 | 70 | 88 | ... |
         
        ---
         
        ### 總結與選擇
         
        | 方法 | 適用場景 | 優點 | 缺點 |
        | :----------------- | :--------------------------------------------- | :--------------------------- | :----------------------------- |
        | **`CASE WHEN`/`IF`** | 要轉換的列值是**固定的、已知的**(如科目固定) | 簡單、直觀、性能好 | 無法自動適應列值的變化 |
        | **`GROUP_CONCAT`** | 需要將多行數據合并到一個字段中顯示 | 非常靈活,不會改變表結構 | 結果不是一個規整的二維表 |
        | **動態SQL** | 要轉換的列值是**動態的、不確定的**(如科目可變) | 全自動,一勞永逸 | 編寫復雜,需要用到存儲過程和預處理 |
         
        **核心要點**:
        1. **行轉列的本質是條件判斷和分組聚合**。
        2. 靜態轉換使用 `CASE WHEN`/`IF` + `MAX` + `GROUP BY`。
        3. 動態轉換需要使用存儲過程拼接 SQL,復雜度較高。
        4. 在選擇方法前,一定要明確需求中的“列”是否是固定的。
        另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導出導入?杀镜剡B接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。

      MySQL 全連接(FULL OUTER JOIN)完全指南:語法、誤區與 UNION 實現方案
      MySQL刪除數據詳解:DELETE與TRUNCATE的原理、區別與正確選用
      MySQL UPDATE語句詳解:從基礎語法到多表連接更新實戰
      從備份到驗證:MySQL表字段刪除操作的標準化流程與最佳實踐
      MySQL分頁查詢詳解:從LIMIT/OFFSET基礎到鍵集分頁性能優化實戰
      告別SQL注入:詳解Python中MySQL參數化查詢的正確使用方法
      MySQL 表結構升級:ALTER TABLE ADD COLUMN 語法詳解與最佳實踐
      深度解析 MySQL 數值與字符串類型:如何精準選擇以優化存儲與性能?
      避開時區陷阱!詳解 MySQL 獲取當前時間的正確姿勢與最佳實踐
      告別NULL值陷阱!深入剖析MySQL CONCAT與CONCAT_WS的差異與最佳實踐
      国产成人精品亚洲日本在线_欧美精品v国产精品v_亚洲欧洲日韩国产一区二区三区_亚洲乱码一二三四区

      <address id="tjdjd"></address>
      <address id="tjdjd"></address>

        <address id="tjdjd"><nobr id="tjdjd"><progress id="tjdjd"></progress></nobr></address>

          <form id="tjdjd"><listing id="tjdjd"><meter id="tjdjd"></meter></listing></form>
          <address id="tjdjd"></address><address id="tjdjd"></address>
          国产拍揄自揄精品视频麻豆| 欧美日韩大陆在线| 国产酒店精品激情| 免费黄网站欧美| 不卡的av中国片| 日韩情涩欧美日韩视频| 日韩电影在线一区| 首页欧美精品中文字幕| 亚洲黄色免费网站| 国产一区二区三区不卡在线观看| 国产精品丝袜黑色高跟| 日韩久久免费av| 日韩欧美在线观看一区二区三区| 日本少妇一区二区| 一区二区三区在线观看欧美| 久久久久久久网| 免费xxxx性欧美18vr| 免费在线观看一区二区三区| 国产精品家庭影院| 2020国产精品久久精品美国| 这里只有精品99re| 日韩精品一区二区三区视频| 欧美成人猛片aaaaaaa| 国产乱人伦偷精品视频不卡| 日韩中文字幕av电影| 麻豆传媒一区二区三区| 在线一区二区三区| 国产精品一区二区三区乱码| 国产成人av自拍| 激情综合色丁香一区二区| 日韩毛片视频在线看| 成人免费视频app| 国产专区综合网| 欧美国产日韩亚洲一区| 成人av第一页| 青青国产91久久久久久| 午夜精品久久久久影视| 欧美在线观看一区二区| 久久香蕉国产线看观看99| 亚洲精选免费视频| 国产色婷婷亚洲99精品小说| 欧美精品在欧美一区二区少妇| 国产精品视频第一区| 国产一区二区三区av电影| 91九色最新地址| 亚洲h精品动漫在线观看| 免费一级片91| 亚洲高清在线视频| xfplay精品久久| 欧美伊人久久久久久久久影院| 国产精品国产自产拍高清av| 日韩精品在线一区| 成人av手机在线观看| 亚洲人成影院在线观看| 精品区一区二区| 免费成人av在线播放| 成人国产精品免费观看动漫| 色偷偷久久一区二区三区| 色哟哟一区二区在线观看| 欧美精品黑人性xxxx| 亚洲电影你懂得| 欧美经典三级视频一区二区三区| 亚洲精品一二三| 国内精品视频一区二区三区八戒| 麻豆成人久久精品二区三区小说| 欧美一区二区在线视频| 午夜精品久久久久久久99水蜜桃| 国产一区二区三区免费看| 捆绑调教一区二区三区| 国内成人免费视频| 韩日欧美一区二区三区| 亚洲成人动漫av| 成人欧美一区二区三区在线播放| 国产精品一区在线| 久久综合综合久久综合| 韩国精品免费视频| 一色屋精品亚洲香蕉网站| 日韩一级精品视频在线观看| 欧美国产日韩在线观看| 亚洲国产欧美另类丝袜| 丁香桃色午夜亚洲一区二区三区| 白白色 亚洲乱淫| 日韩一卡二卡三卡| 日韩精品一区二区三区四区视频| 国产在线精品一区在线观看麻豆| 欧美一区永久视频免费观看| 欧美美女一区二区在线观看| 亚洲一级片在线观看| 欧美国产日韩精品免费观看| 欧美日韩成人综合在线一区二区| 亚洲中国最大av网站| 91蜜桃在线免费视频| 欧美96一区二区免费视频| 亚洲一区二区四区蜜桃| 国产精品三级电影| 日本久久精品电影| 婷婷开心激情综合| 蜜桃av一区二区三区| 亚洲蜜臀av乱码久久精品蜜桃| 麻豆91精品视频| 99re热视频这里只精品| 亚洲视频一区二区免费在线观看| 色婷婷久久久亚洲一区二区三区| 日韩精品国产精品| 日韩码欧中文字| 精品区一区二区| 欧美日韩国产小视频在线观看| 色综合久久综合网欧美综合网| 日韩免费福利电影在线观看| **性色生活片久久毛片| 欧美日本免费一区二区三区| 午夜天堂影视香蕉久久| 日韩天堂在线观看| 久久日韩精品一区二区五区| 欧美日韩另类国产亚洲欧美一级| 免费观看一级特黄欧美大片| 青青国产91久久久久久| 天堂资源在线中文精品| 国产精品99久久久久久似苏梦涵| av成人免费在线| 99精品在线观看视频| 91精品国产色综合久久不卡电影| 麻豆91在线播放| 欧美一区二区三区思思人| 欧美激情一区二区三区不卡| 国产精品538一区二区在线| 午夜精品一区二区三区三上悠亚| 中文字幕欧美激情| 91国产丝袜在线播放| 日韩欧美二区三区| 欧美激情艳妇裸体舞| 欧美日韩高清一区二区不卡| 91一区一区三区| 亚洲高清免费在线| 精品日韩99亚洲| 久久精品欧美一区二区三区麻豆| 欧美久久一区二区| 精品国产一区二区三区忘忧草| 337p日本欧洲亚洲大胆色噜噜| 国产精品123区| 亚洲成人激情社区| 亚洲男人天堂av网| 欧美久久一区二区| 香蕉影视欧美成人| 爽爽淫人综合网网站| 日韩午夜激情免费电影| 成人免费在线视频| 精品在线观看免费| 福利一区在线观看| 国产亚洲欧美日韩在线一区| 精品欧美一区二区在线观看| 麻豆精品一区二区| 91蝌蚪porny| 蜜臀久久99精品久久久久宅男| 欧美va日韩va| 寂寞少妇一区二区三区| 国产精品高潮久久久久无| 天堂久久久久va久久久久| 日韩一区国产二区欧美三区| 欧美一区二区三区视频| 中文字幕乱码久久午夜不卡| eeuss影院一区二区三区| 亚洲情趣在线观看| 日本在线播放一区二区三区| 91亚洲永久精品| 国模无码大尺度一区二区三区| 不卡一卡二卡三乱码免费网站| 99久久久久久99| 91色婷婷久久久久合中文| 在线国产电影不卡| 中文字幕 久热精品 视频在线| 偷拍日韩校园综合在线| 午夜精品123| 色猫猫国产区一区二在线视频| 韩国精品主播一区二区在线观看| 日韩精品自拍偷拍| 欧美在线播放高清精品| 日韩美女一区二区三区四区| 成人精品一区二区三区中文字幕| 欧美日韩高清影院| 欧美色男人天堂| 欧美国产一区视频在线观看| 国产综合色精品一区二区三区| 久久久亚洲精品一区二区三区| 一本一道波多野结衣一区二区| 91小视频在线免费看| 99久久精品免费看国产免费软件| 欧美久久一区二区| 波多野结衣中文字幕一区二区三区| 亚洲一卡二卡三卡四卡| 日韩精品成人一区二区三区| 国产盗摄一区二区| 欧美草草影院在线视频| 亚洲日本在线看| 亚洲国产精品久久久久婷婷884| 国产区在线观看成人精品| 91精品国产丝袜白色高跟鞋| 亚洲香蕉伊在人在线观| 天天亚洲美女在线视频| 综合久久久久久久|