欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL存储过程语法基础 博客分类: Database MySQLSQLGo工作 

程序员文章站 2024-02-22 17:32:40
...
存储过程语法基础

1,变量
DECLARE声明,SET赋值

变量类型:
INT, INTEGER
BIGINT
FLOAT
DOUBLE
DECIMAL(precision, scale), NUMERIC(precision, scale)
DATE
DATETIME
CHAR(length)
VARCHAR(length)
BLOB, TEXT
LONGBLOB, LONGTEXT


可以在DECLARE变量时用DEFAULT设置默认值,不设则为NULL

2,参数
参数分IN、OUT和INOUT类型

3,用户变量
以@开头的为用户变量,作用域为session,所以可以当作全局变量使用

4,注释
//为单行注释

/*
|
|  多行注释
|
*/


5,操作符
算术操作符
+
-
*
/     # 结果可能为小数
DIV   # 结果为整数
%

比较操作符
>
<
<=
>=
BETWEEN
NOT BETWEEN
IN
NOT IN
=
<>, !=             # 不等号
<=>                # Null safe equal (returns TRUE if both arguments are Null)
LIKE
REGEXP
IS NULL
IS NOT NULL

逻辑操作符
AND
OR
XOR

位操作符
|
&
<<
>>
~


6,内建函数
分为字符串函数、算术函数、日期和时间函数和其他函数

常用MySQL函数
ABS
CEILING
CONCAT
CURDATE
DATE_ADD
DATE_SUB
FORMAT
GREATEST
IF
IFNULL
INSERT
INSTR
ISNULL
LEAST
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MOD
NOW
POWER
RAND
REPEAT
REPLACE
ROUND
RPAD
RTRIM
SIGN
SQRT
STRCMP
SUBSTRING
UPPER
VERSION


7,数据类型
MySQL中所有的变量都为单元素,没有数组的概念。

String类型
CHAR:定长,不足的部分用空格,超出的部分截断,最大255字节
VARCHAR:变长,不足的部分变短,超出的部分截断,最大65532字节

ENUM类型

SET类型
SET与ENUm类似,但是可以有多个值
CREATE PROCEDURE sp_set(in_option SET('Yes', 'No', 'Maybe'))
BEGIN
  SELECT in_option;
END

--------------
CALL sp_set('Yes')
--------------

+-----------+
| in_option |
+-----------+
| Yes       |
+-----------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

--------------
CALL sp_set('Yes,No,Maybe')
--------------

+--------------+
| in_option    |
+--------------+
| Yes,No,Maybe |
+--------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

--------------
CALL sp_set('Yes,No,Go away')
--------------

ERROR 1265 (01000): Data truncated for column 'in_option' at row 1


Numeric类型

DATE和DATETIME类型
DATE用于存储日期,DATETIME用于存储日期和时间

TEXT和BLOB类型
TEXT可以存储64K,LONGTEXT可以存储4G
BLOB和LONGBLOB与之类似,但是它们还可以存储二进制数据

8,sql_mode

'STRICT_TRANS_TABLES'(默认值): 对transactional的table做严格数据类型限制
'STRICT_ALL_TABLES': 对所有table都做严格数据类型限制

在strict mode下,如果出现Data truncate错误(如将String赋值给Integer)会raise error,而在no strict mode下则会出现不可预料的行为(如将String赋值给Integer时值变为0)并且只能在“show warnings;”时看到。
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
| Warning | 1265 | Data truncated for column 'c' at row 1 |
+---------+------+----------------------------------------+


存储过程应该一直在strict mode下工作,这样可以避免不可预期的错误。