2017-10-13 95 views
0

這只是一個簡單的問題,以獲得有關SQL如何工作的更多知識。SQL如何處理Oracle 11g中的where子句?

如果我有多個條件的查詢,例如第二個語句爲false,那麼在查詢中第二個語句之後的其餘語句是否仍會被評估,或者SQL是否跳過此處並開始再次與下一行?

例子:

SELECT * FROM MY_TABLE 
    WHERE NAME = "PETER" 
    AND LANGUAGE = "ENGLISH" 
    AND COUNTRY = "UK" 
    AND ENCRYPTION = "SHA-1"; 

我們的數據庫看起來是這樣的:

| NAME | LANGUAGE | COUNTRY | ENCRYPTION | 
    PETER, ENGLISH, UK, SHA-1 
    PETER, FRENCH, SWITZERLAND, SHA-1 
    PETER, ENGLISH, USA, SHA-1 

現在,當它到達第二個條目,將在語言條件查詢停止,因爲它是「假」 ,請忽略以下條件並繼續進行下一個條目,否則它會檢查國家和加密嗎?

+6

您正在使用哪個[DBMS](https://en.wikipedia.org/wiki/DBMS)產品? Postgres的?甲骨文? 「_SQL_」只是一種查詢語言,而不是特定數據庫產品的名稱。但是一般來說,「SQL」不會對錶達式進行短路。 –

+0

MySQL也對WHERE條件中的條件執行短路評估,但它不一定按您在查詢中編寫它們的順序對它們進行評估。無論如何,爲了查詢的目的,它應該沒有關係。 – axiac

回答

0

SQL是聲明性的,即您的數據庫系統可以選擇以任何順序評估WHERE子句。

此外,數據庫系統嘗試使用索引。例如,如果你有一個在COUNTRY上聲明的索引,你的數據庫系統將使用這個索引來得到元組WITH WITH SOURCE SOURCE,它只會評估這些元組的剩餘條件。 (爲了簡單,我假設這是唯一的索引)。

這比短路評估更強,因爲在短路評估中,仍然存在一個評估順序。在SQL中,您編寫語句的方式不會強制數據庫系統按特定順序評估您的條件。數據庫系統將利用它來改善查詢響應時間。

0

你所描述的是所謂的「短路」。事實上,大多數數據庫在評估where條款時會發生短路 - 如果他們一次只評估一個條款的每個條款。

但是,這並沒有什麼區別。 SQL是爲大數據而設計的。處理數據的開銷是從永久存儲中讀取和寫入數據。額外的計算時間通常與比較無關。並不總是 - 長字符串,JSON字段,複雜算術等可以增加重要的處理時間。

如果你關心性能,你應該添加適當的索引。最適合您的查詢將在MY_TABLE(NAME, LANGUAGE, COUNTRY, ENCRYPTION)(或以任意順序以這四列開頭的任何索引)。如果您關心性能,正確使用索引和表分區是您應該瞭解的內容。

+0

你怎麼知道索引(名稱,語言,國家,加密)將是最好的? – jarlh

+0

@jarlh。 。 。我澄清。任何以任意順序開頭的索引。 –

0

這叫做short circuiting和SQL Server有它。

OR表達式,如果第一個條件爲真不檢查其他條件,如:

例如看到這個簡單的查詢,請參閱(2/@a = 1)應該返回錯誤 但不計算

DECLARE @a INT = 0 
DECLARE @b INT = 10 

SELECT 'name' AS Name 
WHERE @b = 10 OR (2/@a = 1) 

AND表達式中,如果第一個條件爲false,則不檢查其他條件,如:

例如查看此簡單查詢,看到(2/@a = 1)應該返回錯誤 但不計算

DECLARE @a INT = 0 
DECLARE @b INT = 10 

SELECT 'name' AS Name 
WHERE @b = 14 and (2/@a = 1) 

在你的問題,因爲你正在使用AND,它不檢查其他條件,如果第一個條件是假

0

SQL支票在每個條件WHERE子句,直到找到第一個失敗的條件,然後跳過該行。否則,返回行。