SQL 求 1000 以内的素数(MySQL8.0 版)
-- 要先把默认的递归深度放开,不然造不了1-1000的数
SET SESSION cte_max_recursion_depth = 1010;
-- 造一个大于等于 2,小于 1000 的除数
with recursive numb(n1) as (
select 2
union all
select n1+1 from numb where n1 < 1000
),
-- 造一个大于等于 2,小于等于 1000 的被除数
prime(n) as (
select 2
union all
select n+1 from prime where n <= 1000
)
select *
from prime
where not exists
(
select * from numb
where floor(prime.n/numb.n1)=(prime.n/numb.n1) -- 这里是关键,过滤了中间能整除的数。只有能整除的数,它们的地板除才会等于除运算的结果(也就是0)
and numb.n1 < prime.n
);