日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在我們的實際工作中,為了研發出功能完整、系統健壯的軟件,需要我們測試人員想法設法的去挑出軟件的問題,所以很多公司對測試人員的要求甚至高于開發人員,而通過 SQL 語句的編寫,測試人員可以去進行數據查詢、數據正確性完整性驗證、構造測試數據、或者行破壞測試或壓力測試。因此,作為一個測試人員,掌握 SQL 的重要性就不言而喻了。在我們的面試過程中,會碰到各種數據庫或者編寫 SQL 的面試題。

面試題:行列轉換

來看下面這道難倒眾生的經典面試題

檸檬班第 30 期學生要畢業了,他們 linux、MySQL、JAVA 成績保存在數據表 tb_lemon_grade 中,表中字段 id,student_name,course,score 分別表示成績 id,學生姓名,課程名稱,課程成績,表中數據表 1 所示。請寫出一條 SQL,將表 1 的數據變成表 2 的形式

表一數據如下:

id

學生姓名

課程名稱

課程成績

1

張三

Linux

85

2

張三

MySQL

92

3

張三

Java

87

4

李四

Linux

96

5

李四

MySQL

89

6

李四

Java

100

7

王五

Linux

91

8

王五

MySQL

83

9

王五

Java

98

表 2 數據如下:

學生姓名

Linux

MySQL

Java

張三

85

92

87

李四

96

89

100

王五

91

83

98

一:創建表

  CREATE TABLE tb_lemon_grade (
 id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
 student_name VARCHAR(20) DEFAULT NULL,
 course VARCHAR(20) DEFAULT NULL,
 score FLOAT DEFAULT '0');

二:初始化數據

  INSERT INTO tb_lemon_grade (student_name, course, score) VALUES
("張三", "Linux", 85),
("張三", "MySQL", 92),
("張三", "Java", 87),
("李四", "Linux", 96),
("李四", "MySQL", 89),
("李四", "Java", 100),
("王五", "Linux", 91),
("王五", "MySQL", 83),
("王五", "Java", 98);

三:首先我們查詢出所有數據,這個結果和我們的圖 1 是一樣的

select * from tb_lemon_grade;

SQL 經典面試題 - 行列轉換

 

四:使用常量列輸出我們的目標結構

可以看到結果已經和我們的圖二非常接近了

SQL 經典面試題 - 行列轉換

 

五:使用 IF 函數,替換我們的常量列,將成績賦值到對應行的對應列

  SELECT student_name,
IF(COURSE = 'Linux',SCORE,0) 'Linux',
IF(COURSE = 'MySQL',SCORE,0) 'MySQL',
IF(COURSE = 'Java',SCORE,0) 'Java'
FROM tb_lemon_grade;

運行 SQL,結果如下所示:

SQL 經典面試題 - 行列轉換

 

六:我們來分析這個結果集,

SQL 經典面試題 - 行列轉換

 

在原始結構中,每一行表示了某個同學某一個科的成績,以第一行為例,第一行是張三同學 Linux 的成績,所以我們結果集中 Linux 有成績為 85,而其他兩列 MySQL 和 Java 作為常量列,成績為 0。

再分析每個同學的成績的所有行,如下圖所示,每個方塊內包含行中,就有該同學這門課程的成績,并且該方塊內其余行的成績值為 0。因此,不難想到,我們可以使用分組,通過分組提取出每科的成績

七:分組,使用 MAX 函數取出最大值

(因為其中只有一行成績為真實成績,其他行值為 0,所以最大值就是真實成績)

  SELECT student_name,
MAX(IF(COURSE = 'Linux',SCORE,0)) 'Linux',
MAX(IF(COURSE = 'MySQL',SCORE,0)) 'MySQL',
MAX(IF(COURSE = 'Java',SCORE,0)) 'Java'
FROM tb_lemon_grade
GROUP BY student_name;
SQL 經典面試題 - 行列轉換

 

八:也可以分組后,對每行數據進行求和,使用 SUM 函數,語句和結果如下:

  SELECT student_name,
SUM(IF(COURSE = 'Linux',SCORE,0)) 'Linux',
SUM(IF(COURSE = 'MySQL',SCORE,0)) 'MySQL',
SUM(IF(COURSE = 'Java',SCORE,0)) 'Java'
FROM tb_lemon_grade
GROUP BY student_name;
SQL 經典面試題 - 行列轉換

 

九:既然使用 IF 語句可以達到效果,那使用 CASE 語句也是同樣的效果

分組,使用 MAX 聚合函數

  SELECT student_name,
max(CASE COURSE when 'Linux' THEN SCORE ELSE 0 END) as 'Linux',
max(CASE COURSE when 'MySQL' THEN SCORE ELSE 0 END) as 'MySQL',
max(CASE COURSE when 'Java' THEN SCORE ELSE 0 END) as 'Java'
FROM tb_lemon_grade
GROUP BY student_name;

結果如下圖所示:

SQL 經典面試題 - 行列轉換

 

使用 SUM,結果如下圖所示

  SELECT student_name,
SUM(CASE COURSE when 'Linux' THEN SCORE ELSE 0 END) as 'Linux',
SUM(CASE COURSE when 'MySQL' THEN SCORE ELSE 0 END) as 'MySQL',
SUM(CASE COURSE when 'Java' THEN SCORE ELSE 0 END) as 'Java'
FROM tb_lemon_grade
GROUP BY student_name;
SQL 經典面試題 - 行列轉換

 

總結

通過上面一步一步的分解,我們就完成了一個行轉列的 SQL 語句編寫,現在問題又來了,這種方式雖然能達到效果,但是如果課程多了,
比如還有英語、數學、物理等等課程,是不是寫起來就筆記麻煩了?有沒有動態的方式,不管有多少課程,通過 SQL 就能一步到位呢?感興趣大家可以去嘗試下。


p s:小編個人收集啦許多軟測資料,希望能夠幫到學軟件測試的朋友們軟件資料分享包括但不限于:Java自動化測試、Python/ target=_blank class=infotextkey>Python自動化測試、性能測試、web測試、App測試 測試開發工具包:appuim安裝包、fiddler安裝包(也有配套視頻教程)、eclipse、git、jmeter、loadrunner、monkey、postman、soapul、Xmind等等

有需要的朋友可以私信小編“測試”領取

SQL 經典面試題 - 行列轉換

 

分享到:
標簽:SQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定