‘a’ or ‘b’/ ‘a’ and ‘b’为什么符合语法,具体做了什么操作,实践中有什么用

MySql 码拜 6年前 (2016-02-07) 425次浏览
看到一个帖子里出的错误是把col in (“a”, “b”)写成”a” or “b”
http://bbs.csdn.net/topics/391939390
那么问题来了,mysql在parse中允许对字符串做这样的语法,是什么目的,为什么符合语法,具体做了什么操作,实践中有什么用呢?百思不得其JIE

MariaDB > select "a" or "b";
+--+
| "a" or "b" |
+--+
|          0 |
+--+
1 row in set, 4 warnings (0.00 sec)
MariaDB > select "a" and "b";
+--+
| "a" and "b" |
+--+
|           0 |
+--+
1 row in set, 3 warnings (0.00 sec)
解决方案

20

引用 4 楼 gikod 的回复:
Quote: 引用 3 楼 yupeigu 的回复:
Quote: 引用 2 楼 gikod 的回复:
Quote: 引用 1 楼 yupeigu 的回复:

本人刚才在sql server上试了一下这个语法是会报错的。
所以,这个语法应该是mysql特有的,至于这个语句这么写,能否有实际的意义,这个好不好说,不了解mysql的开发者,是出于什么样的需要,才实现了这种语法。
不过,从实际开发的过程中,基本上不需要用这种语法,实际也从来没有用到过'a' or 'b'/ 'a' and 'b'为什么符合语法,具体做了什么操作,实践中有什么用

是吧,本人用Oracle比较多,也不能这么用,真是惊叹MySQL的神奇。
所以问问精通MySQL的大家,这个语法是做什么用的,最好有精通MySQL源码的大咖聊聊一下parser这么做了之后ast执行时做了什么。

说到这里,还有一个 mysql特有的语法:
select *
from xx
group by id
这个语法也能运行。这个语句就很有用处

好神奇的语法,'a' or 'b'/ 'a' and 'b'为什么符合语法,具体做了什么操作,实践中有什么用
别卖关子,说说能用来做什么?

MariaDB > select * from t;
+--+--+--+
| id | val  | val2 |
+--+--+--+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+--+--+--+
10 rows in set (0.00 sec)
MariaDB > select * from t group by id;
+--+--+--+
| id | val  | val2 |
+--+--+--+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+--+--+--+
10 rows in set (0.00 sec)
MariaDB > select * from t group by val;
+--+--+--+
| id | val  | val2 |
+--+--+--+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
+--+--+--+
5 rows in set (0.00 sec)
MariaDB > select * from t group by val2;
+--+--+--+
| id | val  | val2 |
+--+--+--+
|  1 |    1 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+--+--+--+
6 rows in set (0.00 sec)

一般用来求某个数据中,最新的数据,例如张三 ,在1号上传了1条数据,3号上传了一条数据,
通过这个语法,可以比较容易的求出张三在3号上传的数据


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明‘a’ or ‘b’/ ‘a’ and ‘b’为什么符合语法,具体做了什么操作,实践中有什么用
喜欢 (0)
[1034331897@qq.com]
分享 (0)