最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql之行與列的多種轉(zhuǎn)換實現(xiàn)方式

 更新時間:2026年03月25日 10:00:35   作者:雷神樂樂  
這篇文章主要介紹了Mysql之行與列的多種轉(zhuǎn)換實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Mysql行與列的多種轉(zhuǎn)換

首先準備一張表

CREATE TABLE CJ
(
    Name    varchar(32),
    Subject varchar(32),
    Result  int(10)
);

# 插入數(shù)據(jù)
insert into cj
values ('張三', '語文', 80),
       ('張三', '數(shù)學(xué)', 90),
       ('張三', '物理', 85),
       ('李四', '語文', 85),
       ('李四', '數(shù)學(xué)', 92),
       ('李四', '物理', 82);

一、行轉(zhuǎn)列

第一步,先將科目分類好:

SELECT Name,
       CASE WHEN Subject='語文' THEN Result ELSE 0 END AS 語文,
       CASE WHEN Subject='數(shù)學(xué)' THEN Result ELSE 0 END AS 數(shù)學(xué),
       CASE WHEN Subject='物理' THEN Result ELSE 0 END AS 物理
FROM cj;

第二步:將上面的結(jié)果看做一張表,從表中找出每一個新字段的最大值,對Name進行分組

SELECT T.Name,
       MAX(T.語文) 語文,
       MAX(T.數(shù)學(xué)) 數(shù)學(xué),
       MAX(T.物理) 物理
FROM (SELECT Name,
       CASE WHEN Subject='語文' THEN Result ELSE 0 END AS 語文,
       CASE WHEN Subject='數(shù)學(xué)' THEN Result ELSE 0 END AS 數(shù)學(xué),
       CASE WHEN Subject='物理' THEN Result ELSE 0 END AS 物理
FROM cj) T
GROUP BY T.Name;

案例二:查詢用戶安裝APP的情況

create table app
(
    id  int,
    app varchar(32)
);

insert into app(id, app)
VALUES (1, '微信'),
       (2, '快手'),
       (3, 'QQ'),
       (4, '抖音'),
       (5, '美團'),
       (6, '餓了么'),
       (7, '支付寶'),
       (8, '拼多多'),
       (9, '高德地圖');

CREATE TABLE app_install
(
    uid int,
    app varchar(32)
);

insert into app_install(uid, app)
VALUES (1, '微信'),
       (1, '美團'),
       (2, '支付寶'),
       (2, '高德地圖'),
       (3, '拼多多');

select uid,
       case when app = '微信' then 1 else 0 end as 'wx',
       case when app = '快手' then 1 else 0 end as 'ks',
       case when app = 'QQ' then 1 else 0 end as 'qq',
       case when app = '抖音' then 1 else 0 end as 'dy',
       case when app = '美團' then 1 else 0 end as 'mt',
       case when app = '餓了么' then 1 else 0 end as 'elm',
       case when app = '支付寶' then 1 else 0 end as 'zfb',
       case when app = '拼多多' then 1 else 0 end as 'pdd',
       case when app = '高德地圖' then 1 else 0 end as 'gd'
from app_install;

select t.uid,
       case when max(t.wx) then '已安裝' else '未安裝' end as 'wx',
       case when max(t.ks) then '已安裝' else '未安裝' end as 'ks',
       case when max(t.qq) then '已安裝' else '未安裝' end as 'qq',
       case when max(t.dy) then '已安裝' else '未安裝' end as 'dy',
       case when max(t.mt) then '已安裝' else '未安裝' end as 'mt',
       case when max(t.elm) then '已安裝' else '未安裝' end as 'eml',
       case when max(t.zfb) then '已安裝' else '未安裝' end as 'zfb',
       case when max(t.pdd) then '已安裝' else '未安裝' end as 'pdd',
       case when max(t.gd) then '已安裝' else '未安裝' end as 'gd'
from  (select uid,
       case when app = '微信' then 1 else 0 end as 'wx',
       case when app = '快手' then 1 else 0 end as 'ks',
       case when app = 'QQ' then 1 else 0 end as 'qq',
       case when app = '抖音' then 1 else 0 end as 'dy',
       case when app = '美團' then 1 else 0 end as 'mt',
       case when app = '餓了么' then 1 else 0 end as 'elm',
       case when app = '支付寶' then 1 else 0 end as 'zfb',
       case when app = '拼多多' then 1 else 0 end as 'pdd',
       case when app = '高德地圖' then 1 else 0 end as 'gd'
from app_install) t
group by t.uid;

連表比子查詢要好  

二、列轉(zhuǎn)行

建表

