SQL面試題1 行轉列和查詢所有成績大於80的人

2021-10-07 17:54:06 字數 2604 閱讀 3013

第一次看見這個題目是在去面試的地鐵上,當時看見就覺得很厲害的樣子(對於小白),哪篇文章講的是最仔細易懂的,可惜我找不到了。下面是我自己對這個題目的一次演示。

students表

name

subject

score

小明語文

92小明

數學95

小明英語

88小強

語文78

小強數學

88小強

英語94

要利用sql語句將其變成下表

name

語文數學

英語小明

9295

88小強

7888

94查詢語句為:

select name,

max(

case subject when

"語文"

then score else

null

end)

as"語文"

,max

(case subject when

"數學"

then score else

null

end)

as"數學"

,max

(case subject when

"英語"

then score else

null

end)

as"英語"

,from students

group

by name

此處必須加聚合函式max進行聚合,不然表就會變成下面這樣子,出現null值。這是因為我們用了case when之後,表中沒有匹配到的值就會顯示null,此時用max()取最大值的那一行,即有數值的那一行。

select name,

case subject when

"語文"

then score else

null

endas

"語文"

,case subject when

"數學"

then score else

null

endas

"數學"

,case subject when

"英語"

then score else

null

endas

"英語"

,from students

group

by name

name

語文數學

英語小明

92null

null

小明null

95null

小明null

null

88小強

78null

null

小強null

88null

小強null

null

94當然,用sum()函式效果也是一樣的。

在完成了聚合之後,我們再用group by根據name來分組。

給出乙個成績表如下:students

name

subject

score

張三語文

88張三

數學77

李四語文

90李四

英語79

王五語文

84王五

數學91

王五英語

83先找出存在科目成績小於80分的學生,再去除這些學生就是所有科目成績均大於80的學生了。

select

distinct name from students notin(

select

distinct name from students where score<80)

或者select

distinct name from students not

exists

(select

distinct name from students where score<

80)

exists 詳解:

取出外表第一條資料 ,然後與內錶 根據連線條件 ,

形成一條或多條資料,判斷這些生成的資料中是否存在

或者是不存在符合where條件的 。結果為ture的那條外表

記錄舊被查詢出來!

例項過程:

取出外表的第一條記錄,

和內錶通過姓名條件連線,這時候產生2兩記錄,

根據 not exists是判斷不存在。 條件是 score<80 .

而這兩條記錄存在一條記錄小於80,所以於not exists 不符合,

該條記錄不被查出。

select name

from students

group

bymin

(score)

>

80

這個方法效率比方法一要好,一用了distinct存在效率低下的問題。(然鵝我也不知道為什麼,希望有人能告知一下原因,怎麼不用distinct來實現這個)

新手求教/(ㄒoㄒ)/~~

sql 查詢面試題

表中有a b c三列,用sql語句實現 當a列大於b列時選擇a列否則選擇b列,當b列大於c列時選擇b列否則選擇c列 if object id testtb is not null drop table testtb gocreate table testtb a int b int c int in...

SQL查詢行轉列和列轉行

主要思路是分組後使用case進行條件判斷處理 示例1select team,示例2create table wyc test id int 32 not null auto increment name varchar 80 default null date date default null s...

面試題 連線查詢和子查詢

今天碰到個有意思的面試題,主要是被第2小題難住了 和同事靈感碰撞才把問題解決 所以做個demo記錄一下。1 首先我們分別建立 tab user info 和 tab dict 資料表 create table tab user info fld id int 11 not null auto inc...