- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这个问题出现在最新版本的MySQL中,所以我什至怀疑这可能是一个bug。
这里有两个表:
t1(id int), values (10),(2)
t2(id int), values (0),(null),(1)
执行:
select id from t1 where id > all (select id from t2);
返回结果集:
+------+
| id |
+------+
| 10 |
| 2 |
+------+
据我所知和页面http://dev.mysql.com/doc/refman/5.5/en/all-subqueries.html
该语句应该返回空结果!因为“where”中的每一次判断都会导致null,像这样:
select id > all (select id from t2) as c1 from t1;
返回:
+------+
| c1 |
+------+
| NULL |
| NULL |
+------+
实际上 select id from t1 where null;
什么都不返回!
最后,我尝试了这个:
explain extended select id from t1 where id > all (select id from t2);
show warnings;
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------+
| Note | 1003 | select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`))) |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------+
集合中的 1 行(0.00 秒)
我们可以看到,MySQL将原来的SQL优化成了这条,实际上是符合结果集的。
但我认为优化后的 SQL 不等于原始 SQL。
我错了吗?
最佳答案
更新:进一步分析和展开MySQL的> ALL
奇数实现。这个答案应该被认为是特定于 MySQL 的。因此,对于进一步的免责声明,此处关于 > ALL
的答案的解释不适用于其他 RDBMS(除非有其他 RDBMS 复制了 MySQL 实现)。从 > ALL
到 MAX
构造的内部转换,仅适用于 MySQL。
这个:
select id from t1 where id > all (select id from t2);
在语义上等同于:
select id from t1 where id > (select max(id) from t2);
由于 select max(id) from t2
返回 1,第二个查询具体化为:
select id from t1 where id > 1
这就是它从表 t1 返回 10
和 2
的原因
应用 NULL 规则的实例之一是当您使用 NOT IN
时,例如:
数据链接:
create table t1(id int);
insert into t1 values (10),(2);
create table t2(id int);
insert into t2 values (0),(null),(1);
查询:
select * from t1 where id not in (select id from t2);
-- above is evaluated same as the following query, so the rules about null applies,
-- hence the above and following query will not return any record.
select * from t1 where id <> 0 and id <> null and id <> 1;
-- to eliminate null side-effect, do this:
select * from t1 where id not in (select id from t2 where id is not null);
-- which is equivalent to this:
select * from t1 where id <> 0 and id <> 1;
最后两个查询返回 10
和 2
,而前两个查询返回空集
现场测试:http://www.sqlfiddle.com/#!2/82865/1
希望这些示例消除您对 NULL 规则的困惑。
关于
but I not think the optimized sql equals the original one .
优化后的sql是这样的:
select `test`.`t1`.`id` AS `id` from `test`.`t1` where <not>((`
test`.`t1`.`id` <= (select max(`test`.`t2`.`id`) from `test`.`t2`)))
这实际上等同于您的原始查询:select id from t1 where id > all (select id from t2);
构造 t1.field > all (select t2.field from t2)
只是一个语法糖:
t1.field > (select max(t2.field) from t2)
如果您将在 MySql 优化的 SQL 上应用 DeMorgan 定理:
not (t1.id <= (select max(t2.id) from t2))
相当于:
t1.id > (select max(t2.id) from t2)
这又相当于语法糖ALL
:
t1.id > ALL(select t2.id from t2)
关于mysql - 奇怪的 "all"在“哪里”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462716/
我有这种来自 Google map 自动完成的奇怪行为(或者我可能错过了某事)...想法?奇怪的: 您在输入中输入某物,例如“伦敦” 您按 [ENTER] 你按下 [CLEAR] 按钮 你点击进入'输
这段代码与《Learning Java》(Oracle Press Books)一书中的代码完全一样,但它不起作用。我不明白为什么它不起作用,它应该起作用。我用 OpenJDK 和 Sun JDK 7
示例 1 中究竟发生了什么?这是如何解析的? # doesnt split on , [String]::Join(",",("aaaaa,aaaaa,aaaaa,aaaaa,aaaaa,aa
我需要获得方程式系统的解决方案。为此,我使用函数sgesv_()。 一切都很好,它使我感到解决方案的正确结果。 但是我得到一个奇怪的警告。 警告:从不兼容的指针类型传递'sgesv_'的参数3 我正在
我目前在制作动画时遇到一个奇怪的问题: [UIView animateWithDuration:3 delay:0
alert('works'); $(window).load(function () { alert('does not work'); });
我的代码: public class MyTest { public class StringSorter implements Comparator { public
我正在学习 JavaScript。尝试理解代码, function foo (){ var a = b = {name: 'Hai'}; document.write(a.name +''
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这按预期工作: [dgorur@ted ~]$ env -i env [dgorur@ted ~]$ 这样做: [dgorur@ted ~]$ env -i which date which: no
struct BLA { int size_; int size()const{ return size_; } } int x; BLA b[ 2 ]; BLA * p = &b[
我有以下代码: #test img {vertical-align: middle;} div#test { border: 1px solid green; height: 150px; li
我想大多数使用过 C/C++ 的人都对预处理器的工作原理有一定的直觉(或多或少)。直到今天我也是这么认为的,但事实证明我的直觉是错误的。故事是这样的: 今天我尝试了一些东西,但我无法解释结果。首先考虑
我想为 TnSettings 做 mock,是的,如果通过以下方法编写代码,它就可以工作,问题是我们需要为每个案例编写 mock 代码,如果我们只 mock 一次然后执行多个案例,那么第二个将报告异常
我的项目中有以下两个结构 typedef volatile struct { unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over U
Regex rx = new Regex(@"[+-]"); string[] substrings = rx.Split(expression); expression = "-9a3dcb
我的两个应用程序遇到了一个奇怪的问题。这是设置: 两个 tomcat/java 应用程序,在同一个网络中运行,连接到相同的 MS-SQL-Server。一个应用程序,恰好按顺序位于 DMZ 中可从互联
我目前正在与 Android Api Lvl 8 上的 OnLongClickListener 作斗争。 拿这段代码: this.webView.setOnLongClickListener(new
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
只是遇到了奇怪的事情。我有以下代码: -(void)ImageDownloadCompleat { [self performSelectorOnMainThread:@selector(up
我是一名优秀的程序员,十分优秀!