成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官提問:如何通過SQL方式將數據庫表行轉列?

開發 前端
在剛進入 IT 行業的第一年換工作的時候,至今讓我印象最深刻的有一個這樣的面試題:如何通過 SQL 方式將數據庫的行轉列?

[[428802]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲Tang 。轉載本文請聯系Java極客技術公眾號。

一、提問環節

在剛進入 IT 行業的第一年換工作的時候,至今讓我印象最深刻的有一個這樣的面試題:如何通過 SQL 方式將數據庫的行轉列?

當時的面試官讓我現場寫 SQL,信心滿滿的我,我覺得我可以做出來,然后10分支、20分鐘、30分鐘...過去了,很遺憾一點動靜都沒有。

最后的我不得不服,結局相信大家也能猜到是啥了!??

二、場景分析

面試結束之后,不服輸的我決定要把這個問題給破解掉,回到自己的租處之后,打開電腦,決定從0開始琢磨,怎么實現行轉列呢?

其實如果你是一個經常玩 sql 的人,相信看到這個提問的時候,你心里已經有答案了,解決這個問題,方法其實很簡單,通過下面這個語法即可實現。

  1. case  when ... then ... else ...  end 

例如下面是一張很常見的學生考試成績表,我們將學生的考試成績以單表的形式存儲到數據庫表中。

我們想要以下圖形式,并以總分排名從高到底進行展示,如何通過 SQL 方式實現呢?

有的同學說,我可以通代碼層面來實現,不可否認,代碼完全可以實現,只需要封裝一個如下形式的數據結構就可以了。

  1. //學生姓名為key,相同key的數據封裝到List集合中 
  2. Map<String, List<StudentExam> studentExamMap = new HashMap(); 

其中學生姓名就是一個Key,然后把相同學生姓名的數據封裝到List集合中,最后將學生姓名的總分合計起來,做一個排序,也可以實現。

在面對少量數據的時候,這種方式沒問題,只是計算復雜了一點,但是當數據庫表超過 5000 以上的時候,這種在代碼層面的計算,內存就有點吃不消了,因此極其不推薦采用。

面對這種場景需求,我們多半會采用通過 sql 方式來解決,那么通過 sql 方式破解呢?請看下圖

其中最關鍵的一步就是先用case when ... then ... else ... end語法將不同的課程分數分離出來,然后通過sum + group聚合函數查詢進行分數匯總,最后通過order by語法將分數進行從高到低排序,進而達到我們想要的預期效果!

其實像這樣的行轉列的查詢邏輯非常的普遍,例如剛過去的奧運獎牌排行榜!

還有全球新冠疫情數據排名。

可能不同的應用實現方式不一樣,但是大體的解決思路是一樣的,將數據進行分組聚合匯總,然后按照分數進行從高到低排名。

通過 SQL 實現還有一個非常大的好處,就是可以根據不同的維度進行排序,同時支持多個字段進行排序,如果在代碼層面去實現排序,相當復雜。

三、小結

本文主要圍繞如何通過 sql 的方式,將數據庫表中的行轉列進行顯示,希望能幫助到大家!

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-12-08 06:53:29

面試動態代理

2022-09-29 07:30:57

數據庫索引字段

2020-08-06 07:49:57

List元素集合

2021-07-06 07:08:18

管控數據數倉

2021-12-16 22:59:21

SQL報表應用

2010-07-13 16:20:30

SQL Server數

2020-11-11 10:05:04

數據庫分庫分表美團面試

2024-09-19 08:10:54

2020-08-17 07:40:19

消息隊列

2020-09-24 06:39:58

MySQL數據庫

2015-08-13 10:29:12

面試面試官

2024-10-16 21:17:59

2023-02-16 08:10:40

死鎖線程

2022-03-30 07:28:24

MySQL數據庫ACID

2024-02-26 14:07:18

2024-02-20 14:10:55

系統緩存冗余

2024-03-18 14:06:00

停機Spring服務器

2021-05-17 06:57:34

SQLServer數據庫

2020-10-15 06:26:24

高并發場景冰河

2024-03-12 14:36:44

微服務HTTPRPC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 7777久久 | 久久com| 精品一区二区三区在线观看 | 午夜精品在线 | 亚洲精品免费在线 | 99国产精品一区二区三区 | 久久精品99 | 国产免费视频 | 先锋资源吧 | 激情 婷婷 | 在线观看亚 | 亚洲精品久久久久中文字幕二区 | 亚洲91av| 精品视频在线一区 | av天天澡天天爽天天av | www.788.com色淫免费 | 伊人热久久 | 成人一区av偷拍 | 欧美一级全黄 | 男女羞羞视频大全 | 在线播放中文字幕 | 毛片网站在线观看 | 91精品国产色综合久久 | 日韩久久精品 | 一级毛片视频 | 久久涩涩 | 精品视频一区二区 | 久久免费视频在线 | 欧美二区在线 | 国产激情视频在线免费观看 | 欧美国产精品 | 国产精品黄色 | 欧美色a v | 欧美日韩精品一区二区三区四区 | 亚洲自拍偷拍视频 | 国产综合久久 | 亚洲福利一区 | 日本三级日产三级国产三级 | 国产精品久久网 | 国产精品黄视频 | 日本三级黄视频 |