如何理解 MySQL 中的 <=> 操作符?
- 问题 :
我在看以前的一个开发者的代码时看到
WHERE p.name <=> NULL
在这个查询语句中 <=>符号是什么意思啊?是不是和
=号是一样啊?还是一个语法错误啊?但是没有显示任何错误或者异常。我已经知道了mysql中的
<>
= !=等符号。
- 最佳回答 :
- 和=号的相同点
像常规的=运算符一样,两个值进行比较,结果是0(不等于)或1(相等);换句话说:’A'<=>’B'得0和’a'<=>’a‘得1。
2.和=号的不同点
和=运算符不同的是,NULL的值是没有任何意义的。所以=号运算符不能把NULL作为有效的结果。所以:请使用<=>,
'a' <=> NULL
得0
NULL<=> NULL
得出 1。和=运算符正相反,=号运算符规则是 'a'=NULL 结果是NULL 甚至NULL = NULL 结果也是NULL。顺便说一句,mysql上几乎所有的操作符和函数都是这样工作的,因为和NULL比较基本上都没有意义。
- 用处
当两个操作数中可能含有NULL时,你需要一个一致的语句。
... WHERE col_a <=> ? ...
这里的占位符有可能是常量也有可能是NULL,当使用<=>运算符时,你没有必要对查询语句做任何修改。
- 相关操作符
除了 <=> ,还有两个其他的操作符用来处理某个值和NULL做比较,也就是IS NULL
and IS NOT NULL。他们是ANSI标准中的一部分,因此也可以用在其他数据库中。而<=>只能在mysql中使用。
你可以把<=>当作mysql中的方言。
'a' IS NULL ==> 'a' <=> NULL 'a' IS NOT NULL ==> NOT('a' <=> NULL)
据此,你可以把这个查询语句段改的更具移植性一点:
WHERE p.name IS NULL
举一个存储过程的示例:
BEGIN DECLARE v_result INT DEFAULT 0;
DECLARE v_password VARCHAR(64) DEFAULT NULL;
DECLARE v_createtime TIMESTAMP DEFAULT NULL;
DECLARE v_status INT DEFAULT NULL;
DECLARE v_gamename VARCHAR(32) DEFAULT NULL;
DECLARE v_faceid INT DEFAULT 0;
DECLARE v_faceurl VARCHAR(260) DEFAULT '';
DECLARE v_idno VARCHAR(32) DEFAULT NULL;
DECLARE v_age INT DEFAULT 0;
DECLARE v_anti_indulge INT DEFAULT 1; IF NOT(p_userid <=> NULL) AND NOT(p_passwd <=> NULL) THEN SELECT
`password`, `createtime`, `status`
INTO
v_password, v_createtime, v_status
FROM
`tbl_user`
WHERE
`id` = p_userid; IF v_password <=> NULL OR LOWER(v_password) != LOWER(p_passwd) THEN
SET v_result = -1;
SET v_createtime = NULL;
SET v_status = NULL;
SET p_userid = NULL;
END IF;
#get gamename
SELECT user_gamename INTO v_gamename FROM tbl_user_gamename WHERE user_id = p_userid LIMIT 1;
#get gameface
SELECT IFNULL(face_id,0),IFNULL(faceurl,'') INTO v_faceid,v_faceurl FROM tbl_user_gameface WHERE user_id = p_userid LIMIT 1;
#get age
SELECT id_number INTO v_idno FROM tbl_userinfo WHERE user_id = p_userid LIMIT 1;
IF NOT(v_idno <=> NULL) THEN
## 通过身份证获取用户年龄
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(RIGHT(LEFT(v_idno, 14), 8))), '%Y') + 0 AS age INTO v_age ;
IF v_age >= 18 THEN
SET v_anti_indulge = 0;
END IF;
END IF;
ELSE SET v_result = -1;
SET v_createtime = NULL;
SET v_status = NULL;
SET p_userid = NULL; END IF; SELECT v_result AS `Result`, p_userid AS `userid`, v_createtime AS `createtime`, v_status AS `status`, v_gamename AS `gamename`,v_faceid AS `faceid`,v_faceurl AS `faceurl`, v_anti_indulge AS `anti_indulge`; END
存储过程的参数是:IN `p_userid` VARCHAR(64), IN `p_passwd` VARCHAR(64)
如何理解 MySQL 中的 <=> 操作符?的更多相关文章
- MySql 中的<=>操作符
今天在学习数据库的索引优化时,关于memory存储引擎的的hash索引时,看到了操作符<=> ,这个操作符还是第一次见到,于是上网查了一下.我想大家应该知道 = != <> ...
- 正确理解MySQL中的where和having的区别
原文:https://blog.csdn.net/yexudengzhidao/article/details/54924471 以前在学校里学习过SQLserver数据库,发现学习的都是皮毛,今天以 ...
- 如何理解MySQL中auto_increment?
1.auto_increment用于主键自动增长.比如从1开始增长,当把第一条数据删除,再插入第二条数据时,主键值为2,不是1.
- 深入理解MySQL中的Redo、Undo、MVCC
http://edu.csdn.net/course/detail/3495 http://edu.csdn.net/courses/o317_a3/云计算大数据
- mysql中的几种日志了解
前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log) 2:回滚日志(undo log) 3:二进制日志(binlog) 4:错误日志(errorlog) 5:慢查询日志(slo ...
- MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结
MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...
- 深入理解 MySQL ——锁、事务与并发控制
本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...
- [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制
深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发 mysql 639 次阅读 ...
- [转帖]深入理解 MySQL—锁、事务与并发控制
深入理解 MySQL—锁.事务与并发控制 http://www.itpub.net/2019/04/28/1723/ 跟oracle也类似 其实所有的数据库都有相同的机制.. 学习了机制才能够更好的工 ...
随机推荐
- golang的并发
Golang的并发涉及二个概念: goroutine channel goroutine由关键字go创建. channel由关键字chan定义 channel的理解稍难点, 最简单地, 你把它当成Un ...
- 浅谈.NET中闭包
什么是闭包 闭包可以从而三个维度来说明.在编程语言领域,闭包是指由函数以及与函数相关的上下文环境组合而成的实体.通过闭包,函数与其上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程 ...
- perl DBI 学习总结(转载)
perl DBI 学习总结 源文地址:http://blog.csdn.net/like_zhz/article/details/5441946 DBI和DBD的不同关系模型: ########### ...
- cocos中常用到的单例模式
单例:即只有一个类对象,且提供全局的访问权限 特点: 1.构造函数私有 2.私有的静态成员指针,标识是否已产生了单例实例 3.提供一个getInstance()方法来获取单例对象 下面已打飞机中的子弹 ...
- Sprint计划会议1
会议时间:4.15.晚9点 会议地点:学一食堂2楼 会议进程 • 首先我们讨论了实验第一个Sprint1要实现的功能(用户登录及信息录入).• 之后对任务进行了认领.• 最后每个人对自己的任务进行 ...
- 再论 ASP.NET 中获取客户端IP地址
说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方.IP在不同系统中,应用相当广泛,常见的日志记录.广告分 ...
- Python中的List,Tuple,Dic,Set
Python中的List,Tuple,Dic,Set List定义 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推 ...
- Linux常用命令查看日志
cattail -f日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日 ...
- OpenFramework中视频或者图片进行中心旋转、平移、放大、缩小、矫正(本例以视频为准,只给出主要代码)
/********** update mesh部分***********/ for(int i=0;i<4;i++) { mesh[i].clear(); //重要,不加的话,移动视频的四个角 ...
- 如何ping通两台计算机
如何ping通两台计算机 因为ping是基于IP协议的,所以,先要保证两台计算机在同一个子网中,这里涉及到vlan和子网的概念 若两台主机不在同一个子网中则无法ping通 若两台主机在同一个子网中却p ...