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