MySQL實(shí)現(xiàn)列轉(zhuǎn)行與行轉(zhuǎn)列的操作代碼
引言
在處理數(shù)據(jù)時(shí),我們常常會(huì)遇到需要將表中的列(字段)轉(zhuǎn)換為行,或?qū)⑿修D(zhuǎn)換為列的情況。這種操作通常被稱(chēng)為“列轉(zhuǎn)行”(Pivoting)和“行轉(zhuǎn)列”(Unpivoting)。在 MySQL 中,雖然沒(méi)有直接提供 PIVOT 和 UNPIVOT 這樣的關(guān)鍵字,但我們可以使用其他方法來(lái)實(shí)現(xiàn)這些功能。本文將向您介紹如何使用 CASE 語(yǔ)句、聚合函數(shù)以及 GROUP BY 子句來(lái)完成列轉(zhuǎn)行和行轉(zhuǎn)列的操作。
列轉(zhuǎn)行(Pivoting)
列轉(zhuǎn)行是指將表格中的一列或多列的值轉(zhuǎn)換成新的列標(biāo)題,并且將對(duì)應(yīng)的數(shù)據(jù)填充到這些新列中。下面通過(guò)一個(gè)例子來(lái)說(shuō)明這個(gè)過(guò)程。
示例數(shù)據(jù)
假設(shè)有一個(gè)成績(jī)表 scores
,包含學(xué)生的姓名 name
、科目 subject
和分?jǐn)?shù) score
:
CREATE TABLE scores ( name VARCHAR(50), subject VARCHAR(20), score INT ); INSERT INTO scores (name, subject, score) VALUES ('Alice', 'Math', 95), ('Alice', 'English', 88), ('Bob', 'Math', 76), ('Bob', 'English', 92);
轉(zhuǎn)換前查詢(xún)結(jié)果
SELECT * FROM scores; +-------+---------+-------+ | name | subject | score | +-------+---------+-------+ | Alice | Math | 95 | | Alice | English | 88 | | Bob | Math | 76 | | Bob | English | 92 | +-------+---------+-------+
列轉(zhuǎn)行 SQL 語(yǔ)句
我們需要將 subject
列的不同值變?yōu)樾碌牧忻褜?duì)應(yīng)的 score
填充進(jìn)去。
SELECT name, MAX(CASE WHEN subject = 'Math' THEN score ELSE NULL END) AS Math, MAX(CASE WHEN subject = 'English' THEN score ELSE NULL END) AS English FROM scores GROUP BY name;
轉(zhuǎn)換后查詢(xún)結(jié)果
+-------+------+---------+ | name | Math | English | +-------+------+---------+ | Alice | 95 | 88 | | Bob | 76 | 92 | +-------+------+---------+
行轉(zhuǎn)列(Unpivoting)
行轉(zhuǎn)列是列轉(zhuǎn)行的逆過(guò)程,即將多個(gè)列的數(shù)據(jù)轉(zhuǎn)換成一行多條記錄的形式。這可以通過(guò) UNION ALL 來(lái)實(shí)現(xiàn)。
示例數(shù)據(jù)
假設(shè)現(xiàn)在有另一個(gè)表 students
,它已經(jīng)以列轉(zhuǎn)行后的形式存儲(chǔ)了學(xué)生的信息:
CREATE TABLE students ( name VARCHAR(50), Math INT, English INT ); INSERT INTO students (name, Math, English) VALUES ('Alice', 95, 88), ('Bob', 76, 92);
轉(zhuǎn)換前查詢(xún)結(jié)果
SELECT * FROM students; +-------+------+---------+ | name | Math | English | +-------+------+---------+ | Alice | 95 | 88 | | Bob | 76 | 92 | +-------+------+---------+
行轉(zhuǎn)列 SQL 語(yǔ)句
我們將每個(gè)科目的成績(jī)都變成單獨(dú)的一行記錄。
SELECT name, 'Math' AS subject, Math AS score FROM students UNION ALL SELECT name, 'English' AS subject, English AS score FROM students;
轉(zhuǎn)換后查詢(xún)結(jié)果
+-------+---------+-------+ | name | subject | score | +-------+---------+-------+ | Alice | Math | 95 | | Bob | Math | 76 | | Alice | English | 88 | | Bob | English | 92 | +-------+---------+-------+
通過(guò)以上示例,我們可以看到如何在 MySQL 中靈活地進(jìn)行列轉(zhuǎn)行和行轉(zhuǎn)列的數(shù)據(jù)轉(zhuǎn)換。希望這些技巧能夠幫助您更好地管理和分析數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
到此這篇關(guān)于MySQL實(shí)現(xiàn)列轉(zhuǎn)行與行轉(zhuǎn)列的操作代碼的文章就介紹到這了,更多相關(guān)MySQL列轉(zhuǎn)行與行轉(zhuǎn)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
故障的機(jī)器修好后重啟,狂拉主庫(kù)binlog,導(dǎo)致網(wǎng)絡(luò)問(wèn)題的解決方法
本文主要記錄一次簡(jiǎn)單的、典型的故障,發(fā)生問(wèn)題的原因很簡(jiǎn)單,這個(gè)問(wèn)題發(fā)生也很簡(jiǎn)單,各位同學(xué)一定要注意,一不留神就會(huì)對(duì)主庫(kù)造成影響2016-04-04mysql 數(shù)據(jù)庫(kù)備份和還原方法集錦 推薦
本文討論 MySQL 的備份和恢復(fù)機(jī)制,以及如何維護(hù)數(shù)據(jù)表,包括最主要的兩種表類(lèi)型:MyISAM 和 Innodb,文中設(shè)計(jì)的 MySQL 版本為 5.0.22。2010-03-03解決MySQL啟動(dòng)報(bào)錯(cuò):ERROR 2003 (HY000): Can''t connect to MySQL serv
這篇文章主要介紹了解決MySQL啟動(dòng)報(bào)錯(cuò):ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061),本文解釋了如何解決該問(wèn)題,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07一起來(lái)了解mysql數(shù)據(jù)庫(kù)
大家好,本篇文章主要講的是一起來(lái)了解mysql數(shù)據(jù)庫(kù),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12常見(jiàn)的十種SQL語(yǔ)句性能優(yōu)化策略詳解
這篇文章主要介紹了常見(jiàn)的十種SQL語(yǔ)句性能優(yōu)化策略詳解,SQL語(yǔ)句性能優(yōu)化是提高數(shù)據(jù)庫(kù)查詢(xún)效率的關(guān)鍵步驟,可以減少查詢(xún)時(shí)間,提高系統(tǒng)響應(yīng)速度,本文將介紹一些常見(jiàn)的SQL語(yǔ)句性能優(yōu)化技巧,包括索引的使用、合理的查詢(xún)條件、避免全表掃描等,需要的朋友可以參考下2023-10-10mysql timestamp比較查詢(xún)遇到的坑及解決
這篇文章主要介紹了mysql timestamp比較查詢(xún)遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11