【真實案例】mysql的or語句導(dǎo)致水平越權(quán)

理論

sql 語句中 and 和or的優(yōu)先級比較

例:
select from test where condition1 or condition2 and condition3;
其執(zhí)行效果與下面的sql等價:
select from test where condition1 or (condition2 and condition3);

故可以得出結(jié)論:and級別高于or

多個and 和 or 混用也是這個道理,相當(dāng)于把 and 看成乘號(*), 把or看成加號(+),這樣sql的執(zhí)行順序就一目了然了。

最后還是建議大家嚴(yán)格按照業(yè)務(wù)邏輯寫sql,必要的時候毫不吝嗇使用括號,就像上面的情況,如果邏輯是:condition1 且 condition2 或者 condition3,

那么請寫成:select * from test where (condition1 and condition2) or condition3這樣既不會出錯,也方便以后查看代碼。

線上case

查詢應(yīng)用列表,預(yù)期語義:查詢某個用戶下,且應(yīng)用名為90009或者應(yīng)用id=90009的應(yīng)用信息

SELECT
    * 
FROM
    tb_app
WHERE
    1 = 1 
    AND user_id = 4002 
    AND cooperation_content <> 4 
    AND NAME = '90009' OR app_id =  90009
    AND stauts =1 
    AND type = 2

但實際上sql語句會被解析成為:

SELECT
    * 
FROM
    tb_app
WHERE
    (1 = 1 
    AND user_id = 4002 
    AND cooperation_content <> 4 
    AND NAME = '90009') 
    OR 
    (app_id =  90009
    AND stauts =1 
    AND type = 2)

這種語句,由此引發(fā)水平越權(quán)。

最優(yōu)的解決方案:使用or語句時,應(yīng)使用小括號來明確語義。

SELECT
    * 
FROM
    tb_app
WHERE
    1 = 1 
    AND user_id = 4002 
    AND cooperation_content <> 4 
    AND (NAME = '90009' OR app_id =  90009)
    AND stauts =1 
    AND type = 2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、數(shù)據(jù)庫介紹篇 1.1什么是數(shù)據(jù)庫 數(shù)據(jù)庫:保存數(shù)據(jù)的倉庫。它體現(xiàn)我們電腦中,就是一個文件系統(tǒng)。然后把數(shù)據(jù)都保存...
    投石機(jī)閱讀 894評論 0 0
  • SQL語句的分類 DDL(數(shù)據(jù)定義語言) 這些語句定義了不同的數(shù)據(jù)段, 數(shù)據(jù)庫,表,列,索引等數(shù)據(jù)庫對象。常用的語...
    Minazz閱讀 822評論 0 0
  • MySQL基礎(chǔ)操作 創(chuàng)建數(shù)據(jù)庫 創(chuàng)建數(shù)據(jù)庫,該命令的作用: 如果數(shù)據(jù)庫不存在則創(chuàng)建,存在則不創(chuàng)建。 創(chuàng)建RUNOO...
    少年_323a閱讀 860評論 0 0
  • # The Ruby Style Guide > Hey jude, don't make it bad. > T...
    司徒雷斯閱讀 375評論 0 2
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應(yīng)用程序。每個數(shù)據(jù)庫具有一個或多個不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,143評論 0 19

友情鏈接更多精彩內(nèi)容