P(n) represents a pattern drawn by Julia in R rows. The following pattern represents P(5):
*
* *
* * *
* * * *
* * * * *
Write a query to print the pattern P(20).
翻译过来就是有个P(5)的结果是上面那个样子,让你写个P(20),能够输出对应的图形
1、输入n给P,就会得到图形
2、图形是n行字符串,那么要把字符串连接起来就要使用concat()函数
注:concat(‘str1’,‘str2’,‘str3’,…),将str1,str2,str3…连接起来
3、那么接下来需要输出n个*,这里要使用repeat(str,count)函数
注:repeat(str,count),将str重复count次
4、要一层一层的输出,那么这里就需要牵扯到循环遍历,创建一个变量i,当i<=n时,执行2,3
5、要把以上功能整合在一起,我最先想到的是函数,思考过后,也可以使用存储过程来实现
while 条件 do
SQL语句;
end while;
repeat
sql;
until 条件;
end repeat;
leave:配合循环,退出循环
iterate:跳过当前循环,直接进入下一次循环
[begin_label:]loop
SQL
end loop[end_label];
注:使用loop要注意必须要使用leave,否则loop会无线循环
这里我选择的是while循环,理由是简单,好理解
DELIMITER //
CREATE FUNCTION fun1 ( idx INT ) RETURNS VARCHAR(255) DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE l1 VARCHAR(255) DEFAULT '';# 声明定义1个变量, 初值默认为 null
declare l2 VARCHAR(255) DEFAULT '';
while idx>=i do
set l1 = REPEAT('* ',i);
repe
set l2 = CONCAT(l2,l1,'\n');
set i = i+1;
end while;
RETURN l2 ;
END //
DELIMITER ;
SELECT fun1(20)
注:如果MySQL配置中启用了二进制日志记录(binary logging),而函数声明中没有指定函数的属性,导致MySQL无法确定函数是否是确定性的(deterministic)。为了解决这个问题,我在函数声明中添加 DETERMINISTIC 关键字,表示函数是确定性的。否则函数会报错:
1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
DELIMITER //
CREATE PROCEDURE drawP(IN n INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE pattern VARCHAR(255) DEFAULT '';
DECLARE result VARCHAR(255) DEFAULT '';
WHILE i <= n DO
SET pattern = REPEAT('* ', i);
SET result = CONCAT(result, pattern, '\n');
SET i = i + 1;
END WHILE;
SELECT result;
END //
DELIMITER ;
CALL drawP(20);
DELIMITER $$
CREATE PROCEDURE pattern()
BEGIN
DECLARE pat TEXT;
DECLARE num INT;
SET num = 0;
SET pat = "";
looper: LOOP
SET num = num + 1;
SET pat = CONCAT(pat, "* ");
SELECT pat;
IF num = 20 THEN
LEAVE looper;
END IF;
END LOOP looper;
END $$
DELIMITER ;
CALL pattern();
注0:loop函数必须使用leave loop函数名
注1:此函数的执行结果是n个结果,第几个结果就有几个*,while和存储函数都是链接在一起是一个输出结果
注2:此函数没有使用repeat函数,而是巧妙的使用了concat函数,每次都多链接一个‘*_’