2010-04-30 40 views
1

我無法區分這些陳述之間的區別嗎?請你幫助我,我已經閱讀了一些選擇陳述的樣本,但我沒有得到這些陳述。解釋這些選擇語句!

SELECT 'B' FROM T WHERE A = (SELECT NULL); 
SELECT 'C' FROM T WHERE A = ANY (SELECT NULL);  
SELECT 'D' FROM T WHERE A = A; 

我使用MySQL

編輯:也有一個條件部分是:SET ANSI_NULLS爲OFF

回答

3

ANSI_NULL ON

SELECT 'B' FROM T WHERE A = (SELECT NULL); 

是一樣的:

SELECT 'B' FROM T WHERE A = NULL; 

它總是返回一個空集合,因爲與NULL比較的任何內容都返回NULL,而不是TRUE。你可以試試這個:

SELECT 'B' FROM T WHERE A IS NULL; 

第二個查詢是基本相同的,並會返回一個空集:

SELECT 'C' FROM T WHERE A = ANY (SELECT NULL); 

如果A有一個值,下面將返回所有行:

SELECT 'D' FROM T WHERE A = A; 

但是,如果A爲NULL,它將返回一個空集。

ANSI_NULL OFF

SELECT 'B' FROM T WHERE A = (SELECT NULL); 

是一樣的:

SELECT 'B' FROM T WHERE A = NULL; 

它返回其中A爲NULL的所有行。

第二個查詢是基本相同的,其中A爲NULL將返回行:

SELECT 'C' FROM T WHERE A = ANY (SELECT NULL); 

下面將始終返回所有行,如果不考慮A爲NULL:

SELECT 'D' FROM T WHERE A = A; 
+0

exceuse我,我已經提出了一個問題,如 SELECT'A'FROM T WHERE A = NULL; 和其他人告訴我,它會返回一些包含A字符的行! – user329820 2010-04-30 16:40:13

+0

http://stackoverflow.com/questions/2745849/mysql-column-names-and-aliases – user329820 2010-04-30 16:41:05

+0

@ user329820上述帖子是正確的。要與NULL進行比較,您必須使用IS。自己試試吧! – Blorgbeard 2010-04-30 16:54:04