MySQL与MariaDB功能对比 --- NULL在ALL/SOME中的处理的不同
来源:互联网 发布:淘宝直通车钱可以退吗 编辑:程序博客网 时间:2024/06/07 00:10
这个文章是我在自己的个人微信公众号“数据库开发者” 里面首发的,现在在我的博客里面再发一遍。欢迎您扫码关注“数据库开发者” 公众号。
在mysql5.5中,如果ALL/SOME中有NULL,那么这个NULL被忽略掉了,这是不符合SQL标准的,因为ALL/SOME 这种存在性谓词(predicate) 放到比较表达式中,则其中的每一个值都隐式地与这个比较表达式另一边的值在比较,而NULL与任何值比较的结果都是NULL。不只限于比较表达式,其他表达式也是同理。一般只要表达式中 ALL/SOME中有NULL,则那个表达式整体的值应该是NULL。在mysql-5.7和mariadb-10.1中,这个问题被修复了。
仔细看这个查询:
--------------------------- mysql 5.7 or mariadb-10.1.* --------------------------------------------------------
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1 (c1 INT, c2 CHAR(100));
INSERT INTO t1 VALUES (null,null);
INSERT INTO t1 VALUES (1,'');
INSERT INTO t1 VALUES (2,'abcde');
INSERT INTO t1 VALUES (100,'abcdefghij');
CREATE TABLE t2 (c1 INT);
INSERT INTO t2 VALUES (null);
INSERT INTO t2 VALUES (2);
INSERT INTO t2 VALUES (100);
SELECT c1 FROM t1 WHERE c1 > ALL (SELECT c1 FROM t2);
c1
SELECT c1 FROM t1 WHERE c1 >= ALL (SELECT c1 FROM t2);
c1
SELECT c1 FROM t1 WHERE c1 = ALL (SELECT c1 FROM t2);
c1
SELECT c1 FROM t1 WHERE c1 <= ALL (SELECT c1 FROM t2);
c1
----------------------------------------------- mysql 5.5 ---------------------------
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1 (c1 INT, c2 CHAR(100));
INSERT INTO t1 VALUES (null,null);
INSERT INTO t1 VALUES (1,'');
INSERT INTO t1 VALUES (2,'abcde');
INSERT INTO t1 VALUES (100,'abcdefghij');
CREATE TABLE t2 (c1 INT);
INSERT INTO t2 VALUES (null);
INSERT INTO t2 VALUES (2);
INSERT INTO t2 VALUES (100);
SELECT c1 FROM t1 WHERE c1 > ALL (SELECT c1 FROM t2);
c1
SELECT c1 FROM t1 WHERE c1 >= ALL (SELECT c1 FROM t2);
c1
100
SELECT c1 FROM t1 WHERE c1 = ALL (SELECT c1 FROM t2);
c1
SELECT c1 FROM t1 WHERE c1 <= ALL (SELECT c1 FROM t2);
c1
1
2
差异表现在和NULL的大小比较上。在mysql5.5中对于 10 >= ALL (NULL, 1, 10)或者1 <= ALL (NULL, 1, 10)的判断,
因为NULL不可比,所以直接跳过与NULL,即当作该NULL不存在。
而在mysql5.7和mariadb中,由于NULL属于未知值,在上述的对比中结果也应该是未知的,所以返回NULL
- MySQL与MariaDB功能对比 --- NULL在ALL/SOME中的处理的不同
- MySQL与MariaDB功能对比 ---子查询中order by的处理
- MariaDB与MySQL的主从复制效率对比
- MariaDB与MySQL对比 --- 对分布式事务的支持
- mysql与sqlite在处理并发问题时的不同
- MariaDB和MySQL数据库的综合对比
- mysql和mariadb主库drop表时从库的不同处理方式
- mysql之any,some all
- MySQL中 in, some, all等用法的讨论
- MYSQL知识点:any、some、all 关键字的用法
- mysql之any,in,some,all的区别
- mysql 中any,some,all,in的用法
- null 与space的不同
- mysql中的null与not null
- mysql 中的null与not null
- Mysql中的load语句对null的处理
- 不同数据库对null值的处理
- Windows与Linux下MySQL的null处理区别
- 常用滤波算法
- 栈及其应用
- MacOs + Virtualenv + ipython notebook下使用matplotlib
- Android逆向之旅---SO(ELF)文件格式详解
- javascript总结
- MySQL与MariaDB功能对比 --- NULL在ALL/SOME中的处理的不同
- 【51nod1105】【第K大的数】【二分答案】
- windows核心编程-线程的亲缘性
- VIEW
- Postgresql将查询结果导出到文件中
- Git常用命令
- Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)
- Duplicate entry '1106a210d0794c45a005ef034bc1b664' for key 'PRIMARY'
- 深度学习(DL):卷积神经网络(CNN):从原理到实现