Skip to content

WHILE 循环

sh
# 准备工作:
# 1.导入atguigudb数据库


# 2.建立dbtest08数据库
CREATE DATABASE dbtest08 CHARACTER SET utf8;

# 3.切换当前数据库为dbtest08
USE dbtest08;

# 4.建立表
CREATE TABLE emps
AS
SELECT * FROM atguigudb.employees;

CREATE TABLE depts
AS
SELECT * FROM atguigudb.departments;

SELECT * FROM emps;

SELECT * FROM depts;

# ---------------------------------------WHILE循环----------------------------------------------------------------
# 例1:编写一个函数get_sum2,定义参数start_val和end_val,计算从start_val到end_val所有整数之和。
DELIMITER //
CREATE FUNCTION get_sum2(start_val INT, end_val INT)
RETURNS INT
BEGIN
    DECLARE i, res INT;
    SET i = start_val;
    SET res = 0;
    WHILE i <= end_val DO
        SET res = res + i;
        SET i = i + 1;
    END WHILE;
    RETURN res;
END //
DELIMITER ;

SELECT get_sum2(1, 100);

# 例2:市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。声明存储过程“update_salary_while()”,声明OUT参数num,输出循环次数。存储过程中实现循环给大家降薪,薪资降为原来的90%。直到全公司的平均薪资达到3000结束。并统计循环次数。
DELIMITER //
CREATE PROCEDURE update_salary_while(OUT num INT)
BEGIN
    DECLARE avg_sal DOUBLE;
    SET num = 0;
    SELECT AVG(salary) INTO avg_sal FROM emps;
    WHILE avg_sal > 3000 DO
        UPDATE emps SET salary = salary * 0.9;
        SET num = num + 1;
        SELECT AVG(salary) INTO avg_sal FROM emps;
    END WHILE;
END //
DELIMITER ;

CALL update_salary_while(@cnt);
SELECT @cnt;

# 例3:编写一个函数get_factorial,定义参数n,实现求n的阶乘
DELIMITER //
CREATE FUNCTION get_factorial(n INT)
RETURNS INT
BEGIN
    DECLARE i, res INT;
    SET i = 1;
    SET res = 1;
    WHILE i <= n DO
        SET res = res * i;
        SET i = i + 1;
    END WHILE;
    RETURN res;
END //
DELIMITER ;

SELECT get_factorial(10);


# 例4:编写一个过程get_leap_year,定义参数start_year和end_year,输出所有的闰年。
DELIMITER //
CREATE PROCEDURE get_leap_year(IN start_year INT, IN end_year INT)
BEGIN
    DECLARE i INT;
    DECLARE res VARCHAR(1000);
    SET i = start_year;
    SET res = '';
    WHILE i <= end_year DO
        IF i % 4 = 0 AND i % 100 <> 100 OR i % 400 = 0 THEN
            SET res = CONCAT(res, i, '  ');
        END IF;
        SET i = i + 1;
    END WHILE;
    SELECT res;
END //
DELIMITER ;

CALL get_leap_year(1970, 2023);


# 例5:编写一个过程get_narcissistic_num,输出所有的水仙花数。
DELIMITER //
CREATE PROCEDURE get_narcissistic_num()
BEGIN
    DECLARE i, ge, shi, bai, total INT;
    DECLARE res VARCHAR(100);
    SET i = 100;
    SET res = '';
    WHILE i < 1000 DO
        SET ge = i % 10;
        SET shi = FLOOR(i / 10) % 10;
        SET bai = FLOOR(i / 100);
        SET total = ge * ge * ge + shi * shi * shi + bai * bai * bai;
        IF total = i THEN
            SET res = CONCAT(res, i, '  ');
        END IF;
        SET i = i + 1;
    END WHILE;
    SELECT res;
END //
DELIMITER ;

CALL get_narcissistic_num();


# 例6:编写一个过程get_prime_num,输出1--100以内所有的素数。
DELIMITER //
CREATE PROCEDURE get_prime_num()
BEGIN
    DECLARE i, j, n INT;
    DECLARE res VARCHAR(1000);
    SET i = 2;
    SET res = '';
    WHILE i <= 100 DO
        SET j = 2;
        SET n = FLOOR(SQRT(i));
        label:WHILE j <= n DO
            IF i % j = 0 THEN
                LEAVE label;
            END IF;
            SET j = j + 1;
        END WHILE;
        IF j > n THEN
            SET res = CONCAT(res, i, '  ');
        END IF;
        SET i = i + 1;
    END WHILE;
    SELECT res;
END //
DELIMITER ;

CALL get_prime_num();