CREATE TABLE CJ2
(
    Name varchar(32),
    `語文` int(10),
    `數(shù)學(xué)` int(10),
    `物理` int(10)
);


# 插入數(shù)據(jù)
insert into cj2 values ('張三',80,90,90),('李四',85,92,92);

原表:

SELECT Name,'語文' cource,語文 result
FROM cj2
union all
SELECT Name,'數(shù)學(xué)' cource,數(shù)學(xué) result
FROM cj2
union all
SELECT Name,'物理' cource,物理 result
FROM cj2;

# 查詢后按照結(jié)果排序
SELECT *
FROM (SELECT Name,'語文' cource,語文 result
FROM cj2
union all
SELECT Name,'數(shù)學(xué)' cource,數(shù)學(xué) result
FROM cj2
union all
SELECT Name,'物理' cource,物理 result
FROM cj2) T
ORDER BY T.Name;

三、多列轉(zhuǎn)一行

將科目與分數(shù)排在一列

SELECT Name,GROUP_CONCAT(Subject,':',Result) 成績
FROM cj
group by Name;

 

四、一行轉(zhuǎn)多列

將上表還原

# 建表
CREATE TABLE CJ3
(
    Name varchar(32),
    `成績` varchar(50)
);

# 插入數(shù)據(jù)
insert into cj3
values ('張三', '語文:80,數(shù)學(xué):90,物理:85'),
       ('李四', '語文:85,數(shù)學(xué):92,物理:82');

SELECT Name,
       CASE
           WHEN LOCATE('語文', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '語文:', -1), ',', 1)
           else 0 end as 語文,
       CASE
           WHEN LOCATE('數(shù)學(xué)', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '數(shù)學(xué):', -1), ',', 1)
           else 0 end as 數(shù)學(xué),
       CASE
           WHEN LOCATE('物理', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '物理:', -1), ',', 1)
           else 0 end as 物理
from cj3;

SELECT T1.Name, '語文' Cource, T1.語文 result
FROM (SELECT Name,
             CASE
                 WHEN LOCATE('語文', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '語文:', -1), ',', 1)
                 else 0 end as 語文
      from cj3) T1
union all
SELECT T2.Name, '數(shù)學(xué)' Cource, T2.數(shù)學(xué) result
FROM (SELECT Name,
             CASE
                 WHEN LOCATE('數(shù)學(xué)', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '數(shù)學(xué):', -1), ',', 1)
                 else 0 end as 數(shù)學(xué)
      from cj3) T2
union all
SELECT T3.Name, '物理' Cource, T3.物理 result
FROM (SELECT Name,
             CASE
                 WHEN LOCATE('物理', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '物理:', -1), ',', 1)
                 else 0 end as 物理
      from cj3) T3;

SELECT *
FROM (SELECT T1.Name, '語文' Cource, T1.語文 result
FROM (SELECT Name,
             CASE
                 WHEN LOCATE('語文', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '語文:', -1), ',', 1)
                 else 0 end as 語文
      from cj3) T1
union all
SELECT T2.Name, '數(shù)學(xué)' Cource, T2.數(shù)學(xué) result
FROM (SELECT Name,
             CASE
                 WHEN LOCATE('數(shù)學(xué)', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '數(shù)學(xué):', -1), ',', 1)
                 else 0 end as 數(shù)學(xué)
      from cj3) T2
union all
SELECT T3.Name, '物理' Cource, T3.物理 result
FROM (SELECT Name,
             CASE
                 WHEN LOCATE('物理', 成績) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(成績, '物理:', -1), ',', 1)
                 else 0 end as 物理
      from cj3) T3) T
ORDER BY T.Name;

五、行轉(zhuǎn)列的其他案例

準備一張result表

行轉(zhuǎn)列

# 查詢1000號學(xué)生四門科目的成績
select StudentNo,
       case when SubjectNo = 1 then StudentResult else 0 end as 高等數(shù)學(xué)1,
       case when SubjectNo = 2 then StudentResult else 0 end as 高等數(shù)學(xué)2,
       case when SubjectNo = 3 then StudentResult else 0 end as java編程,
       case when SubjectNo = 4 then StudentResult else 0 end as hadoop理論
from result
where StudentNo = 1000;

