SQL语法基础之高级应用
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.存储过程与函数
1>.CREATE PROCEDURE 用来创建存储过程
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> ? CREATE PROCEDURE Name: 'CREATE PROCEDURE' Description: Syntax: CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: Valid SQL routine statement These statements create stored routines. By default, a routine is associated with the default database. To associate the routine explicitly with a given database, specify the name as db_name.sp_name when you create it. The CREATE FUNCTION statement is also used in MySQL to support UDFs (user-defined functions). See http://dev.mysql.com/doc/refman/8.0/en/adding-functions.html. A UDF can be regarded as an external stored function. Stored functions share their namespace with UDFs. See http://dev.mysql.com/doc/refman/8.0/en/function-resolution.html, for the rules describing how the server interprets references to different kinds of functions. To invoke a stored procedure, use the CALL statement (see [HELP CALL]). To invoke a stored function, refer to it in an expression. The function returns a value during expression evaluation. CREATE PROCEDURE and CREATE FUNCTION require the CREATE ROUTINE privilege. They might also require the SET_USER_ID or SUPER privilege, depending on the DEFINER value, as described later in this section. If binary logging is enabled, CREATE FUNCTION might require the SUPER privilege, as described in http://dev.mysql.com/doc/refman/8.0/en/stored-programs-logging.html. By default, MySQL automatically grants the ALTER ROUTINE and EXECUTE privileges to the routine creator. This behavior can be changed by disabling the automatic_sp_privileges system variable. See http://dev.mysql.com/doc/refman/8.0/en/stored-routines-privileges.html. The DEFINER and SQL SECURITY clauses specify the security context to be used when checking access privileges at routine execution time, as described later in this section. If the routine name is the same as the name of a built-in SQL function, a syntax error occurs unless you use a space between the name and the following parenthesis when defining the routine or invoking it later. For this reason, avoid using the names of existing SQL functions for your own stored routines. The IGNORE_SPACE SQL mode applies to built-in functions, not to stored routines. It is always permissible to have spaces after a stored routine name, regardless of whether IGNORE_SPACE is enabled. The parameter list enclosed within parentheses must always be present. If there are no parameters, an empty parameter list of () should be used. Parameter names are not case sensitive. Each parameter is an IN parameter by default. To specify otherwise for a parameter, use the keyword OUT or INOUT before the parameter name. *Note*: Specifying a parameter as IN, OUT, or INOUT is valid only for a PROCEDURE. For a FUNCTION, parameters are always regarded as IN parameters. An IN parameter passes a value into a procedure. The procedure might modify the value, but the modification is not visible to the caller when the procedure returns. An OUT parameter passes a value from the procedure back to the caller. Its initial value is NULL within the procedure, and its value is visible to the caller when the procedure returns. An INOUT parameter is initialized by the caller, can be modified by the procedure, and any change made by the procedure is visible to the caller when the procedure returns. For each OUT or INOUT parameter, pass a user-defined variable in the CALL statement that invokes the procedure so that you can obtain its value when the procedure returns. If you are calling the procedure from within another stored procedure or function, you can also pass a routine parameter or local routine variable as an OUT or INOUT parameter. If you are calling the procedure from within a trigger, you can also pass NEW.col_name as an OUT or INOUT parameter. Routine parameters cannot be referenced in statements prepared within the routine; see http://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html . The following example shows a simple stored procedure that uses an OUT parameter: mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END// Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL simpleproc(@a); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a; +------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec) The example uses the mysql client delimiter command to change the statement delimiter from ; to // while the procedure is being defined. This enables the ; delimiter used in the procedure body to be passed through to the server rather than being interpreted by mysql itself. See http://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html. The RETURNS clause may be specified only for a FUNCTION, for which it is mandatory. It indicates the return type of the function, and the function body must contain a RETURN value statement. If the RETURN statement returns a value of a different type, the value is coerced to the proper type. For example, if a function specifies an ENUM or SET value in the RETURNS clause, but the RETURN statement returns an integer, the value returned from the function is the string for the corresponding ENUM member of set of SET members. The following example function takes a parameter, performs an operation using an SQL function, and returns the result. In this case, it is unnecessary to use delimiter because the function definition contains no internal ; statement delimiters: mysql> CREATE FUNCTION hello (s CHAR(20)) mysql> RETURNS CHAR(50) DETERMINISTIC -> RETURN CONCAT('Hello, ',s,'!'); Query OK, 0 rows affected (0.00 sec) mysql> SELECT hello('world'); +----------------+ | hello('world') | +----------------+ | Hello, world! | +----------------+ 1 row in set (0.00 sec) Parameter types and function return types can be declared to use any valid data type. The COLLATE attribute can be used if preceded by the CHARACTER SET attribute. The routine_body consists of a valid SQL routine statement. This can be a simple statement such as SELECT or INSERT, or a compound statement written using BEGIN and END. Compound statements can contain declarations, loops, and other control structure statements. The syntax for these statements is described in http://dev.mysql.com/doc/refman/8.0/en/sql-syntax-compound-statements.h tml. MySQL permits routines to contain DDL statements, such as CREATE and DROP. MySQL also permits stored procedures (but not stored functions) to contain SQL transaction statements such as COMMIT. Stored functions may not contain statements that perform explicit or implicit commit or rollback. Support for these statements is not required by the SQL standard, which states that each DBMS vendor may decide whether to permit them. Statements that return a result set can be used within a stored procedure but not within a stored function. This prohibition includes SELECT statements that do not have an INTO var_list clause and other statements such as SHOW, EXPLAIN, and CHECK TABLE. For statements that can be determined at function definition time to return a result set, a Not allowed to return a result set from a function error occurs (ER_SP_NO_RETSET). For statements that can be determined only at runtime to return a result set, a PROCEDURE %s can't return a result set in the given context error occurs (ER_SP_BADSELECT). USE statements within stored routines are not permitted. When a routine is invoked, an implicit USE db_name is performed (and undone when the routine terminates). The causes the routine to have the given default database while it executes. References to objects in databases other than the routine default database should be qualified with the appropriate database name. For additional information about statements that are not permitted in stored routines, see http://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html . For information about invoking stored procedures from within programs written in a language that has a MySQL interface, see [HELP CALL]. MySQL stores the sql_mode system variable setting in effect when a routine is created or altered, and always executes the routine with this setting in force, regardless of the current server SQL mode when the routine begins executing. The switch from the SQL mode of the invoker to that of the routine occurs after evaluation of arguments and assignment of the resulting values to routine parameters. If you define a routine in strict SQL mode but invoke it in nonstrict mode, assignment of arguments to routine parameters does not take place in strict mode. If you require that expressions passed to a routine be assigned in strict SQL mode, you should invoke the routine with strict mode in effect. URL: http://dev.mysql.com/doc/refman/8.0/en/create-procedure.html mysql>
2>.CREATE FUNCTION用来创建函数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> ? CREATE FUNCTION Name: 'CREATE FUNCTION' Description: The CREATE FUNCTION statement is used to create stored functions and user-defined functions (UDFs): o For information about creating stored functions, see [HELP CREATE PROCEDURE]. o For information about creating user-defined functions, see [HELP CREATE FUNCTION UDF]. URL: http://dev.mysql.com/doc/refman/8.0/en/create-function.html mysql> mysql> mysql>
3>.关键词说明
1>.函数与存储过程最大的区别就是函数调用有返回值,调用存储过程用call语句,而调用函数就直接引用函数名+参数即可! 2>.Definer和SQL SECURITY子句指定安全环境 Definder是MySQL的特殊的访问控制手段,当数据库当前没有这个用户权限时,执行存储过程可能会报错。 SQL SECURITY的值决定了调用存储过程的方式,其值为:definer(默认)或者invoker,详细说明如下: definer:在执行存储过程前验证definer对应的用户,如:yinzhengjie@127.0.0.1是否存在,以及是否具有执行存储过程的权限,若没有则报错。 invoker:在执行存储过程时判断inovker即调用该存储过程的用户是否有相应权限,若没有则报错。 3>.IN,OUT,INOUT三个参数前的关键词只适用于存储过程,对函数而言所有的参数默认都是输入参数。 4>.IN输入参数用于把数值传入到存储过程中;OUT输出参数将数值传递到调用者,初始值是NULL;INOUT输入输出参数把数据传入到存储过程,在存储过程中修改之后再传递到调用者。 5>.DELIMITER命令是改变语句的结束符,MySQL默认的结束符为分号(”;”),由于PROCEDURE和FUNCTION中 的分号(”;”)并不代表创建的结束,所以要替换成另外的结束符以便表示创建的结束。 6>.Rontine_body 子句可以包含一个简单的SQL语句,也可以包含多个 SQL语句,通过begin...end将这多个SQL语句包含在一起 7>.MySQL存储过程和函数中也可以包含类似create和drop等DDL语句 8>.Comment子句用来写入对存储过程和函数的注释 9>.Language子句用来表示此存储过程和函数的创建语言 10>.存储过程和函数被标注为deterministic表明当输入相同的参数是会 返回相同的结果,反之如果是not deterministic则表示相同参数不 会是相同结果,默认是not deterministic 11>.相关属性短语只有咨询含义,并不是强制性的约束 Contains sql表明此存储过程或函数不包含读或者写数据的语句,这是默认属性 NO SQL表示此存储过程或函数不包含SQL语句 Reads sql data表示此存储过程包含诸如select的查询数据的语句,但不包含插入或删除数据的语句 Modifies sql data表示此存储过程包含插入或删除数据的语句 12>.Drop procedure/function语句用来删除指定名称的存储过程或函数 13>.IF EXISTS关键词用来避免在删除一个本身不存在的存储过程或函数时,MySQL返回错误 14>.BEGIN...END语句通常出现在存储过程、函数和触发器中,其中可 以包含一个或多个语句,每个语句用分号(";")隔开
4>.案例展示
创建存储过程案例一:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> SELECT DATABASE(); +-------------+ | DATABASE() | +-------------+ | yinzhengjie | +-------------+ row in set (0.00 sec) mysql> mysql> SHOW TABLES; +-----------------------+ | Tables_in_yinzhengjie | +-----------------------+ | course | | score_graph | | student | | teacher | | view_teacher | +-----------------------+ rows in set (0.00 sec) mysql> mysql> SELECT * FROM teacher; +----+-----------+-----------+ | id | name | course_id | +----+-----------+-----------+ | 1 | 谢霆锋 | 11 | | 2 | 周杰伦 | 1 | | 3 | 蔡依林 | 13 | | 4 | 杨幂 | 2 | | 5 | 胡歌 | 12 | | 6 | 刘德华 | 3 | | 7 | 张学友 | 10 | | 8 | 郭德纲 | 4 | | 9 | 林俊杰 | 9 | +----+-----------+-----------+ rows in set (0.00 sec) mysql> mysql> DELIMITER // mysql> mysql> CREATE PROCEDURE demo(IN args1 int,OUT args2 INT) -> BEGIN -> SELECT COUNT(*) INTO args2 FROM teacher where id> args1; -> END// Query OK, 0 rows affected (0.01 sec) mysql> mysql> DELIMITER ; mysql> mysql>
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> CALL demo2(2,@res); Query OK, 1 row affected (0.00 sec) mysql> mysql> SELECT @res; +------+ | @res | +------+ | 7 | +------+ 1 row in set (0.00 sec) mysql>
创建存储过程案例二:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
[root@node110 ~]# mysql -uroot -pyinzhengjie mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 Server version: 8.0.14 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql> CREATE USER 'jason'@'node110.yinzhengjie.org.cn' IDENTIFIED BY 'yinzhengjie'; Query OK, 0 rows affected (0.01 sec) mysql> mysql> SELECT Host,User FROM mysql.user WHERE Host = 'node110.yinzhengjie.org.cn'; +----------------------------+-------+ | Host | User | +----------------------------+-------+ | node110.yinzhengjie.org.cn | jason | +----------------------------+-------+ 1 row in set (0.00 sec) mysql> mysql> SHOW GRANTS FOR 'jason'@'node110.yinzhengjie.org.cn'; +------------------------------------------------------------+ | Grants for jason@node110.yinzhengjie.org.cn | +------------------------------------------------------------+ | GRANT USAGE ON *.* TO `jason`@`node110.yinzhengjie.org.cn` | +------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> mysql> GRANT ALL PRIVILEGES ON yinzhengjie.* TO `jason`@`node110.yinzhengjie.org.cn` WITH GRANT OPTION; Query OK, 0 rows affected (0.01 sec) mysql> mysql> SHOW GRANTS FOR 'jason'@'node110.yinzhengjie.org.cn'; +---------------------------------------------------------------------------------------------------+ | Grants for jason@node110.yinzhengjie.org.cn | +---------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `jason`@`node110.yinzhengjie.org.cn` | | GRANT ALL PRIVILEGES ON `yinzhengjie`.* TO `jason`@`node110.yinzhengjie.org.cn` WITH GRANT OPTION | +---------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql> [root@node110 ~]# hostname node110.yinzhengjie.org.cn [root@node110 ~]# [root@node110 ~]# mysql -h node110.yinzhengjie.org.cn -ujason -pyinzhengjie mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 23 Server version: 8.0.14 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | yinzhengjie | +--------------------+ 2 rows in set (0.00 sec) mysql> mysql> USE yinzhengjie Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> mysql> SHOW TABLES -> ; +-----------------------+ | Tables_in_yinzhengjie | +-----------------------+ | course | | score_graph | | student | | teacher | | view_teacher | +-----------------------+ 5 rows in set (0.00 sec) mysql> mysql> SELECT * FROM teacher; +----+-----------+-----------+ | id | name | course_id | +----+-----------+-----------+ | 1 | 谢霆锋 | 11 | | 2 | 周杰伦 | 1 | | 3 | 蔡依林 | 13 | | 4 | 杨幂 | 2 | | 5 | 胡歌 | 12 | | 6 | 刘德华 | 3 | | 7 | 张学友 | 10 | | 8 | 郭德纲 | 4 | | 9 | 林俊杰 | 9 | | 16 | Jason Yin | 8 | +----+-----------+-----------+ 10 rows in set (0.00 sec) mysql>
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> SELECT VERSION(); +-----------+ | VERSION() | +-----------+ | 8.0.14 | +-----------+ 1 row in set (0.00 sec) mysql> mysql> mysql> SELECT USER(); +----------------------------------+ | USER() | +----------------------------------+ | jason@node110.yinzhengjie.org.cn | +----------------------------------+ 1 row in set (0.00 sec) mysql> mysql> SELECT DATABASE(); +-------------+ | DATABASE() | +-------------+ | yinzhengjie | +-------------+ 1 row in set (0.00 sec) mysql> mysql> mysql> DELIMITER // mysql> mysql> CREATE PROCEDURE myproc(IN args1 INT,OUT args2 INT) -> -> BEGIN -> -> SELECT COUNT(*) INTO args2 FROM teacher WHERE course_id > args1; -> -> END// Query OK, 0 rows affected (0.00 sec) mysql> mysql> DELIMITER ; mysql>
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> SELECT VERSION(); +-----------+ | VERSION() | +-----------+ | 8.0.14 | +-----------+ 1 row in set (0.00 sec) mysql> mysql> mysql> SELECT DATABASE(); +-------------+ | DATABASE() | +-------------+ | yinzhengjie | +-------------+ 1 row in set (0.00 sec) mysql> mysql> SELECT USER(); +----------------------------------+ | USER() | +----------------------------------+ | jason@node110.yinzhengjie.org.cn | +----------------------------------+ 1 row in set (0.00 sec) mysql> mysql> CALL myproc(5,@res); Query OK, 1 row affected (0.00 sec) mysql> mysql> SELECT @res; +------+ | @res | +------+ | 6 | +------+ 1 row in set (0.00 sec) mysql> mysql> SELECT COUNT(*) FROM teacher WHERE course_id > 5; +----------+ | COUNT(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec) mysql> mysql> mysql> SELECT * FROM teacher WHERE course_id > 5; +----+-----------+-----------+ | id | name | course_id | +----+-----------+-----------+ | 16 | Jason Yin | 8 | | 9 | 林俊杰 | 9 | | 7 | 张学友 | 10 | | 1 | 谢霆锋 | 11 | | 5 | 胡歌 | 12 | | 3 | 蔡依林 | 13 | +----+-----------+-----------+ 6 rows in set (0.00 sec) mysql> mysql>
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> SELECT VERSION(); +-----------+ | VERSION() | +-----------+ | 8.0.14 | +-----------+ 1 row in set (0.00 sec) mysql> mysql> SELECT DATABASE(); +-------------+ | DATABASE() | +-------------+ | yinzhengjie | +-------------+ 1 row in set (0.00 sec) mysql> mysql> SELECT USER(); +----------------+ | USER() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) mysql> mysql> CALL myproc(5,@res); Query OK, 1 row affected (0.01 sec) mysql> mysql> SELECT @res; +------+ | @res | +------+ | 6 | +------+ 1 row in set (0.00 sec) mysql> mysql> mysql> mysql> DROP USER jason@node110.yinzhengjie.org.cn; Query OK, 0 rows affected (0.00 sec) mysql> mysql> CALL myproc(5,@res); ERROR 1449 (HY000): The user specified as a definer ('jason'@'node110.yinzhengjie.org.cn') does not exist mysql> mysql> ALTER PROCEDURE myproc SQL SECURITY INVOKER; Query OK, 0 rows affected (0.01 sec) mysql> mysql> CALL myproc(5,@res); Query OK, 1 row affected (0.00 sec) mysql> mysql> SELECT @res; +------+ | @res | +------+ | 6 | +------+ 1 row in set (0.00 sec) mysql>
创建函数案例一:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> set global log_bin_trust_function_creators=TRUE; Query OK, 0 rows affected (0.00 sec) mysql> mysql> CREATE FUNCTION hello(str CHAR(30)) -> RETURNS CHAR(50) -> RETURN CONCAT('Hello,',str,'!'); Query OK, 0 rows affected (0.00 sec) mysql>
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> set global log_bin_trust_function_creators=TRUE; Query OK, 0 rows affected (0.00 sec) mysql> mysql> CREATE FUNCTION hello(str CHAR(30)) -> RETURNS CHAR(50) -> RETURN CONCAT('Hello,',str,'!'); Query OK, 0 rows affected (0.00 sec) mysql> mysql> SELECT hello('尹正杰'); +--------------------+ | hello('尹正杰') | +--------------------+ | Hello,尹正杰! | +--------------------+ 1 row in set, 2 warnings (0.00 sec) mysql> mysql>
创建函数案例二:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> SELECT * FROM yinzhengjie.teacher; +----+-----------+-----------+ | id | name | course_id | +----+-----------+-----------+ | 1 | 谢霆锋 | 11 | | 2 | 周杰伦 | 1 | | 3 | 蔡依林 | 13 | | 4 | 杨幂 | 2 | | 5 | 胡歌 | 12 | | 6 | 刘德华 | 3 | | 7 | 张学友 | 10 | | 8 | 郭德纲 | 4 | | 9 | 林俊杰 | 9 | | 16 | 尹正杰 | 8 | +----+-----------+-----------+ 10 rows in set (0.00 sec) mysql> mysql> DELIMITER // mysql> CREATE FUNCTION myfunc(args1 INT) -> RETURNS INT -> BEGIN -> UPDATE yinzhengjie.teacher SET name = 'Jason Yin' WHERE id = args1; -> SELECT COUNT(*) INTO @res FROM yinzhengjie.teacher WHERE course_id % args1 = 0; -> RETURN @res; -> END// Query OK, 0 rows affected (0.00 sec) mysql> mysql> DELIMITER ;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> DELIMITER // mysql> CREATE FUNCTION myfunc(args1 INT) -> RETURNS INT -> BEGIN -> UPDATE yinzhengjie.teacher SET name = 'Jason Yin' WHERE id = args1; -> SELECT COUNT(*) INTO @res FROM yinzhengjie.teacher WHERE course_id % args1 = 0; -> RETURN @res; -> END// Query OK, 0 rows affected (0.00 sec) mysql> mysql> DELIMITER ; mysql> mysql> mysql> SELECT * FROM yinzhengjie.teacher; +----+-----------+-----------+ | id | name | course_id | +----+-----------+-----------+ | 1 | 谢霆锋 | 11 | | 2 | 周杰伦 | 1 | | 3 | 蔡依林 | 13 | | 4 | 杨幂 | 2 | | 5 | 胡歌 | 12 | | 6 | 刘德华 | 3 | | 7 | 张学友 | 10 | | 8 | 郭德纲 | 4 | | 9 | 林俊杰 | 9 | | 16 | 尹正杰 | 8 | +----+-----------+-----------+ rows in set (0.00 sec) mysql> mysql> SELECT myfunc(16); +------------+ | myfunc(16) | +------------+ | 0 | +------------+ row in set (0.00 sec) mysql> mysql> SELECT * FROM yinzhengjie.teacher; +----+-----------+-----------+ | id | name | course_id | +----+-----------+-----------+ | 1 | 谢霆锋 | 11 | | 2 | 周杰伦 | 1 | | 3 | 蔡依林 | 13 | | 4 | 杨幂 | 2 | | 5 | 胡歌 | 12 | | 6 | 刘德华 | 3 | | 7 | 张学友 | 10 | | 8 | 郭德纲 | 4 | | 9 | 林俊杰 | 9 | | 16 | Jason Yin | 8 | +----+-----------+-----------+ rows in set (0.01 sec) mysql> mysql> SELECT COUNT(*) FROM yinzhengjie.teacher WHERE course_id % 16 = 0; +----------+ | COUNT(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec) mysql> mysql> SELECT * FROM yinzhengjie.teacher WHERE course_id % 8 = 0; +----+-----------+-----------+ | id | name | course_id | +----+-----------+-----------+ | 16 | Jason Yin | 8 | +----+-----------+-----------+ 1 row in set (0.00 sec) mysql>
删除创建过程案例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> DROP PROCEDURE demo; Query OK, 0 rows affected (0.01 sec) mysql> mysql> DROP PROCEDURE demo; ERROR 1305 (42000): PROCEDURE yinzhengjie.demo does not exist mysql> mysql> mysql> mysql> DROP PROCEDURE IF EXISTS demo; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> mysql>
删除函数案例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
mysql> DROP FUNCTION hello; Query OK, 0 rows affected (0.01 sec) mysql> mysql> DROP FUNCTION hello; ERROR 1305 (42000): FUNCTION yinzhengjie.hello does not exist mysql> mysql> mysql> DROP FUNCTION IF EXISTS hello; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> mysql>
5>.查看已经存在的存储过程或者函数
mysql> SELECT routine_name,routine_type FROM information_schema.routines WHERE routine_schema='course'; +--------------+--------------+ | ROUTINE_NAME | ROUTINE_TYPE | +--------------+--------------+ | hello | FUNCTION | | myfunc | FUNCTION | | demo | PROCEDURE | | myproc | PROCEDURE | +--------------+--------------+ 4 rows in set (0.01 sec) mysql> mysql>
二.标签语句
1>.标签语句注意事项
• 标签label可以加在begin...end语句以及loop, repeat和while语句
• 语句中通过iterate和leave来控制流程,iterate表示返回指定标签 位置,leave表示跳出标签
2>.案例展示
三.
四.
五.