MySQL核心技术与最佳实践(第6章 Mysql 编程基础)

hex()函数可将字符串货数字转换成十六进制格式字符串
select hex('MySQL');
变量分为系统变量和用户自定义变量,系统变量以@@开头
用户定义变量以@开头,局部变量不以@开头
用户会话变量又两种定义与赋值方式
方式一:
set @user_variable1=expression1 [,@user_variable=expression2,……]
方式二:
格式1: select @user_variable1:=expression1 [……]
格式2: select expression1 into @user_variable1,[……]

局部变量
declare 命令专门用于定义局部变量及对应数据类型。局部变量必须在存储程序中(例如函数,触发器,存储过程及事件)并且局部变量的作用范围仅局限于存储程序中,脱离存储程序,局部变量没有丝毫意义。局部变量主要用于以下3中场合
1:定义在存储程序begin-end语句块之间。
2:局部变量作为存储过程或函数参数使用时,此时虽然不需要declare定义,但需要指定参数的数据类型。
3:局部变量可以用在存储过程的SQL语句中。数据检索时,如果select语句的结果集是单个值,则可以将select语句的返回结果赋予局部变量。局部变量也可以直接嵌入到select,
insert, update以及delete语句的条件表达式中。

局部变量与用户会话变量的区别
1:用户会话变量以@开头,局部变量没有
2:局部变量用declare命令定义(存储过程参数,函数参数除外),定义时必须指定局部变量数据类型。局部变量定义后才能使用set或select语句为其赋值。
用户会话变量使用set命令或select语句定义并进行赋值,定义用户会话变量时无需指定数据类型,用户会话变量时弱类型。
3:用户会话变量作用范围大于局部变量。用户会话变量在本次会话期间一直有效,直至关闭服务连接。 局部变量作用于存储程序或begin-end块。
4:如果局部变量嵌入到SQL语句中,由于局部变量前没有@符号,这就要求局部变量不能与表字段同名,否则将出现无法预期的结果。

算术运算符

  • , - ,* ,/, % ,以及 div (求商)

比较运算符

<

=
<=
<>, !=
<=> 相等或都等于空
Is null 是否为NULL
between and
in
like
regexp

逻辑运算符
not 或 !
and 或 &&
or 或 ||
xor 逻辑异或

位运算符
& 按位与
| 安位或
^ 按位异或
~ 按位取反

位右移
<< 位左移

重置命令结束标记
delimiter 结束标记
如:
delimiter
delimiter ;
select * from student where student_name like '张_';

自定义函数:
create function 函数名(参数1,参数2,……) returns 返回值数据类型
[函数选项]
begin
函数体;
return 语句;
end;
建议在自定义函数名统一添加前缀''fn_''或者后缀“_fn”

查看函数定义
show function status;
show function status like模式;
查看指定数据库中的函数
select name from mysql.proc where db = 'choose' and type = 'function';
show create function函数名 查看函数名详细信息
如: show create function get_name_fn \G;
函数的信息都保存在information_schema数据库中的routines表中
select * from information_shema.routines where routine_name = '函数名';

由于函数仅仅保存函数体,函数体实际上是MySQL表达式,不保存任何数据,当函数体需要修改时,使用drop function 先删除,再新增,存储过程,触发器,视图,修改同样适用。

If 条件表达式1 then 语句块1
[elseif 条件表达式2 then 语句块2]
[else 语句块n]
end if;
说明: end if 后必须以;号结束。

case 表达式
when value1 then 语句块1;
when value2 then 语句块2;
……
else 语句块n;
end case;
说明:end case后必须以“;”号结束。

mysql提供3中循环语句,分别是while , repeat,以及loop
[循环标签:] while 条件表达式 do
循环体;
end while[循环标签];

leave语句用于跳出当前循环语句
leave 循环标签; 必须以“;”号结束

iterate语句用于跳出本次循环,继续进行下次循环。
iterate 循环标签; 同样必须以“;”结束。

当条件表达的值为false时,反复执行循环,直到条件表达式值为true。
[循环标签:] repeat
循环体;
until 条件表达式
end repeat[循环标签]; 必须以“;”结束

loop循环语句本身没有停止循环的语句,因此loop通常借助leave语句跳出loop循环。
[循环标签:] loop
循环体;
if条件表达式then
leave[循环标签];
end if;
end loop;

系统函数
1:数学函数
pi();
radinans(x);
degrees(x);
sqrt() 平方根
pow(x,y);幂运算
exp(x) 计算e的x次方
log(x) x的自然对数
log10(x) 以10为底的自然对数
round(x) 离x最近的整数
round(x,y) 计算离x最近的小数,小数点后保留y位
fromat(x,y) 进行四舍五入,保留小数点后y位
truncate(x,y) 舍弃多余的小数位,不进行四舍五入。
floor(x) 小于等于x的最大整数
ceil(x) 大于等于x的最小整数
rand() 随机函数
bin(x),oct(x), hex(x) 二进制,八进制,十六进制
ascii(x) 返回字符x的ASCII码
char(c1,c2,c3,……) 将c1,c2等ASCII码转换为字符