# 簡化
select StudentNo, MAX(高等數(shù)學(xué)1) math1, MAX(高等數(shù)學(xué)2) math2, MAX(java編程) java, MAX(hadoop理論) hadoop
from (select StudentNo,
             case when SubjectNo = 1 then StudentResult else 0 end as 高等數(shù)學(xué)1,
             case when SubjectNo = 2 then StudentResult else 0 end as 高等數(shù)學(xué)2,
             case when SubjectNo = 3 then StudentResult else 0 end as java編程,
             case when SubjectNo = 4 then StudentResult else 0 end as hadoop理論
      from result
      where StudentNo = 1000) T;

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql命令導(dǎo)出表結(jié)構(gòu)和數(shù)據(jù)的操作方法

    mysql命令導(dǎo)出表結(jié)構(gòu)和數(shù)據(jù)的操作方法

    在日常使用中,我們經(jīng)常需要對數(shù)據(jù)庫進行備份和復(fù)制,因此必須了解如何導(dǎo)出表結(jié)構(gòu)和表數(shù)據(jù),以下是使用MySQL命令導(dǎo)出表結(jié)構(gòu)和表數(shù)據(jù)的方法,感興趣的朋友一起看看吧
    2023-11-11
  • MySQL數(shù)據(jù)庫數(shù)據(jù)視圖

    MySQL數(shù)據(jù)庫數(shù)據(jù)視圖

    這篇文章主要介紹了MySQL數(shù)據(jù)庫數(shù)據(jù)視圖,視圖是原始數(shù)據(jù)庫數(shù)據(jù)的一種變換,是查看表中數(shù)據(jù)的另外一種方式,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • 淺談MySQL查詢出的值為NULL和N/A和空值的區(qū)別

    淺談MySQL查詢出的值為NULL和N/A和空值的區(qū)別

    本文主要介紹了淺談MySQL查詢出的值為NULL和N/A和空值的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Centos下安裝多個mysql數(shù)據(jù)庫的配置實例詳解

    Centos下安裝多個mysql數(shù)據(jù)庫的配置實例詳解

    在實際的開發(fā)和運維場景中,有時我們需要在同一臺服務(wù)器上運行多個MySQL數(shù)據(jù)庫實例,本文將詳細介紹如何在CentOS系統(tǒng)中安裝并配置多個MySQL數(shù)據(jù)庫實例,希望對大家有所幫助
    2025-04-04
  • MySQL禁用InnoDB引擎的方法

    MySQL禁用InnoDB引擎的方法

    這篇文章主要介紹了MySQL禁用InnoDB引擎的方法,針對的Mysql版本是5.5和5.6,使用了兩種不同的配置文件,需要的朋友可以參考下
    2014-05-05
  • MySQL8.0 如何快速加列

    MySQL8.0 如何快速加列

    這篇文章主要介紹了MySQL8.0 如何快速加列,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • MySQL 批量插入的原理和實戰(zhàn)方法(快速提升大數(shù)據(jù)導(dǎo)入效率)

    MySQL 批量插入的原理和實戰(zhàn)方法(快速提升大數(shù)據(jù)導(dǎo)入效率)

    在日常開發(fā)中,我們經(jīng)常需要將大量數(shù)據(jù)批量插入到 MySQL 數(shù)據(jù)庫中,本文將介紹批量插入的原理、實現(xiàn)方法,并結(jié)合 Python 和 PyMySQL 庫提供詳細的實戰(zhàn)示例,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • MySQL最左匹配原則深入分析

    MySQL最左匹配原則深入分析

    首先回顧一下什么是最左匹配(也有稱之為最左前綴)?顧名思義:最左優(yōu)先,以最左邊的為起點任何連續(xù)的索引都能匹配上。同時遇到范圍查詢(>、<、between、like)就會停止匹配
    2022-11-11
  • MySQL定期分析檢查與優(yōu)化表的方法小結(jié)

    MySQL定期分析檢查與優(yōu)化表的方法小結(jié)

    聽DBA的人說,相比oracle,MySQL就是一個玩具級別的數(shù)據(jù)庫,在網(wǎng)易門戶中,DBA基本很少去管理到MySQL的東西,所以我們產(chǎn)品使用到的MySQL的一些配置和優(yōu)化還是需要我們開發(fā)人員自己動手,下面就簡單介紹一下實用的定期優(yōu)化方法
    2014-06-06
  • Mysql主從同步的實現(xiàn)原理

    Mysql主從同步的實現(xiàn)原理

    這篇文章主要介紹了Mysql主從同步的實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論

云林县| 武清区| 宝山区| 自贡市| 灌南县| 明光市| 宽城| 尼玛县| 清水县| 安达市| 家居| 抚宁县| 洛隆县| 宜城市| 合江县| 浏阳市| 鄂州市| 湛江市| 高碑店市| 湘西| 昭苏县| 祥云县| 保定市| 辰溪县| 青龙| 江华| 绥中县| 蕲春县| 新乡市| 沈阳市| 新化县| 宜春市| 大英县| 黄龙县| 明水县| 南乐县| 五指山市| 长泰县| 凤山县| 囊谦县| 鲁山县|