前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 生成斐波那契数列

SQL 生成斐波那契数列

作者头像
白日梦想家
发布2020-07-18 18:30:56
1.1K0
发布2020-07-18 18:30:56
举报
文章被收录于专栏:SQL实现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 的连续数值,可以这么写:

代码语言:javascript
复制
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.

代码语言:javascript
复制
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 ;

输出结果打印如下:

代码语言:javascript
复制
n         f---       --- 1         1 2         1 3         2 4         3 5         5 6         8 7        13 8        21 9        3410        55

CTE 递归的语法不是这篇文章的,后面我会写一篇文章专门讲怎么理解 CTE 递归。

这个实现需要注意两点:

  1. 把需要取第 n - 2 行的数放到第 n - 1 行的另一个列里;
  2. 判断条件是 id < 2 而不是 id <= 2,因为 id = n - 1 。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL实现 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档