SQL 打印九九乘法表
时间:2022-07-22
本文章向大家介绍SQL 打印九九乘法表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天是周日,给大家看点轻松的——用 SQL 打印九九乘法表。
九九乘法表的 SQL 我曾发布到其它内容平台,现在把 SQL 拷过来,稍微加一些说明。
下图是我从网上找到一个九九乘法表,本文要实现的也是这样的效果。
图1 九九乘法表
打印九九乘法表需要经过下面这几个步骤:
- 构建一张 1 到 9 的数字表;
- 生成所有乘法算式的组合;
- 做行转列处理,格式化输出。
1 构建 1-9 的数字表
如果我们有数字辅助表(有专门的字段存储从0/1起始的自然数列),那可以直接使用该表。如果没有数字辅助表,找到任意一张存储大于 9 条记录数的表,借助于窗口函数或者用户变量生成 1-9 的自然数列。
窗口函数生成 1-9 的自然数列:
SELECT
ROW_NUMBER() OVER() AS num
FROM
emp
LIMIT 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
t2
GROUP BY s
这一步将输出最终的结果。
完整的 SQL 如下:
WITH RECURSIVE t (num) AS
(SELECT
1 AS num
UNION
ALL
SELECT
num + 1
FROM
t
WHERE 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
t2
GROUP BY s
- 算法类面试题解析——美团2016校招:棋子翻转
- 算法类面试题解析——美团2016校招:最大差值
- 用Python进行机器学习小案例
- 启用ODM极速调优IO (r2笔记66天)
- 通过addm分析io问题(r2笔记64天)
- python爬虫+R数据可视化 实例
- 梯度下降优化算法综述
- 关于oracle后台启用的schedule job(r2笔记65天)
- 数据结构和算法——二叉树
- 【专业技术】谷歌浏览器实现Javascript扩展
- 数据结构和算法——二叉排序树
- 通过shell脚本生成查询表数据的sql (r2笔记63天)
- Linux C 编程——多线程
- 数据结构和算法——Huffman树和Huffman编码
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- pytest文档52-命令行参数--setup-show查看fixture的执行过程
- pytest文档54-Hooks函数terminal打印测试结果(pytest_report_teststatus)
- SAS-免费的描述性统计程序自动化创建
- Godot游戏开发实践之四:搬运Unity的Pluggable AI教程
- TypeScript 4.1 新特性:字符串模板类型,Vuex 终于有救了?
- 使用 Node.js 定制你的技术雷达:上篇
- 使用 Node.js 定制你的技术雷达:中篇
- 大点干!早点散----------Redis从入门到精通!!!
- Python入门摘要
- 这些 ECMAScript 模块知识,都是我需要知道的
- 微信小程序【事件绑定】入门一篇就搞定
- 一个后端狗的 Vue 笔记【入门级】
- 这才是现代C++单例模式简单又安全的实现
- Linux 学习笔记(1) 查看文件内容
- Python从入门到熟练(3):第一个程序