2016-01-27 39 views
0

我學習的Mysql差或之間,並與其中的mysql

但我覺得下面的例子後困惑:

select * from `users` where username = 'admin' or true; 

在這裏,它返回的用戶表中的所有行!

(username ='admin'或true)應該是真的嗎?那麼,真正的

,但在這個例子中:

select * from `users` where username = 'admin' and true; 

它返回一個行(其中username = '管理員')

但(用戶名= '管理' 和真正的)應該是真實的呢!

那有什麼區別?

+0

對每行測試條件。所以如果你沒有所有名爲「admin」的用戶,你只會得到一行返回...... –

+1

用'true'代替'1',它應該更有意義。 –

+0

你是這個例子的意思?從用戶名中選擇*,其中username ='admin'和1; 它會先檢查它將檢查usename ='admin'的位置?因爲AND? – Vendetta

回答

6
-- this is always true 
WHERE 1 

-- this is only true for rows where the username is admin 
WHERE username = 'admin' 

現在檢查這個truth table

x y | x and y | x or y 
----------------------- 
F F | F | F 
F T | F | T 
T F | F | T 
T T | T | T 

https://en.wikipedia.org/wiki/Boolean_algebra

如果你把

  • xWHERE username = 'admin'
  • yWHERE 1

你應該瞭解的結果。

+0

使用(或)它會執行1 = 1(邏輯表達式第一個?),所以它將是真正的所以所有行將被返回,但使用和)將執行這兩個表達式,其中用戶名='管理'它將返回行,並在此行真正的行=管理!對 ?? – Vendetta

+0

@ user3771906是的,DBMS使用幾個優化器來快速實現數據庫交互。檢查這個例子:https://dev.mysql.com/doc/refman/5.7/en/where-optimizations.html。如果它像「真正的OR(...)」那樣經常計算爲「真」,優化器會擦除整個WHERE子句。 – steffen

+0

使用或如果是一個邏輯表達式真正的整體在哪裏將是真所以(如果真)返回所有行................但在和如果我們混合他們的用戶名='管理員'和真正的,因爲你說結果將是記錄:) – Vendetta

3

你應該以不同的方式閱讀。

該子句檢查用戶名是否等於'admin'。

閱讀如下

(username = 'admin') and (1) 

併爲或

(username = 'admin') or (1) 

所以第二個將返回所有值在你的數據庫,因爲它會檢查,如果條件1或2中得到滿足。條件2總是如此。

WHERE 1 
+0

使用(或)它會執行1 = 1(邏輯表達式第一?),所以它將是真正的所以所有行將返回,但使用(和)將執行這兩個表達式,其中用戶名='管理'它會返回這一行,並確保這一行=管理員!對 ?? – Vendetta

+0

是的,在使用的情況下,兩個子句應該返回true,正如你現在知道的1總是返回'true',所以如果第一個子句'username ='admin''返回true,它將只返回該記錄 – davejal

+0

,但使用或如果這是一個邏輯表達式真正的整個地方將是真的所以(如果真)返回所有行................但在和如果我們混合他們username ='管理員'並且如你所說,結果將是記錄:) – Vendetta

1

Mysql的考慮1作爲true所以很簡單的邏輯 - expression OR true永遠是真實的(所以你得到所有行)和expression AND true相當於expression,所以你只能滿足你的條件

它的外觀ROWA有點奇怪,但mysql每行檢查expreesion(包括1)fpr,儘管1不是表的一部分。仍然考慮是否決定是否選擇每一行

1
In a room there are 10 people. 
1 is a woman, the rest are men. 

How many in the room are People OR Women = 10. 
How many in the room are People AND Women = 1. 
How many in the room are People AND Men = 9. 
How many in the room are Men OR Women = 10. 
How many in the room are Men AND Women = 0.  
    In todays day and age, this is questionable ;) 

Still I hope it helps 
+0

我明白,在邏輯表達式的情況下,但當我混合邏輯表達式(其中用戶名= admin)讓我感到困惑! :d – Vendetta

相關問題