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.7mariadb-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.7mariadb中,由于NULL属于未知值,在上述的对比中结果也应该是未知的,所以返回NULL

 

0 0