幾道比較難的SQL題

2021-09-08 13:16:51 字數 3145 閱讀 8278

(select * from article where create_timenow_article_time order by create_time asc limit 1)
select a.*,(@rownum:=@rownum+1) as rowno

from a,(select (@rownum :=3) ) b

通過變數rownum來表示行號,在from子句中通過select語句給rownum賦初值。這個過程涉及到sql的執行順序:即先執行from子句再執行select子句。

這種寫法效率比較高,使用復合sql語句的方式實現效率比較低(行號通過select語句來實現)。

學生成績單有語文、數學、英語三門成績,如下所示:

語文 數學 英語

1 2 3

3 4 10

10 2 8

20 5 1

7 4 8

10 8 2

10 7 2

要求列印「rank(名次) sum(總分)」兩列的成績單(總分降序排列)。

select 1 + (select count(1)  from

stu as y where

y.chinese + y.math + y.english > x.chinese + x.math + x.english) as rank,

(x.chinese + x.math + x.english) as sum_score

from

stu as x order by sum_score desc;

這裡用到了if函式,也可以通過sql條件語句來實現:

case 表示式 when 取值1 then 答案1 when 取值2 then 答案2 else 答案3 end

這樣寫複雜度較高,下面這種方法比較簡單。

select  rank, sum_score from

(select

if(@last_sum = x.chinese + x.math + x.english, @rank, @rank:=@rank + 1) as rank,

(x.chinese + x.math + x.english) as sum_score,

(select @last_sum:=x.chinese + x.math + x.english) as yy

from

stu as x, (select @last_sum:=- 1, @rank:=0) as nothing

order by sum_score desc) as haha;

這裡用到的技巧如下:

1、通過建立臨時表、兩重select來只選中某些列

2、在where子句中執行變數的初始化

3、在select子句中執行變數的更新

4、通過定義變數last_sum來記錄上一條記錄 的資訊

5、通過比較上一條記錄的總分跟當前記錄的總分來決定是否讓rank增加

語法:

case [input_expression]

when when_expression then result_expression

[...n]

[else else_result_expression]

end

注:表示可選內容。

1、demo1:case後帶表示式

select *,

case sgroup

when 1 then n'組1'

when 2 then n'組2'

when 3 then n'組3'

else n'未知' end groupname

from @stuinfo

2、demo2:case後不帶表示式

select *,

case

when sgroup = 1 and gender = 'm' then n'第一組男生'

when sgroup = 1 and gender = 'f' then n'第一組女生'

when sgroup = 2 and gender = 'm' then n'第二組男生'

when sgroup = 2 and gender = 'f' then n'第二組女生'

when sgroup = 3 and gender = 'm' then n'第三組男生'

when sgroup = 3 and gender = 'f' then n'第三組女生'

else n'未知' end comment

from @stuinfo

3、demo3:在order by子句中使用case語句

select * from @stuinfo

order by

case when @orderby = 1 then id end desc,

case when @orderby = 2 then id end

這裡要用多個case,因為desc需要放在end 後面,否則會有語法錯誤。

由此可以構造一道題:對一群學生成績單進行排序,如果是男生按照數學成績降序排列,如果是女生按照語文成績降序排列,最終得到全體學生的成績和名次。

這個問題不使用case語句也能實現,但是使用case 語句更簡潔、效率更高。

一言以蔽之,case語句可以用在任何表示式中,有表示式的地方就可以有case語句。order by後面其實跟的也是表示式而不是列名。

國家標準分為強制性標準和推薦性標準,這兩種標準的字段完全一致,當時建表時一時糊塗,分成了兩個表。現在想合併force_standard、recommend_standard兩張表為standard表,並加上欄位is_force來表示該標準是否強制性標準。

當然可以通過一段**,for迴圈實現,但那樣麻煩,用sql只需要一句話。

insert into standard(列名,列名,列名...is_force) 

select 列名,列名,列名...,true from force_standard union

select 列名,列名,列名...,false from recommend_standard

關於DFS幾道比較基礎的題

題目一 fatmouse and cheese 題目大意就是說有乙個老鼠在n n的網格當中每一步最多只能走k格 並且由於貓的存在每一次老鼠的移動都必須比路徑上乙個網格收集的乳酪多 問這條路徑上老鼠收集的乳酪最大值 sample input 3 11 2 5 10 11 6 12 12 7 1 1 s...

你能答對幾道SQL題?

我們使用的是postgresql資料庫,以下是在審核和優化開發人員sql時發現的一些問題,現整理共享出來希望對各位有用,每個案例先都構造了一部分資料,然後提乙個問題,看是否你能回答出來 記住先不要看執行結果 然後把你的結果和實際結果對比看差異在 一切的答案在執行計畫中會告訴你。案例1 droptab...

比較難的面試題

比較難的面試題 問 如果你要為客戶寫乙個函式 軟體開發客戶 該函式用來處理乙個陣列 入口是這樣的void test int p 在函式中將要對該陣列進行操作,情況有2種 1 送入的陣列是靜態分配的 2 送入的陣列是動態分配 如malloc 的 那如何去判斷這兩種分配情況呢 wanguodu 足文字d...