国产成人精品亚洲日本在线_欧美精品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>

      當(dāng)前位置 主頁(yè) > 技術(shù)大全 >

        面試官問 MySQL 行轉(zhuǎn)列?我把靜態(tài)和動(dòng)態(tài)兩種方案都講明白了

        欄目:技術(shù)大全 時(shí)間:2025-09-19 22:40

        MySQL中的"行轉(zhuǎn)列"是一個(gè)經(jīng)典且非常實(shí)用的數(shù)據(jù)處理技巧,通常用于將數(shù)據(jù)從一種易于存儲(chǔ)的格式轉(zhuǎn)換為一種更易于閱讀和報(bào)告的格式。下面我將詳細(xì)解釋其概念、方法和應(yīng)用場(chǎng)景。

        核心概念:什么是行轉(zhuǎn)列?

        • 行數(shù)據(jù):通常指數(shù)據(jù)庫(kù)中最自然的存儲(chǔ)格式,每一行代表一條獨(dú)立的記錄。

        | 學(xué)生姓名 | 科目 | 成績(jī) |

        | :------- | :--- | :--- |

        | 張三 | 語(yǔ)文 | 90 |

        | 張三 | 數(shù)學(xué) | 85 |

        | 李四 | 語(yǔ)文 | 95 |

        | 李四 | 數(shù)學(xué) | 70 |

        • 列數(shù)據(jù)(行轉(zhuǎn)列后的目標(biāo)):將某一列的唯一值(如​​科目​​​)轉(zhuǎn)換為新的列名,并將其對(duì)應(yīng)的值(如​​成績(jī)​​)填充到新列下。

        | 學(xué)生姓名 | 語(yǔ)文 | 數(shù)學(xué) |

        | :------- | :--- | :--- |

        | 張三 | 90 | 85 |

        | 李四 | 95 | 70 |

        這種轉(zhuǎn)換也稱為數(shù)據(jù)透視(PIVOT)。


        實(shí)現(xiàn)行轉(zhuǎn)列的幾種方法

        假設(shè)我們有上文的成績(jī)表 ​​scores​​。

        方法一:使用 ​​CASE WHEN​​ + 聚合函數(shù)(最通用、最靈活)

        這是最經(jīng)典和兼容性最好的方法,適用于幾乎所有版本的 MySQL。

        思路

        1. 使用 ​​GROUP BY​​​ 按唯一標(biāo)識(shí)(如​​學(xué)生姓名​​)分組,確保一行一個(gè)學(xué)生。
        2. 對(duì)每個(gè)需要轉(zhuǎn)換的列值,使用 ​​CASE WHEN​​​(或 ​​IF​​)語(yǔ)句判斷并提取對(duì)應(yīng)的值。
        3. 使用 ​​MAX​​​ 或 ​​MIN​​​、​​SUM​​ 等聚合函數(shù)對(duì)提取出的值進(jìn)行聚合(通常用于確保每個(gè)分組下只有一個(gè)非空值)。

        SQL 示例

        SELECT
        
        學(xué)生姓名,
        
        MAX(CASE WHEN 科目 = '語(yǔ)文' THEN 成績(jī) ELSE NULL END) AS 語(yǔ)文,
        
        MAX(CASE WHEN 科目 = '數(shù)學(xué)' THEN 成績(jī) ELSE NULL END) AS 數(shù)學(xué)
        
        -- , ...可以繼續(xù)添加其他科目
        
        FROM scores
        
        GROUP BY 學(xué)生姓名;

        結(jié)果

        | 學(xué)生姓名 | 語(yǔ)文 | 數(shù)學(xué) |

        | :------- | :--- | :--- |

        | 張三 | 90 | 85 |

        | 李四 | 95 | 70 |

        為什么用 MAX

        因?yàn)?​​GROUP BY​​​ 后,每個(gè)學(xué)生的每門科目理論上只有一條記錄。​​MAX​​​ 的作用是取回那條唯一記錄的值。如果不用聚合函數(shù),SQL 會(huì)報(bào)錯(cuò)。你也可以用 ​​MIN​​​ 或 ​​SUM​​,效果相同。

        方法二:使用 ​​IF()​​ + 聚合函數(shù)(MySQL 的簡(jiǎn)潔寫法)

        ​IF(condition, value_if_true, value_if_false)​​​ 是 ​​CASE WHEN​​ 的簡(jiǎn)化版,邏輯更清晰。

        SQL 示例

        SELECT
        
        學(xué)生姓名,
        
        MAX(IF(科目 = '語(yǔ)文', 成績(jī), NULL)) AS 語(yǔ)文,
        
        MAX(IF(科目 = '數(shù)學(xué)', 成績(jī), NULL)) AS 數(shù)學(xué)
        
        FROM scores
        
        GROUP BY 學(xué)生姓名;

        效果與方法一完全相同。

        方法三:使用 ​​GROUP_CONCAT​​(另一種形式的“行轉(zhuǎn)列”)

        有時(shí)“轉(zhuǎn)列”的目的不是生成多個(gè)新列,而是將多行數(shù)據(jù)合并到一個(gè)單元格中,用分隔符連接。這時(shí) ​​GROUP_CONCAT​​ 非常有用。

        SQL 示例

        SELECT
        
        學(xué)生姓名,
        
        GROUP_CONCAT(科目, ':', 成績(jī) SEPARATOR '; ') AS 成績(jī)單
        
        FROM scores
        
        GROUP BY 學(xué)生姓名;

        結(jié)果

        | 學(xué)生姓名 | 成績(jī)單 |

        | :------- | :----------------- |

        | 張三 | 語(yǔ)文:90; 數(shù)學(xué):85 |

        | 李四 | 語(yǔ)文:95; 數(shù)學(xué):70 |


        高級(jí)應(yīng)用:動(dòng)態(tài)行轉(zhuǎn)列

        上面的方法有個(gè)巨大缺陷:需要手動(dòng)編寫每個(gè)要轉(zhuǎn)換的列值(如‘語(yǔ)文’、‘數(shù)學(xué)’)。如果科目是不確定的(例如隨時(shí)會(huì)增加‘英語(yǔ)’、‘物理’),上面的 SQL 就無(wú)法滿足需求。

        這時(shí)需要使用存儲(chǔ)過程(Stored Procedure) 來(lái)動(dòng)態(tài)生成 SQL 語(yǔ)句。

        思路

        1. 查詢出所有需要轉(zhuǎn)換為列名的唯一值(如所有科目)。
        2. 使用字符串拼接函數(shù)(如 ​​CONCAT​​​, ​​GROUP_CONCAT​​​)構(gòu)造出包含所有 ​​CASE WHEN​​ 語(yǔ)句的 SQL 字符串。
        3. 使用預(yù)處理語(yǔ)句(​​PREPARE​​​ & ​​EXECUTE​​)來(lái)執(zhí)行這個(gè)動(dòng)態(tài)生成的 SQL 字符串。

        示例代碼

        -- 1. 定義變量存儲(chǔ)動(dòng)態(tài)生成的SQL
        
        SET @sql = NULL;
        
        
        
        -- 2. 查詢所有不重復(fù)的科目,并拼接成 MAX(CASE WHEN...) 的格式
        
        SELECT
        
        GROUP_CONCAT(DISTINCT
        
        CONCAT(
        
        'MAX(IF(科目 = ''',
        
        科目,
        
        ''', 成績(jī), NULL)) AS ',
        
        CONCAT('`', 科目, '`') -- 用反引號(hào)包裹科目名,防止它是關(guān)鍵字
        
        )
        
        ) INTO @sql
        
        FROM scores;
        
        
        
        -- 3. 拼接完整的SQL語(yǔ)句
        
        SET @sql = CONCAT('SELECT 學(xué)生姓名, ', @sql, ' FROM scores GROUP BY 學(xué)生姓名');
        
        
        
        -- 4. 預(yù)處理并執(zhí)行動(dòng)態(tài)SQL
        
        PREPARE stmt FROM @sql;
        
        EXECUTE stmt;
        
        DEALLOCATE PREPARE stmt;

        執(zhí)行結(jié)果:無(wú)論科目如何變化,這段代碼都會(huì)自動(dòng)生成一個(gè)將所有科目作為列名的透視表。

        | 學(xué)生姓名 | 語(yǔ)文 | 數(shù)學(xué) | 英語(yǔ) | (其他任何科目...) |

        | :------- | :--- | :--- | :--- | :------------------ |

        | 張三 | 90 | 85 | 92 | ... |

        | 李四 | 95 | 70 | 88 | ... |


        總結(jié)與選擇

        | 方法 | 適用場(chǎng)景 | 優(yōu)點(diǎn) | 缺點(diǎn) |

        | :----------------- | :--------------------------------------------- | :--------------------------- | :----------------------------- |

        | ​CASE WHEN/IF​ | 要轉(zhuǎn)換的列值是固定的、已知的(如科目固定) | 簡(jiǎn)單、直觀、性能好 | 無(wú)法自動(dòng)適應(yīng)列值的變化 |

        | ​GROUP_CONCAT

        | 動(dòng)態(tài)SQL | 要轉(zhuǎn)換的列值是動(dòng)態(tài)的、不確定的(如科目可變) | 全自動(dòng),一勞永逸 | 編寫復(fù)雜,需要用到存儲(chǔ)過程和預(yù)處理 |

        核心要點(diǎn)

        1. 行轉(zhuǎn)列的本質(zhì)是條件判斷和分組聚合。
        2. 靜態(tài)轉(zhuǎn)換使用 ​​CASE WHEN​​​/​​IF​​​ + ​​MAX​​​ + ​​GROUP BY​​。
        3. 動(dòng)態(tài)轉(zhuǎn)換需要使用存儲(chǔ)過程拼接 SQL,復(fù)雜度較高。
        4. 在選擇方法前,一定要明確需求中的“列”是否是固定的。

        另外搭配便捷的MYSQL備份工具,可定時(shí)備份、異地備份,MYSQL導(dǎo)出導(dǎo)入。可本地連接LINUX里的MYSQL,簡(jiǎn)單便捷?梢源蟠蟮靥岣吖ぷ餍枢。

      MySQL鎖表會(huì)影響你的備份操作嗎?
      探索MySQL引擎?先掌握其備份恢復(fù)原理!
      mysql怎么安裝,MySQL安裝完畢怎樣設(shè)置自動(dòng)備份才省心?
      MySQL 全連接(FULL OUTER JOIN)完全指南:語(yǔ)法、誤區(qū)與 UNION 實(shí)現(xiàn)方案
      MySQL刪除數(shù)據(jù)詳解:DELETE與TRUNCATE的原理、區(qū)別與正確選用
      MySQL UPDATE語(yǔ)句詳解:從基礎(chǔ)語(yǔ)法到多表連接更新實(shí)戰(zhàn)
      從備份到驗(yàn)證:MySQL表字段刪除操作的標(biāo)準(zhǔn)化流程與最佳實(shí)踐
      MySQL分頁(yè)查詢?cè)斀猓簭腖IMIT/OFFSET基礎(chǔ)到鍵集分頁(yè)性能優(yōu)化實(shí)戰(zhàn)
      告別SQL注入:詳解Python中MySQL參數(shù)化查詢的正確使用方法
      MySQL 表結(jié)構(gòu)升級(jí):ALTER TABLE ADD COLUMN 語(yǔ)法詳解與最佳實(shí)踐
      国产成人精品亚洲日本在线_欧美精品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>
          91麻豆视频网站| 亚洲日本青草视频在线怡红院| 91精彩视频在线观看| 蜜臀av性久久久久蜜臀av麻豆| 国产在线国偷精品产拍免费yy| 成人97人人超碰人人99| 成人sese在线| 日本aⅴ亚洲精品中文乱码| 国产一区二区剧情av在线| 国产午夜精品一区二区| 激情综合亚洲精品| 91在线精品秘密一区二区| 国产一区二区免费视频| 麻豆91小视频| 一区二区三区视频在线观看| 国产激情精品久久久第一区二区| 2024国产精品| 99久久久国产精品| 国产亚洲精久久久久久| 欧美少妇bbb| 亚洲www啪成人一区二区麻豆| 国产精品视频一二三| 欧美日韩免费高清一区色橹橹| 亚洲乱码一区二区三区在线观看| 日韩欧美亚洲一区二区| 久久久综合九色合综国产精品| 国产精品嫩草影院av蜜臀| 日韩欧美久久久| 成人免费小视频| 一区二区三区不卡视频| 国产成人精品一区二区三区网站观看| 3751色影院一区二区三区| 久久免费视频色| 韩国一区二区在线观看| 99久久久精品免费观看国产蜜| 91小宝寻花一区二区三区| 久久久精品蜜桃| 看片网站欧美日韩| 亚洲成精国产精品女| 欧美精品一区二区三区四区| 午夜电影一区二区| 丁香婷婷综合激情五月色| 亚洲一区av在线| 懂色av一区二区三区免费观看| 国产日韩精品一区二区三区| 欧美欧美欧美欧美首页| 欧美日韩精品一区二区三区蜜桃| 99久久久久免费精品国产| 欧美日韩激情一区二区三区| 欧美日韩久久久久久| 一区二区三区高清在线| 日韩一区二区免费在线电影| 欧美日韩国产一区| 国产欧美日韩一区二区三区在线观看| 中文一区在线播放| 亚洲啪啪综合av一区二区三区| 国产精品资源站在线| av激情综合网| 国产高清不卡一区| 成人免费一区二区三区视频| 久久99国产精品久久99| 国产精品麻豆视频| 日韩限制级电影在线观看| 日韩精品一区在线| 成人手机在线视频| 久久99久久久久久久久久久| 欧美精品日韩一本| 亚洲人成亚洲人成在线观看图片| 成av人片一区二区| 国产一区二区三区四区在线观看| 亚洲一区国产视频| 91麻豆国产精品久久| 日本一区二区三区久久久久久久久不| 亚洲成国产人片在线观看| 国产午夜久久久久| 国产精品二三区| 日韩成人午夜精品| 国产拍欧美日韩视频二区| 国产精品2024| 国产精品另类一区| 1000部国产精品成人观看| 日韩美女一区二区三区四区| 欧美另类久久久品| 丝袜亚洲另类欧美| 日韩欧美国产三级| 成人网页在线观看| 久久久久国产一区二区三区四区| 制服丝袜亚洲精品中文字幕| 亚洲视频一二三| 欧美日本一区二区在线观看| 国产精品麻豆99久久久久久| 国产成a人亚洲精品| 91免费版pro下载短视频| 91麻豆精品国产91久久久| 欧美精品视频www在线观看| 中文字幕乱码日本亚洲一区二区| 国产精品美女久久久久av爽李琼| 国产一二三精品| 欧美日韩高清一区二区三区| 亚洲成人动漫精品| 亚洲丝袜美腿综合| 91免费观看视频| 精品91自产拍在线观看一区| 国产农村妇女精品| 久久久精品人体av艺术| 欧美久久久久免费| 国产精品久久福利| 欧美一级日韩一级| 免费看精品久久片| 丁香网亚洲国际| 天天操天天色综合| 精品999久久久| 青青草成人在线观看| 国产人伦精品一区二区| 91福利精品第一导航| 国产一区二区三区观看| 亚洲欧美日韩国产另类专区| 精品国产91九色蝌蚪| 欧美日韩电影在线| 国产尤物一区二区| 国产欧美日韩不卡| 久久久亚洲精品石原莉奈| 中文字幕不卡在线| 国产精品久久毛片av大全日韩| 欧美一区国产二区| 国产午夜亚洲精品羞羞网站| 日韩欧美的一区二区| 精品免费国产二区三区| 国产麻豆精品95视频| 亚洲精品乱码久久久久| 粉嫩aⅴ一区二区三区四区五区| 精品欧美一区二区三区精品久久| 精品少妇一区二区三区免费观看| 99re热视频这里只精品| www.av亚洲| 久久久亚洲精华液精华液精华液| 日本道在线观看一区二区| 亚洲欧美日韩一区二区三区在线观看| 亚洲二区在线观看| 一本到高清视频免费精品| 在线亚洲一区观看| 欧美一区二区视频免费观看| 国产精品久久毛片a| 一区二区三区不卡视频在线观看| 国产盗摄视频一区二区三区| 最新国产精品久久精品| 国内精品自线一区二区三区视频| 欧美国产乱子伦| 伊人一区二区三区| 欧美日韩免费视频| 亚洲欧美自拍偷拍色图| 色国产精品一区在线观看| 亚洲天堂免费看| 色婷婷av一区二区三区大白胸| 在线观看日韩精品| 欧美日韩在线播放| 99热99精品| 国产91精品一区二区| 在线成人免费视频| 综合久久综合久久| 欧美午夜在线一二页| 成人动漫精品一区二区| 久久爱另类一区二区小说| 激情欧美日韩一区二区| 久久精品综合网| av电影在线观看完整版一区二区| 久久网站热最新地址| 91亚洲精华国产精华精华液| av一区二区三区| 国产精品日日摸夜夜摸av| 国产美女精品一区二区三区| 欧美日韩国产天堂| 久久精品在这里| 久久精品国产亚洲a| 国产精品国产自产拍高清av王其| 国产麻豆午夜三级精品| 欧美三级日韩在线| 久久久久国产免费免费| 日韩专区中文字幕一区二区| 亚洲少妇屁股交4| 91一区二区在线观看| 亚洲视频狠狠干| 久久综合久久综合九色| 欧美日韩精品一区二区三区| 成人动漫中文字幕| 免费观看成人av| 日韩av电影免费观看高清完整版在线观看| 91视频精品在这里| 国产麻豆精品一区二区| 国产片一区二区| 久久久99久久| 亚洲欧洲成人自拍| 亚洲h在线观看| 一区二区久久久| 中文字幕欧美激情| 精品88久久久久88久久久| 久草在线在线精品观看| 国产91丝袜在线播放0| 久久99精品一区二区三区| 欧美mv日韩mv国产网站app|