SQL中 OR 关键字优先级问题

今天群里哥们偶尔问道一个问题,顺便查查找到了答案,记录一下。

问题

问题大致如下:

SQL1

1
SELECT * FROM TABLE WHERE NAME='ZHANGSAN' OR 1=1 OR '1'='1' AND AGE=10;

SQL2

1
SELECT * FROM TABLE WHERE NAME='ZAHNGSAN' OR 1=1 AND AGE=10;

两条SQL,第一条返回全表结果集,第二条返回 NAME='ZHANGSAN' 或者 AGE=10 的结果集;问两条SQL为何会这样。

原因

以前一直没留意过,搜了下资料,大致原因如下:

在 SQL 中,OR 关键字的优先级会比 AND 关键字优先级要高,OR关键字会将条件切分成前后两部分,大致表现如下:

SQL1

1
SELECT * FROM TABLE WHERE (NAME='ZHANGSAN') OR ((1=1) OR ('1'='1' AND AGE=10));

所以在第一个 OR 分割后,后面又进行了二次分割;此时后面由于 ('1'='1') 始终为真,则后半部分一直返回为真,此时第一个 OR 分割整体也会返回为真,造成查出整个表的结果集;SQL2同理一样。


SQL中 OR 关键字优先级问题
https://mritd.com/2016/03/14/sql-or-keyword-priority/
作者
Kovacs
发布于
2016年3月14日
许可协议