字符串基本函数
charset(x) 返回x的字符集
collation(x) 返回x的字符序
convert(x using charset) 返回x的charset字符集数据
char_length(x) 获取字符串x的长度, 受MySQL字符集设置影响。
length(x)获取字符x占用的字节数

不可以逆加密函数
password(x) 对x进行加密,返回41位字符串;
md5(x) 对x进行加密,返回32位字符串;

加密--解密函数
encode(x,key);
decode(password,key);
aes_encrypt(x,key);
aes_decrypt(x,key);

concat(x1,x2,……); 字符串连接函数
concat_ws(x,x1,x2,……) 使用x将字符串x1,x2……连接起来

MySQL命令模式set sql_mode='ansi'; 可以使用管道符 “||” 连接字符串
ltrim(), rtrim() ,trim() 除去空格
trim([leading | both | trailing]) x1 from x2) 从x2的前,或前后,或后去掉字符x1
upper(x),ucase(x) 字母变成大写
lower(x), lcase(x) 字母变成小写
lpad(x1,len,x2)将字符串x2填充到x1的开始处,使x1长度达到len
rpad(x1,len,x2) 填到结尾处

substring(x,start,length)
mid(x,start,length) 从字符串x的start开始获取length长度字符串。

locate(x1,x2); position(x1 in x2) ; instr(x2,x1)
都是用字符串x2中获取字符串x1的开始位置。

字符串替换函数
Insert(x1,start,length,x2) 将字符串x1从start到length替换成x2
Replace(x1,x2,x3) 将x1中的x2替换成x3

取出指定分隔符前或后子字符串的函数
substring_index(x,delimiter,count)取出字符串x中出现count次delimiter分隔符的子字符串,count>0表示从左边,count<0表示从右边。

复制字符串
repeat(x,n)将字符串x复制n次
space(n) 复制空格n次

strcmp(x1,x2)比较字符串
show variables like 'collation%';

reverse(x)返回字符x的逆序
类型转换函数 convert(x,type) 与 cast(x as type)
convert(x using charset)
十六进制字符串转十六进制数
unhex(x)

条件控制函数
if(condition,v1,v2) condition条件为真返回v1,否则返回v2
ifnull(v1,v2) 如果v1为null返回v2值,否则返回v1值
系统函数
version();
connection_id() 获取当前服务器连接ID,与@@pseudo_thread_id系统变量值相同
database(), schema();
用户信息
user(),system_user(),current_user(),session_user()
获取当前日期
curdate(),
current_date(),
获取当前时间
curtime(),
current_time(),
获取当前日期时间
now(),
current_timestamp(),
localtime();
UNIX_TIMESTAMP() 获取mysql服务器当前unix时间戳
utc_date(), utc_time() 获取UTC日期,时间,UTC时间即世界标准时间
year(x)
month(x)
dayofmonth(x)
hour(x)
minute(x)
second(x)
microsecond(x)
monthname(x) 获取日期的x的月份信息
dayname(x) 、weekday(x) , dayofweek(x)
quarter(x) x在本年是第几季度
week(x) , weekofyear(x) 是第几个星期
time_to_sec(x) 时间x在当天的秒数
sec_to_time(x) 秒数在当天的时间。
日期时间间隔函数
to_day(x) 计算日期x 距离0000年1月1日的天数
from_days(x) 计算从0000年1月1日开始n天后的日期
datediff(x1,x2) x1与x2之间的相隔天数
adddate(d,n)
subdate(d,n)
addtime(t,n) t上加上n秒
subtime(t,n) t上减去n秒
date_add(date,interval 间隔类型);
time_fromat(t,f) 时间格式化函数
date_format(d,f)日期格式化函数
last_insert_id()函数 返回会话最后一次insert或update语句。
IP地址与整数相互转换
inet_aton(ip) ip地址转换为整数
inet_ntoa(n) 整数转换为IP地址
基础值函数
benchmark(n,expression) 将表达式expression重复执行n次,返回结果为0.
select benchmark(10000000,md5('test'));
uuid()函数 生成128位
uuid码由5个段构成,其中前3段与服务器主机时间有关,
第4段是一个随机数
第5段通过网卡MAC地址转换得到。
在InnoDB存储引擎中采用聚簇索引,会对插入的记录按照主键进行排序,而UUID系统随机生成,虽然全球唯一,但本身无序,因此在InnoDB存储引擎中使用UUID作为主键,可能会造成巨大的I\O开销
Isnull(value) 判断value值是否为NULL如果为NULL返回1,否则返回0

你可能感兴趣的:(MySQL核心技术与最佳实践(第6章 Mysql 编程基础))