使用 SQL 语句查找 100 以内的所有质数

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 SQL 语句查找 100 以内的所有质数相关的知识,希望对你有一定的参考价值。

大家好,我是只谈技术不剪发的 Tony 老师。

今天给大家介绍一个 SQL 技巧:查找 100 以内的所有质数。文章描述的方法适用于 Oracle、mysql、Microsoft SQL Server、PostgreSQL 以及 SQLite 等数据库。

如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

质数又称素数。如果一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除就叫做质数(prime number)。

根据质数的定义,对于一个自然数 N,我们可以检查它是否能够被任何从 2 到 N 的平方根加 1 的自然数整除。如果可以被整除,就不是质数;否则是质数。因此,我们可以使用以下查询返回 100 以内的所有质数:

-- MySQL、PostgreSQL、SQLite
WITH RECURSIVE t(n) AS (
SELECT 2
UNION ALL 
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n
FROM t t1
WHERE t1.n = 2
OR NOT EXISTS (
      SELECT 1 
      FROM t t2 
      WHERE t2.n BETWEEN 2 AND sqrt(t1.n)+1
      AND t1.n%t2.n = 0
);

n |
--+
 2|
 3|
 5|
 7|
11|
13|
17|
19|
23|
29|
31|
37|
41|
43|
47|
53|
59|
61|
67|
71|
73|
79|
83|
89|
97|

首先,我们使用一个 WITH RECURSIVE 语句构造了一个从 2 到 100 的自然数序列。关于通用表表达式(WITH 子句)的详细介绍,可以参考这篇文章

然后,我们使用了一个 NOT EXISTS 子查询,返回了满足条件的所有质数。数字 2 属于质数,所以我们直接返回了该数字。

如果使用 Oracle 或者 Microsoft SQL Server 数据库,需要对以上语句进行略微调整:

-- Oracle
WITH t(n) AS (
SELECT 2 FROM dual
UNION ALL 
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n
FROM t t1
WHERE t1.n = 2
OR NOT EXISTS (
      SELECT 1 
      FROM t t2 
      WHERE t2.n BETWEEN 2 AND sqrt(t1.n)+1
      AND MOD(t1.n, t2.n) = 0
);

-- Microsoft SQL Server
WITH t(n) AS (
SELECT 2
UNION ALL 
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n
FROM t t1
WHERE t1.n = 2
OR NOT EXISTS (
      SELECT 1 
      FROM t t2 
      WHERE t2.n BETWEEN 2 AND sqrt(t1.n)+1
      AND t1.n%t2.n = 0
);

对于 Oracle,我们需要利用 dual 表创建数字序列,WITH 子句不需要关键字 RECURSIVE,MOD 函数用于求余运算。对于 Microsoft SQL Server,WITH 子句不需要关键字 RECURSIVE。

除了以上方法之外,我们也可以换一个思路。对于一个自然数 N,只有 1 和它自己相乘等于 N。因此,以下查询也可以实现相同的结果:

-- MySQL、PostgreSQL、SQLite
WITH RECURSIVE t(n) AS (
SELECT 1
UNION ALL 
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n*t2.n
FROM t t1, t t2
WHERE t1.n <= t2.n AND t1.n*t2.n > 1 AND t1.n*t2.n <= 100
GROUP BY t1.n*t2.n
HAVING count(*)=1
ORDER BY 1;

-- Oracle
WITH t(n) AS (
SELECT 1 FROM dual
UNION ALL 
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n*t2.n
FROM t t1, t t2
WHERE t1.n <= t2.n AND t1.n*t2.n > 1 AND t1.n*t2.n <= 100
GROUP BY t1.n*t2.n
HAVING count(*)=1
ORDER BY 1;

-- Microsoft SQL Server
WITH t(n) AS (
SELECT 1
UNION ALL 
SELECT n+1 FROM t WHERE n<100
)
SELECT t1.n*t2.n
FROM t t1, t t2
WHERE t1.n <= t2.n AND t1.n*t2.n > 1 AND t1.n*t2.n <= 100
GROUP BY t1.n*t2.n
HAVING count(*)=1
ORDER BY 1;

首先,我们使用一个 WITH RECURSIVE 语句构造了一个从 1 到 100 的自然数序列。

然后,在下面的语句中通过自连接查询计算小于等于 100 的数字,有多少种乘法的结果等于该数字。如果乘法的方式只有一种,说明该数字是一个质数。

这两种语句都能实现质数的查找,你喜欢哪一种呢?

以上是关于使用 SQL 语句查找 100 以内的所有质数的主要内容,如果未能解决你的问题,请参考以下文章

使用达梦数据库快速查找1000以内的质数

求100以内的所有质数(素数) 要求:用VB的for语句写

c语言使用循环找出100之内的所有质数

需要两个办法,100以内找出质数?

python ---求100以内的质数有哪些

嵌套循环专题 100以内所有的质数(素数) primeNumber