SQL语法基础之高级应用
SQL语法基础之高级应用
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.存储过程与函数
1>.CREATE PROCEDURE 用来创建存储过程
- 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>
查看创建存储过程的帮助信息( mysql> ? CREATE PROCEDURE)
2>.CREATE FUNCTION用来创建函数
- 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>
查看创建函数的帮助信息(mysql> ? CREATE FUNCTION)
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>.案例展示
创建存储过程案例一:
- 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>
创建存储过程案例展示
- 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>
调用存储过程案例展示
创建存储过程案例二:
- [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>
创建存储过程案例展示二之环境准备(创建测试用户并授权)
- 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>
创建存储过程案例展示二
- 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>
调用存储过程案例展示二
- 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>
调用存储过程案例展示二(删除创建存储过程的用户时无法调用的解决方案,使用SQL SECURITY INVOKER)
创建函数案例一:
- 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> 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>
调用函数案例展示
创建函数案例二:
- 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 ;
创建函数案例展示二
- 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>
调用函数案例展示二
删除创建过程案例:
- 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>
mysql> DROP PROCEDURE IF EXISTS demo;
删除函数案例:
- 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>
mysql> DROP FUNCTION IF EXISTS hello;
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 |
- +--------------+--------------+
- rows in set (0.01 sec)
- mysql>
- mysql>
二.标签语句
1>.标签语句注意事项
- • 标签label可以加在begin...end语句以及loop, repeat和while语句
- • 语句中通过iterate和leave来控制流程,iterate表示返回指定标签 位置,leave表示跳出标签
2>.案例展示
三.
四.
五.
SQL语法基础之高级应用的更多相关文章
- SQL语法基础之DROP语句
SQL语法基础之DROP语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看DROP帮助信息 mysql> ? DROP Many help items for yo ...
- SQL语法基础之SELECT
SQL语法基础之SELECT 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SELECT查看帮助信息 1>.查看SELECT命令的帮助信息 mysql> ? SEL ...
- SQL语法基础之ALTER语句
SQL语法基础之ALTER语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看ALTER的帮助信息 mysql> ? ALTER Many help items fo ...
- SQL语法基础之INSEART语句
SQL语法基础之INSEART语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看帮助信息 1>.查看INSERT方法的帮助信息 mysql> ? INSERT ...
- SQL语法基础之UPDATE语句
SQL语法基础之UPDATE语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看UPDATE语句的帮助信息 1>.查看UPDATE的帮助信息 mysql> ? ...
- SQL语法基础之DELETE语句
SQL语法基础之DELETE语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看帮助信息 1>.查看DELETE的帮助信息 mysql> ? DELETE Na ...
- SQL语法基础之CREATE语句
SQL语法基础之CREATE语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看帮助信息 1>.使用“?”来查看MySQL命令的帮助信息 mysql> ? CR ...
- oracle PL/SQL语法基础
目录 数据类型 定义变量 PL/SQL控制结构 参考资料 Oracle10g数据类型总结 PL/SQL之基础篇 数据类型 学习总结 字符类型 char.nchar.varchar.nvarchar:有 ...
- 读书笔记(06) - 语法基础 - JavaScript高级程序设计
写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...
随机推荐
- BZOJ4128Matrix——hash+矩阵乘法+BSGS
题目描述 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) 输入 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * n的矩阵A.接下来一个n * n的矩阵B 输出 输出 ...
- mpvue——引入antv-F2图表
踩坑中~ 官方文档 https://www.yuque.com/antv/f2/intro 毕竟不像echarts接触过,所以还是先看看文档较好 github https://github.com/s ...
- Elasticsearch 聚合统计与SQL聚合统计语法对比(一)
Es相比关系型数据库在数据检索方面有着极大的优势,在处理亿级数据时,可谓是毫秒级响应,我们在使用Es时不仅仅进行简单的查询,有时候会做一些数据统计与分析,如果你以前是使用的关系型数据库,那么Es的数据 ...
- Treap树 笔记
预备知识:二叉查找树.堆(heap).平衡二叉树(AVL)的基本操作(左旋右旋) 定义: Treap.平衡二叉树.Tree+Heap.树堆. 每个结点两个键值(key.priority). 性质1. ...
- [WC2005]双面棋盘(并查集+分治)
题目描述 题解 唉,还是码力不行,写了一个多小时发现想错了又重构了一个多小时. 这道题意图很显然,动态维护联通块,有一个经典做法就是用LCT维护按照删除时间维护的最大生成树. 网上还有一种神奇的做法, ...
- 【mysql】 mysql忘记密码
先关闭mysql服务 [root@localhost ~]# service mysql status Redirecting to /bin/systemctl status mysql.servi ...
- 微信支付退款(PHP后端)
应用场景 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上. 微信 ...
- Windows cmd命令
运行操作 CMD命令锦集 1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 ,是一个监测网络中DN ...
- Eureka
Consul vs. Eureka Eureka is a service discovery tool. The architecture is primarily client/server, w ...
- css border 三角形
当元素的宽高都为0时,只写border,就会发现形成的正方形有4个三角形组成. .triangle { width: 0px; height: 0px; border: 20px solid tran ...