一、变量和基本数据类型
1、变量
-
用户自定义变量
-
局部变量
声明: 用户自定义变量的声明方法形如:@var_name,其中变量名称由字母、数字、“.”、“_”和“$”组成。当然,在以字符串或者标识符引用时也可以包含其他字符(例如:@'my-var',@"my-var",或者@
my-var
)变量的赋值方式:一种是直接用"="号,另一种是用":="号。
1 )使用set命令对用户变量进行赋值时,两种方式都可以使用.
2 )当使用select语句对用户变量进行赋值时,只能使用:=方式,因为在select语句中,=号被看作是比较操作符。定义:在sql语句块中有效的变量,例如在函数和存储过程的begin和end中的语句块。
use `DataBase_name`; set FOREIGN_KEY_CHECKS = 0;(注:取消外键约束) drop procedure if exists countLines;(注:如果存在存储过程 countLines,就删除它。) create procedure countLines(in a int,in b int) begin declare c int default 0; set c = a + b; select c as c; end;
-
会话变量
- 定义:会话变量即为服务器为每个客户端连接维护的变量。在客户端连接时,使用相应全局变量的当前值对客户端的回话变量进行初始化。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量。其作用域与生命周期均限于当前客户端连接。(注:用户自定义的会话变量是存在进程内存中的)
- 声明: 用户自定义会话变量的声明方法形如:@var_name,其中变量名称由字母、数字、“.”、“_”和“$”组成。当然,在以字符串或者标识符引用时也可以包含其他字符(例如:@'my-var',@"my-var",或者
- 变量的赋值:
set session var_name = value; set @@session.var_name = value; set var_name = value;
- 变量的查询
select @@var_name; select @@session.var_name; show session variables like "%var%"
-
系统变量
-
会话变量
-
全局变量
- 变量的赋值:
set session var_name = value; set @@session.var_name = value; set var_name = value;
- 变量的查询
select @@var_name; select @@session.var_name; show session variables like "%var%"
- 变量的赋值:
2、基本数据类型
- 整数
- int
- long
- 浮点数
- float
- double
- 字符串
- varchar
- 文本类型
- text
- 二进制流类型
- varbinary
- blog
- 时间类型
- time
- date
二、流程控制语句
-
if语句
1、形式:if condition then ... [else condition then] ... [else] ... end if
2、example:
drop procedure if exists test_if; delimiter // --(注:重新定义分界符为//,默认的为;) create procedure test_if(in x int) begin if x=1 then select 'OK'; elseif x=0 then select 'No'; else select 'good'; end if; end // delimiter ; call test_if(0);
-
case语句
1、形式:case value when value then ... [when value then...] [else...] end case
2、example:
drop procedure if exists test_case; delimiter // --(注:重新定义分界符为//,默认的为;) create procedure test_case(in x int) begin case x when 1 then select 'OK'; when 0 then select 'No'; else select 'good'; end case; end // delimiter ; call test_case(0);
-
while循环
1、形式:while condition do ... end while
2、example:
drop procedure if exists test_while; delimiter // create procedure test_while(out sum int) begin declare i int default 1; declare s int default 0; while i<=10 do set s = s+i; set i = i+1; end while; set sum = s; end; // delimiter ; call test_while(@s); select @s;
-
loop循环
1、形式:
loop ... end loop
2、example:
drop procedure if exists test_loop; delimiter // create procedure test_loop(out sum int) begin declare i int default 1; declare s int default 0; loop_label:loop set s = s+i; set i = i+1; if i>10 then leave loop_label; end if; end loop; set sum = s; end; // delimiter ; call test_loop(@s); select @s;
-
repeat循环语句
1、形式:repeat ... until condition end repeat
2、example:
drop procedure if exists test_repeat; delimiter // create procedure test_repeat(out sum int) begin declare i int default 1; declare s int default 0; repeat set s = s+i; set i = i+1; until i>10 -- 此处不能有分号 end repeat; set sum = s; end; // delimiter ; call test_repeat(@s); select @s;
三、运算符
- 算数运算符
+、-、*、/、DIV(x1,x2)除法运算、%、MOD(x1,x2)求余运算。 - 比较运算符
=、<>或!=、>、>=、<、<=、IS NULL、IS NOT NULL、BETWEEN AND、 IN、 LIKE、REGEXP(注:正则表达式;格式:x1 regexp 正则表达式,判断x1是否与正则表达式匹配。)。 - 逻辑运算符
&&或and 、!或not 、||或or 、xor(注:异或。)。 - 位运算符
& 、| 、~ (注:按位取反)、^(注:按位异或) 、<< 、>>。 - 运算符的优先级
优先级从高到底:
0、()
1、!
2、~
3、^
4、*、/、DIV(x1,x2)除法运算、%、MOD(x1,x2)求余运算
5、+、-
6、<< 、>>
7、&
8、|
9、=、<>或!=、>、>=、<、<=、in、is null、like、regexp
10、BETWEEN and 、case 、when 、then 、else
11、not
12、&&或and
13、||或or 、xor(注:异或。)
14、:=(注:select变量赋值语句。)
三、表达式
- 赋值表达式
- "=":
set a = 3; declare a int default 0;
- ":=" :select变量赋值语句;
select a := 3*4;
- "=":
四、关键字
-
DCL
- create database database _name
- drop database database _name if exists database_name
- show databases (注:输出数据库所有表--包括系统表和用户表。)
- show variables like 'have%' (注:查询mysql支持的所有引擎。)
- create table table_name(
属性名 数据类型 [完整性约束条件],
属性名 数据类型 [完整性约束条件],
属性名 数据类型 [完整性约束条件]
); - delete table table_name
- describe table_name (注:查看表的基本定义。)
- show create table table_name (注:查看表的详细定义。)
- alter table old_table_name rename new_table_name(注:修改表名。)
- alter table table_name change old_column_name old_column_name 数据类型
- alter table table_name drop 属性名 (注:删除字段)
- alter table table_name engine = 存储引擎名
- use ·database_name· (注:确定到具体某一个数据库)
-
DML
- select : 用以输出结果,相当于java中的println()。
- from
- where
- delete
- insert into table_name(column1,column2) values(value1,value2)
- update table_name set .... where
- delete from table_name [where]
-
DCL
-
其他关键字
- having
- group by
- order by
- distinct
- with {cube|rollup}
- limit : 取出指定行的记录,并将记录结果返回。
- on
- join
- delimiter
- begin sqlStates end
五、函数、存储过程、触发器和定时器(既创建事件用以定期执行任务)
- 存储过程
- 定义:存储过程是一组sql语句的集合,经编译创建并保存到数据库中,用户可以指定储存过程名字并给定参数(需要时传递)。
- 创建存储过程
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name 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
[begin_label:] BEGIN
[statement_list]
……
END [end_label]
实例:
delimiter // #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
BEGIN
DELETE FROM MATCHES
WHERE playerno = p_playerno;
END//
- 存储过程体
- 定义:存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等;过程体格式:以begin开始,以end结束(可嵌套)。
(注:每个嵌套块及其中的每条语句,必须以分号结束,表示过程体结束的begin-end块(又叫做复合语句compound statement),则不需要分号。) - 例如:
- 定义:存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等;过程体格式:以begin开始,以end结束(可嵌套)。
BEGIN
BEGIN
BEGIN
declare a = 2;
declare b = 5 ;
select a= a+ b;
END
END
END
- 存储过程的参数:
存储过程可以有0个或多个参数,用于存储过程的定义。
3种参数类型:
IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)。
OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)。
INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。
- 函数
- 定义:函数是一组sql语句的集合,经编译创建并保存到数据库中,用户可以指定函数名字并给定参数(需要时传递),与存储过程不同的函数参数只能用in,不能用out后inout,且函数有返回值,只能是一个值。
- 创建存储过程
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN ] param_name 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
[begin_label:] BEGIN
[statement_list]
……
END [end_label]
- 触发器
- 定义:是由insert、update、delete事件触发某种特定操作,这种特定操作是sql语句块。
- 语法格式:
create trigger 触发器名 before | after 触发事件 on table_name for
each row
- 定时器
- 查看event是否开启
show variables like '%sche%';
创建事件 e_fw_shop_day
create event if not exists e_fw_shop_day -- 事件名称
on schedule every 1 DAY STARTS date_add(date(curdate() + 1),interval 0 hour) -- 每天凌晨执行
on completion preserve
do call fw_shop_day(); -- 需要执行的存储过程
-关闭事件任务
alter event e_fw_shop_day ON
COMPLETION PRESERVE DISABLE;
-开户事件任务
alter event e_fw_shop_day ON
COMPLETION PRESERVE ENABLE;