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 select * from student where student_name like '张_'
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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容