SQL语句and 和 or 联用产生的坑

SQL语句and 和 or 联用产生的坑

最近在SQL学习过程中发现了一个很容易就让人误解的sql语句用法,在此跟大家分享一下
数据随便整了一个简单的表,供大家参考
CREATE TABLE shop
(
id INT AUTO_INCREMENT PRIMARY KEY,
supplier VARCHAR(20),
price VARCHAR(20),
detail VARCHAR(20)
)
INSERT INTO shop VALUES(‘1’,‘超市’,‘5.69’,‘手表’);
INSERT INTO shop VALUES(‘2’,‘商店’,‘9.98’,‘牛奶’);
INSERT INTO shop VALUES(‘3’,‘超市’,‘17’,‘盒饭’);
INSERT INTO shop VALUES(‘4’,‘商店’,‘20’,‘大米’);

select * from shop
如下图所示,搜索出了产地在超市、商店价格不一的商品
在这里插入图片描述
组合 AND 和 OR 带来了一个有趣的优先级问题。为了说明这个问题,下面的 SELECT 语句使用 AND 和 OR 操作符的组合建立了一个WHERE 子句:
SELECT *
FROM shop
WHERE supplier = ‘超市’
OR supplier= ‘商店’
AND price >= 10 ;

通过上面的sql语句你是否脑海中觉得查询出来的商品产地是超市以及商店下价格都大于10元的商品?
现在我们来看查询结果
在这里插入图片描述
很显然,查询出来的结果不如我们所想,这是为什么呢!
原因在于计算的次序,AND的优先级比OR高,所以sql语句执行时邮箱会对ADN两边的条件先操作,然后与条件结合
这是不是有点像我们小学学过的加法与乘法的运算啊!AND就像我们的乘法,OR就像我们的加法,把sql语句改成9+54这样是不是很好理解了*!很多程序的bug都是出在这种小细节上,所以对基础理解透彻到时候才能顺风顺水,上次就看见一篇博文就因为这个语句导致文章限制出现漏洞,差点把网站封掉了
好了,不说题外话了,既然知道原因那怎么让搜索结果如我们预期的那样呢?很简单,将9+5*4改成(9+5)*4,这样是不是就能得到我们预想的结果了呢?让我们来验证一下
select * from
shop
where (
supplier = ‘超市’
or supplier = ‘商店’
)
and price >= 10

在这里插入图片描述
可以看到,搜索出了超市以及商店下价格都大于10元的商品了
所以使用AND 和OR联合查询时能多加个(),消除歧义!新手上路,记录自己学习的点点滴滴,希望这篇博文能对你带来一点点帮助,陌生人,愉快生活哟!

猜你喜欢

转载自blog.csdn.net/DFireTesting/article/details/106809281