存储过程语法基础
1,变量
DECLARE声明,SET赋值
变量类型:
- INT, INTEGER
- BIGINT
- FLOAT
- DOUBLE
- DECIMAL(precision, scale), NUMERIC(precision, scale)
- DATE
- DATETIME
- CHAR(length)
- VARCHAR(length)
- BLOB, TEXT
- LONGBLOB, LONGTEXT
INT, INTEGERBIGINTFLOATDOUBLEDECIMAL(precision, scale), NUMERIC(precision, scale)DATEDATETIMECHAR(length)VARCHAR(length)BLOB, TEXTLONGBLOB, LONGTEXT
可以在DECLARE变量时用DEFAULT设置默认值,不设则为NULL
2,参数
参数分IN、OUT和INOUT类型
3,用户变量
以@开头的为用户变量,作用域为session,所以可以当作全局变量使用
4,注释
//为单行注释/*|| 多行注释|*/
5,操作符
算术操作符
- +
- -
- *
- / # 结果可能为小数
- DIV # 结果为整数
- %
+-*/ # 结果可能为小数DIV # 结果为整数%
比较操作符
- >
- <
- <=
- >=
- BETWEEN
- NOT BETWEEN
- IN
- NOT IN
- =
- <>, != # 不等号
- <=> # Null safe equal (returns TRUE if both arguments are Null)
- LIKE
- REGEXP
- IS NULL
- IS NOT NULL
><<=>=BETWEENNOT BETWEENINNOT IN=<>, != # 不等号<=> # Null safe equal (returns TRUE if both arguments are Null)LIKEREGEXPIS NULLIS NOT NULL
逻辑操作符
ANDORXOR
位操作符
|&<<>>~
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
ABSCEILINGCONCATCURDATEDATE_ADDDATE_SUBFORMATGREATESTIFIFNULLINSERTINSTRISNULLLEASTLEFTLENGTHLOCATELOWERLPADLTRIMMODNOWPOWERRANDREPEATREPLACEROUNDRPADRTRIMSIGNSQRTSTRCMPSUBSTRINGUPPERVERSION
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
CREATE PROCEDURE sp_set(in_option SET('Yes', 'No', 'Maybe'))BEGINSELECT 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 |
- +---------+------+----------------------------------------+