今天是週日,給大家看點輕鬆的——用 sql 列印九九乘法表。
九九乘法表的 sql 我曾發布到其它內容平台,現在把 sql 拷過來,稍微加一些說明。
下圖是我從網上找到乙個九九乘法表,本文要實現的也是這樣的效果。
圖1 九九乘法表
列印九九乘法表需要經過下面這幾個步驟:
構建一張 1 到 9 的數字表;
生成所有乘法算式的組合;
做行轉列處理,格式化輸出。
1 構建 1-9 的數字表
如果我們有數字輔助表(有專門的字段儲存從0/1起始的自然數列),那可以直接使用該錶。如果沒有數字輔助表,找到任意一張儲存大於 9 條記錄數的表,借助於視窗函式或者使用者變數生成 1-9 的自然數列。
視窗函式生成 1-9 的自然數列:
select
row_number() over() as num
from
emplimit 9
使用使用者變數生成 1-9 的自然數列。
select
@rn := @rn + 1 as num
from
emp,(select @rn:=0) a
limit 9
由於我的 emp 表的記錄數大於 9,所以用上面兩種方式構建自然數列沒有問題。
如果表的行數一直在變動,也可以使用遞迴的方式生成自然數列:
with recursive t(num) as (
select 1 as num
union all
select num + 1 from t where num < 9
select * from t
不想太折騰的話,那就自己造資料吧,就像這樣:
with t as
(select 1 as num
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9)
select * from t
這一步輸出的結果就是 1-9 的自然數列。
2 生成所有乘法算式的組合
將 t 表做自關聯就可以生成所有乘法算式的組合。
觀察圖1可知,乘法表由九行九列的乘法算式組成,只是第一行只有一列有算式,第二行有兩列算式,......,第九行有九列算式。每個算式的第乙個數表示所在的列,第二個數表示所在的行。因此,當 t 表自關聯時可將第乙個表的字段的值作為算式的第乙個數(欄位名為 f),將第二個表的字段的值作為算式的第二個數(欄位名為 s)。
t2 as
(select
a.num as f,
b.num as s,
concat(
a.num,
' x ',
b.num,
a.num * b.num
) as r
from
t as a
inner join t as b
on a.num <= b.num)
select
from
t2這步輸出的結果如下(部分):
f s r
1 1 1 x 1 = 1
2 2 2 x 2 = 4
1 2 1 x 2 = 2
3 3 3 x 3 = 9
2 3 2 x 3 = 6
1 3 1 x 3 = 3
4 4 4 x 4 = 16
3 4 3 x 4 = 12
2 4 2 x 4 = 8
1 4 1 x 4 = 4
5 5 5 x 5 = 25
4 5 4 x 5 = 20
3 5 3 x 5 = 15
2 5 2 x 5 = 10
1 5 1 x 5 = 5
3 做行轉列處理,格式化輸出
將步驟 2 中的結果集,字段 f 作為轉列的依據,字段 s 作為分組的依據。
select
max(if(f = 1, r, '')) as v1,
max(if(f = 2, r, '')) as v2,
max(if(f = 3, r, '')) as v3,
max(if(f = 4, r, '')) as v4,
max(if(f = 5, r, '')) as v5,
max(if(f = 6, r, '')) as v6,
max(if(f = 7, r, '')) as v7,
max(if(f = 8, r, '')) as v8,
max(if(f = 9, r, '')) as v9
from
t2group by s
這一步將輸出最終的結果。
完整的 sql 如下:
with recursive t (num) as
(select
1 as num
union
allselect
num + 1
from
twhere num < 9),
t2 as
(select
a.num as f,
b.num as s,
concat(
a.num,
' x ',
b.num,
a.num * b.num
) as r
from
t as a
inner join t as b
on a.num <= b.num)
select
max(if(f = 1, r, '')) as v1,
max(if(f = 2, r, '')) as v2,
max(if(f = 3, r, '')) as v3,
max(if(f = 4, r, '')) as v4,
max(if(f = 5, r, '')) as v5,
max(if(f = 6, r, '')) as v6,
max(if(f = 7, r, '')) as v7,
max(if(f = 8, r, '')) as v8,
max(if(f = 9, r, '')) as v9
from
t2group by s
九九乘法表
題目描述 完成乙個99乘法表,如下圖所示,用js生成,不能有table 本來想用table實現,但是table貌似只能實現階梯效果,因為table並不能進行錯位。99乘法很簡單兩個for迴圈就可以實現,主要是布局,我搞了很久。布局解析 1.乙個div包裹住全部 2.div中有九個div分別代表每一行...
九九乘法表
小時候學過的九九乘法表也許將會扎根於我們一生的記憶,現在讓我們重溫那些溫暖的記憶,請程式設計輸出九九乘法表.現在要求你輸出它的格式與平常的 不同啊 是那種反過來的三角形啦,具體如下圖 每兩個式子之前用乙個空格 隔開。輸入 第一有乙個整數n,表示有n組資料 n 10 接下來由n行,每行只有乙個整數m ...
九九乘法表
九九乘法表 簡易版 public classameir yang7 publicstatic void main string args intline 1 for inti 1 i line i system.out.print i line i line t system.out.println...