SQL 生成斐波那契数列
时间:2022-07-22
本文章向大家介绍SQL 生成斐波那契数列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
你没看错标题,在这篇文章我将会给大家介绍使用 SQL 生成斐波那契数列,并且不需要借助任何物理表。
先来看什么是“斐波那契数列”?
下面是我从百科看到的定义:
斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...这个数列从第3项开始,每一项都等于前两项之和。
它的递推公式:
也就是说,知道了第一项和第二项的值,就可以递推出后面的所有项。
那怎么用 SQL 实现呢?我们先来看怎么做到不通过物理表就能生成连续的数值。在 Oracle 里面,可以使用 CONNECT BY
查询,但是在 MySQL 里面可没有这个函数。如果在 MySQL 8.0 之前,确实没有什么好的办法解决这个问题,在 MySQL 8.0 后,可以使用 CTE 递归来生成连续的数值。
如果我们要生成 1,2,3...10 的连续数值,可以这么写:
WITH recursive cte (id) AS (SELECT 1 AS id UNIONALL SELECT id + 1 FROM cte WHERE id < 10) SELECT * FROM cte ;
解决了生成连续数值的问题,再来看看怎么生成斐波那契数列。
在 SQL 里面,从当前行去读取前两行的数据不容易实现,但只读前一行就容易很多。因此,我们在数据集中增加一列,用于存储上一行的斐波那契数。
Talk is cheap. Show me the code.
WITH recursive cte (id, curr, pre) AS (SELECT 1 AS id, 1 AS curr, 1 AS pre UNIONALL SELECT id + 1, IF(id < 2, 1, curr + pre), curr FROM cte WHERE id < 10) SELECT id AS n,curr AS f FROM cte ;
输出结果打印如下:
n f--- --- 1 1 2 1 3 2 4 3 5 5 6 8 7 13 8 21 9 3410 55
CTE 递归的语法不是这篇文章的,后面我会写一篇文章专门讲怎么理解 CTE 递归。
这个实现需要注意两点:
- 把需要取第 n - 2 行的数放到第 n - 1 行的另一个列里;
- 判断条件是
id < 2
而不是id <= 2
,因为 id = n - 1 。
- 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 实例讲解
- [打造自己的监控系统]使用Django批量监控Oracle Job运行情况
- C#多线程--信号量(Semaphore)
- zabbix微信报警设置
- C#中调用python
- Emgucv视频处理--进阶篇
- C#中Lambda表达式总结
- [打造自己的监控系统]使用Django批量监控Oracle长会话
- C# ref实例讲解
- [Oracle 故障处理]记一次undo表空间使用率99%的问题
- C# 队列(Queue)
- 记住没:永远不要在 MySQL 中使用 UTF-8!
- C#多线程委托ParameterizedThreadStart应用
- [Python爬虫]使用Selenium操作浏览器订购火车票
- IDEA多线程调试
- 为什么wait和notify方法要在同步块中调用?