一道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;
-- 檢查當(dāng)前數(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ù),添加到結(jié)果中
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;
-- 輸出結(jié)果
SELECT result AS prime_numbers;
END$$
DELIMITER ;
-- 調(diào)用存儲過程生成100以內(nèi)的質(zhì)數(shù)
CALL GeneratePrimes(100);
方法二:使用純 SQL 查詢
這種方法使用遞歸 CTE 和復(fù)雜的查詢邏輯來生成質(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
)
)
-- 將結(jié)果連接成一個字符串,用&分隔
SELECT GROUP_CONCAT(n ORDER BY n SEPARATOR '&') AS prime_numbers
FROM primes;
方法三:使用數(shù)字表和復(fù)雜查詢
如果你有一個包含連續(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
);
結(jié)果
無論使用哪種方法,最終結(jié)果都應(yīng)該是:
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)建額外對象,但查詢可能較復(fù)雜
- 數(shù)字表方法:如果有現(xiàn)成的數(shù)字表,性能可能更好
- 優(yōu)化版本:通過只檢查到平方根,性能最佳
注意事項
- 如果使用存儲過程,需要有創(chuàng)建存儲過程的權(quán)限
- 遞歸CTE在MySQL 8.0及以上版本支持
- 對于更大的數(shù)字范圍,可能需要優(yōu)化算法或增加執(zhí)行時間
選擇哪種方法取決于你的具體需求和MySQL版本。對于100以內(nèi)的質(zhì)數(shù),所有方法都應(yīng)該能快速完成。
總結(jié)
到此這篇關(guān)于MySQL輸出100以內(nèi)質(zhì)數(shù)的文章就介紹到這了,更多相關(guān)MySQL輸出100以內(nèi)質(zhì)數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
導(dǎo)致MySQL索引失效的一些常見寫法總結(jié)
這篇文章主要給大家介紹了關(guān)于導(dǎo)致MySQL索引失效的一些常見寫法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
mysql中order by與group by的區(qū)別
以下是對mysql中order by與group by的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-07-07
Ubuntu中MySQL的參數(shù)文件my.cnf示例詳析
這篇文章主要給大家介紹了關(guān)于Ubuntu中MySQL的參數(shù)文件my.cnf的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
SQLyog連接MySQL8.0+報錯:錯誤碼2058的解決方案
使用sqlyog連接數(shù)據(jù)庫過程中出現(xiàn)2058錯誤,出現(xiàn)的原因是因為MYSQL8.0對密碼的加密方式進(jìn)行了改變,這篇文章主要給大家介紹了關(guān)于SQLyog連接MySQL8.0+報錯:錯誤碼2058的解決方案,需要的朋友可以參考下2024-07-07
mysql授予用戶遠(yuǎn)程訪問權(quán)限的實現(xiàn)
在默認(rèn)情況下,MySQL 數(shù)據(jù)庫僅允許在本地主機(jī)上進(jìn)行訪問,如果您需要遠(yuǎn)程連接到 MySQL 數(shù)據(jù)庫,您需要授予用戶遠(yuǎn)程訪問權(quán)限,本文就來2023-11-11
使用ORM新增數(shù)據(jù)在Mysql中的操作步驟
這篇文章主要介紹了使用ORM新增數(shù)據(jù)在Mysql中,但是在這需要注意需要大家新建ORM模型,具體搭建步驟及詳細(xì)過程跟隨小編一起看看吧2021-07-07

