一道MySQL筆試題:輸出?100?以內(nèi)質(zhì)數(shù)(附兩種主要方法)
在 MySQL 中輸出 100 以內(nèi)的質(zhì)數(shù),可以通過幾種方法實現(xiàn)。以下是兩種主要方法:使用存儲過程和使用純 SQL 查詢。
方法一:使用存儲過程
這種方法使用 MySQL 存儲過程來生成質(zhì)數(shù),代碼清晰易懂。
DELIMITER $$
CREATE PROCEDURE GeneratePrimes(IN max_num INT)
BEGIN
DECLARE i INT DEFAULT 2;
DECLARE j INT DEFAULT 2;
DECLARE is_prime BOOLEAN;
DECLARE result TEXT DEFAULT '';
-- 循環(huán)檢查每個數(shù)字是否為質(zhì)數(shù)
WHILE i <= max_num DO
SET is_prime = TRUE;
SET j = 2;
-- 檢查當前數(shù)字是否為質(zhì)數(shù)
WHILE j * j <= i DO
IF i % j = 0 THEN
SET is_prime = FALSE;
LEAVE inner_loop;
END IF;
SET j = j + 1;
END WHILE;
-- 如果是質(zhì)數(shù),添加到結果中
IF is_prime THEN
IF result = '' THEN
SET result = CONCAT(result, i);
ELSE
SET result = CONCAT(result, '&', i);
END IF;
END IF;
SET i = i + 1;
END WHILE;
-- 輸出結果
SELECT result AS prime_numbers;
END$$
DELIMITER ;
-- 調(diào)用存儲過程生成100以內(nèi)的質(zhì)數(shù)
CALL GeneratePrimes(100);
方法二:使用純 SQL 查詢
這種方法使用遞歸 CTE 和復雜的查詢邏輯來生成質(zhì)數(shù)。
WITH RECURSIVE numbers(n) AS (
-- 生成2到100的數(shù)字序列
SELECT 2
UNION ALL
SELECT n + 1 FROM numbers WHERE n < 100
),
primes AS (
-- 篩選出質(zhì)數(shù)
SELECT n1.n
FROM numbers n1
WHERE NOT EXISTS (
SELECT 1
FROM numbers n2
WHERE n2.n > 1 AND n2.n < n1.n AND n1.n % n2.n = 0
)
)
-- 將結果連接成一個字符串,用&分隔
SELECT GROUP_CONCAT(n ORDER BY n SEPARATOR '&') AS prime_numbers
FROM primes;
方法三:使用數(shù)字表和復雜查詢
如果你有一個包含連續(xù)數(shù)字的表(或者創(chuàng)建一個臨時表),可以使用以下方法:
-- 創(chuàng)建臨時數(shù)字表(如果不存在)
CREATE TEMPORARY TABLE IF NOT EXISTS numbers (n INT);
-- 清空并插入2到100的數(shù)字
TRUNCATE TABLE numbers;
INSERT INTO numbers
WITH RECURSIVE seq (n) AS (
SELECT 2
UNION ALL
SELECT n + 1 FROM seq WHERE n < 100
)
SELECT * FROM seq;
-- 查詢質(zhì)數(shù)
SELECT GROUP_CONCAT(n ORDER BY n SEPARATOR '&') AS prime_numbers
FROM numbers n1
WHERE NOT EXISTS (
SELECT 1
FROM numbers n2
WHERE n2.n > 1 AND n2.n <= SQRT(n1.n) AND n1.n % n2.n = 0
);
方法四:優(yōu)化版本(使用平方根優(yōu)化)
這個版本通過只檢查到平方根來優(yōu)化性能:
WITH RECURSIVE numbers(n) AS (
SELECT 2
UNION ALL
SELECT n + 1 FROM numbers WHERE n < 100
)
SELECT GROUP_CONCAT(n ORDER BY n SEPARATOR '&') AS prime_numbers
FROM numbers n1
WHERE NOT EXISTS (
SELECT 1
FROM numbers n2
WHERE n2.n BETWEEN 2 AND SQRT(n1.n) AND n1.n % n2.n = 0
);
結果
無論使用哪種方法,最終結果都應該是:
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
性能比較
- 存儲過程:最靈活,代碼最清晰,但需要創(chuàng)建存儲過程
- 純SQL查詢:不需要創(chuàng)建額外對象,但查詢可能較復雜
- 數(shù)字表方法:如果有現(xiàn)成的數(shù)字表,性能可能更好
- 優(yōu)化版本:通過只檢查到平方根,性能最佳
注意事項
- 如果使用存儲過程,需要有創(chuàng)建存儲過程的權限
- 遞歸CTE在MySQL 8.0及以上版本支持
- 對于更大的數(shù)字范圍,可能需要優(yōu)化算法或增加執(zhí)行時間
選擇哪種方法取決于你的具體需求和MySQL版本。對于100以內(nèi)的質(zhì)數(shù),所有方法都應該能快速完成。
總結
到此這篇關于MySQL輸出100以內(nèi)質(zhì)數(shù)的文章就介紹到這了,更多相關MySQL輸出100以內(nèi)質(zhì)數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mysql 忘記root密碼和修改root密碼的解決方法(小結)
這篇文章主要介紹了Mysql 忘記root密碼和修改root密碼的解決方法(小結),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
mysql導入sql文件報錯 ERROR 2013 2006 2002
今天在做項目的時候遇到個問題,就是往mysql里導入sql文件的時候總是報ERROR 2013 2006 2002,研究了一番才找到解決辦法,這里記錄下來分享給大家2014-11-11
MySQL刪除數(shù)據(jù)Delete與Truncate語句使用比較
在MySQL數(shù)據(jù)庫中,DELETE語句和TRUNCATE TABLE語句都可以用來刪除數(shù)據(jù),但是這兩種語句還是有著其區(qū)別的,下文就為您介紹這二者的差別所在2012-09-09
在linux(Centos)中Mysql的端口修改保姆級教程(最新整理)
本文詳細介紹了如何在CentOS中通過配置文件修改MySQL的端口號,并提供了從切換到root用戶到重啟MySQL的完整步驟,感興趣的朋友跟隨小編一起看看吧2025-11-11

