dingsir的个人博客分享 http://blog.sciencenet.cn/u/dingsir

博文

MySQL用法几则(自用)

已有 949 次阅读 2021-6-3 12:40 |个人分类:软件杂谈|系统分类:教学心得

  1.  按某字段中的部分数字来排序.

    配方名称格式是ZP001,ZP123这样的格式,如何将检索结果按配方名称中ZP后面的数字从小到大(或相反)的顺序排列?

select `配方名称`, `LIPF6` from Maindb where (`配方名称` REGEXP "ZP\\d+") 
ORDER BY cast(substring(`配方名称`,3,3) as UNSIGNED) desc

where子句限定返回的结果是ZP+数字这样的格式,正则表达式的反斜杠要用两根表示.(一根是正则引擎用,一根被MySQL消耗了).

Order by子句后面的是灵魂,先用substring函数(与MID用法相同)提取字串,这样得到的是字符串,如果排序还是按字母排的,如111在20之前. 必须将它转化成数字,所以外面再套一个CAST函数将其转化为无符号整型,这样就可以比较了. 注意as写在括号内.

用法见MySQL的官方说明.   

https://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html

https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html


2. REGEXP类函数

有意思的是,在MySQL中,REGEXP或RLIKE 是函数REGEXP_Like()的同义词.

Regexp_like函数除了第1参数是字串,第2参数是正则模式外,还可以设置第三个参数,类型是字串,如i表示大小写不敏感(此为函数的默认模式), c表示大小写敏感,m表示匹配多行,n允许 号匹配终止符而不是行末.如果第三参数中有冲突的选项,以最右边的为准. 

MySQL中其它涉及正则表达式的函数还有: REGEXP_Instr, REGEXP_Replace, REGEXP_substring.

今天才发现,原来SQLite也支持REGEXP操作符的.

 见https://www.sqlite.org/lang_expr.html. 所以上面第1则在SQLITE数据库环境下也可以运行,不过转义的反斜杠用一根就行了.


3. 流程控制结构.

举例来说比较容易懂

select case  "B" when "a" then "Apple"  when "b" then "Bed"  else "Nothing" end;

返回结果为 Bed.

除了上面的Case..(when..then...)+..else..end结构外,还有一些可用的判断函数if, ifnull, nullif

比如

 SELECT IF(1<2,'yes','no');

返回结果yes. 这个用法与Excel里面的函数一样. 前面是条件真的结果,后面是条件假的结果.


IFNULL(expr1,expr2) 如果 expr1 非空, 则 IFNULL() 返回 expr1; 否则返回 expr2.

NULLIF(expr1,expr2) 如果 expr1 = expr2 则返回NULL, 否则返回expr1. NULLIF 与以下语句效果相同.

 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.



http://blog.sciencenet.cn/blog-1213210-1289527.html

上一篇:Perl处理SQLite数据库示例
下一篇:用VBA调用PERL模块来解析配方的尝试

0

评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-10-22 23:16

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部