小白学习mysql之函数
## 导语 曾经我以为,学会了select、update、insert和delete之后,我就学会了数据库~,要不是到公司看到SQL里充满了密密麻麻的的各种函数,我差点就信了~,当初的自己是多么的天真,o(╯□╰)o 现在的数据库功能之强大,使得很多的业务逻辑转移到了数据库上,更多的事务和存储过程出现在系统中,因此,拼接字符串成为了当代程序员必备的技能,要想练就拼接千百行的SQL,语句,你不能不熟练掌握以下函数. ### CONCAT()
可谓是,拼串圈函数的一哥,有了他,便可以实现两个乃至多个语句的拼接。 ```
mysql> select concat('ma yun', ' is cloud lao wang','!');
+--------------------------------------------+
| concat('ma yun', ' is cloud lao wang','!') |
+--------------------------------------------+
| ma yun is cloud lao wang! |
+--------------------------------------------+
```
特别注意,每个语句的连接处是否需要空格,而且如果里面的每个语句都为空的话,结果为null。
### CONCAT_WS()
和一楼是兄弟,使用方式CONCAT_WS(separator,str1,str2,...),其中第一个为分隔符,为后面的每两个字符串之间自动添加该分隔符。有很多时候拼写的sql语句条件非常多,就常用该函数,比如where后面要加5个 and 条件句,这个时候它便显身手了。
```
mysql> select concat_ws(' and ','c=5',IF(1>2,'d=3',null),'b=2');
+---------------------------------------------------+
| concat_ws(' and ','c=5',IF(1>2,'d=3',null),'b=2') |
+---------------------------------------------------+
| c=5 and b=2 |
+---------------------------------------------------+
```
技巧&注意点:第一个分隔符若为and之类的关键字,注意俩边要有空格。注意这个函数不能跳过空的字符串,只能跳过null,所以如果里面的字符串项中若有判断语句,一定不要把字符串赋值为空。
### ELT *ELT(N,str1,str2,str3,...)*
本函数是field函数的补充函数,根据N的值选择第N个字符串,比如性别在数据表中一般存为数字,如1代表男,2代表女,当我们需要根据性别代码显示性别的时候就可以使用ELT函数。
```
mysql> select elt(1,'男','女');
+------------------+
| elt(1,'男','女') |
+------------------+
| 男 |
+------------------+
```
本函数也可以用作sql语句的扩展,比如可以根据传入的参数进行选择排序方式等,这样就大大增强了一个sql语句的处理能力,类似程序设计语言中的case或者if语句等。
### IF *IF(expr1,expr2,expr3)*
IF函数大概很多人会觉得太过于简单,实时确实如此,然而越是简单的东西越容易忽视一些细节而犯错,前段时间就发现了一个用IF所导致的bug。大致情况如下:
```
mysql> select if('hello','1','2');
+---------------------+
| if('hello','1','2') |
+---------------------+
| 2 |
+---------------------+
```
当然事实上第一个参数大部分请情况是一个变量(假设为V_STR),很多时候写着写着便可能会用到上面的语句来判断V_STR是否为空,这完全是来自对简单问题的忽略以及有可能和IFNULL傻傻分不清楚。同时这里的确和编程语言中的IF ELSE是不一样的,上面的情况如果出现在编程语言中,则会返回'1';
### FIND_IN_SET
原型 FIND_IN_SET(str,strlist)
在数据库和数据文件进行交互时,往往存在编码和实际数据的转化,例如现在需要向一张学生表中导入一批学生数据,在性别这一列,excel中显示的为“男,女”,而数据库中存储的则是’1,2‘,现在需要把实际数据转化为编码数据就可以使用该函数。
```
mysql> select find_in_set('男','男,女');
+---------------------------+
| find_in_set('男','男,女') |
+---------------------------+
| 1 |
+---------------------------+
```
函数返回,第一个参数在第二个参数中出现的下标位置(从1开始)。如果不存在返回0;
当然例子举得比较简单,实际运用可能用于字符串中有很多种类别时,比如一个公司的职位等。另外,strlist是以','号隔开的,所以慎重考虑第一个参数中包含有','号,并检查函数能凑效。
### LOCATE
LOCATE,顾名思义是一个定位的函数,该函数返回第一个参数在第二个参数中的位置,比较简单。但在数据库中,LOCATE似乎承担了更多的责任,更多的时候,它总在’试探‘某些条件是否成立,根据试探结果进行sql语句的分类拼接。
```
mysql> select if(locate(',','1,2,3'),'你们好','你好');
+-----------------------------------------+
| if(locate(',','1,2,3'),'你们好','你好') |
+-----------------------------------------+
| 你们好 |
+-----------------------------------------+
```
上面的例子中假设’1,2,3‘是一个学生id,所组成的字符串,那么根据locate就能判断是否是一个学生还是多个学生,同时locate还能根据where条件句后是否包含某个关联字表的字段进行选择性关联该表。locate给sql语句的拼接带来了很多的便捷性。
### QUOTE
最后一个但绝对是最重要的一个,有关安全带问题永远都是最重要的,当程序中有用户输入数据的话,一定要用本函数来进行处理,防止基本的sql注入问题。
```
mysql> select concat('where id = ','5411 or 1=1'),concat('where id = ',quote('5411 or 1=1'));
+-------------------------------------+--------------------------------------------+
| concat('where id = ','5411 or 1=1') | concat('where id = ',quote('5411 or 1=1')) |
+-------------------------------------+--------------------------------------------+
| where id = 5411 or 1=1 | where id = '5411 or 1=1' |
+-------------------------------------+--------------------------------------------+
```
上例那最基本的sql注入作为演示,如果在一个软件的用户界面是输入学生的ID,这样用户输入’5411 or 1=1‘的时候,全部学生的信息就出来啦!这时如果经过quote函数进行处理,那么就会什么也搜不到,保证了数据的安全,同时quote也可以正确的处理转义问题。
## 总结 mysql数据库提供的这些功能强大的函数,虽然没有编程语言函数那般强大,但只要动动脑筋,还是基本上可以满足几乎所有你想实现的。而且,讲这些函数和基本的业务处理结合起来,就会发现每一个函数的强大。
小白学习mysql之函数的更多相关文章
- 小白学习mysql之索引初步
导语 索引在数据库中的地位是及其的重要,同时要想完全的掌握索引并不是一件容易的事,需要对数据的查询原理以及计算机操作系统有深刻的认识,当然相关的算法和数据结构也是必须的.因此,这篇文章感到了一些压力, ...
- 小白学习mysql之优化基础(EXPLAIN的连接类型)
## 导语很多情况下,有很多人用各种select语句查询到了他们想要的数据后,往往便以为工作圆满结束了.这些事情往往发生在一些学生亦或刚入职场但之前又没有很好数据库基础的小白身上,但所谓闻道有先后,只 ...
- 小白学习mysql之存储过程的优劣分析以及接入控制
存储过程的优劣 存储过程是一组实现特定功能的SQL语句集合,存储过程一经编译便存储在了服务器上,可以通过调用存储过程的名字以及传入相应的参数来使用存储过程.要高层次的掌握存储过程,不能觉得依葫芦画瓢, ...
- 小白学习mysql 之 innodb locks
Innodb 锁类型: Shared and Exclusive Locks Intention Locks Record Locks Gap Locks Next-Key Locks Insert ...
- MySQL replace函数替换字符串语句的用法(mysql字符串替换)
MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪. 最近在研究CMS,在数据转换的时候需要用 ...
- 教您如何使用MySQL group_concat函数
MySQL group_concat函数是典型的字符串连接函数,下面就为您介绍MySQL group_concat的语法,希望对您学习MySQL group_concat函数有所帮助. MySQL g ...
- Python小白学习之函数装饰器
装饰器 2018-10-25 13:49:37 装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器. 一般函数操作 ...
- MySQL学习——操作自定义函数
MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...
- Python小白学习之路(十五)—【map()函数】【filter()函数】【reduce()函数】
一.map()函数 map()是 Python 内置的高阶函数 有两个参数,第一个是接收一个函数 f(匿名函数或者自定义函数都OK啦):第二个参数是一个 可迭代对象 功能是通过把函数 f 依次作用在 ...
随机推荐
- HTML5不支持标签和新增标签
1.HTML5不支持或不赞成使用的标签 <acronym>——定义只取首字母的缩写,HTML5 不支持.使用<abbr>定义缩写代替,其中title 属性可用于在鼠标指针移动到 ...
- 将HTML特殊转义为实体字符的两种实现方式
前端开发工作中,经常需要将HTML的左右尖括号等转义成实体形式.我们不能把<,>,&等直接显示在最终看到的网页里.需要将其转义后才能在网页上显示. 转义字符(Escape Sequ ...
- c# 常用正则
"^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" ...
- cmd获取系统时间
查看时间格式: echo %date% echo %time% 通过%date:~5,2%来组合得出当前日期,组合的效果为yyyymmdd,date命令得到的日期格式默认为yyyy-mm-dd,通过% ...
- xml in hadoop ETL with pig summary
项目中需要把source为xml的文件通过flume放置到hdfs,然后通过MR导入到vertica中去,我之前做过简单的 尝试,是通过pig的piggybank的xmlloader然后Regex_e ...
- nopcommerce3.3简洁版
从nopcommerce里面分离出了基础框架,包括了用户.新闻.单页面.投票等模块,可以作为快速开发asp.net mvc项目的方案,有兴趣的朋友可以下载看看,由于时间仓促可能会有一些多余的文件没有清 ...
- 深搜+回溯 POJ 2676 Sudoku
POJ 2676 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17627 Accepted: 8538 ...
- web前端笔试题总结
em和rem的区别: 浏览器的默认字体高度是16px,1em=16px:大小可以自己设置调整,并且默认集成父级容器中文本的大小. rem是CSS3中新增的属性,默认情况下是文本尺寸的大小,不同的是它集 ...
- 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数
1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 01 ...
- HDU 4455 Substrings --递推+树状数组优化
题意: 给一串数字,给q个查询,每次查询长度为w的所有子串中不同的数字个数之和为多少. 解法:先预处理出D[i]为: 每个值的左边和它相等的值的位置和它的位置的距离,如果左边没有与他相同的,设为n+8 ...