2016-07-24 117 views
0

我有以下表:這些SQL語句是否相同?

| sample_id (varchar, unique) | field1 (int) | field2 (int) | ... 
-------------------------------------------------------------------- 
| 9b7acb476c4ab04c7ddbc  | 100   | 56   | ... 
| a2e4df67e98ccaf088abf  | 23   | NULL   | ... 
| fcbe9cecd6b96cba7c6ee  | NULL   | 43   | ... 
... 

我具有由先前的用戶創建的同時查詢兩個字段和下面的代碼得到各行的隨機子集:

SELECT sample_id, field1, field2 
FROM  samples 
WHERE field1 != NULL 
UNION ALL 
SELECT sample_id, field1, field2 
FROM  samples 
WHERE field2 != NULL 
ORDER BY RAND() 
LIMIT 1000 

我通過重寫查詢作爲以爲優化代碼:基於一些文檔我讀here

SELECT sample_id, field1, field2 
FROM  samples 
WHERE field1 != NULL 
OR  field2 != NULL 
ORDER BY RAND() 
LIMIT 1000 

似乎都查詢是等效的,但我不知道如何在查詢中處理ORDER BY RAND()行。它僅適用於第二個查詢(即UNION ALL之後的查詢)嗎?

回答

1

[這是問題的原始版本]

不是。 != NULL將過濾掉所有數據,因爲幾乎所有與NULL的比較都返回NULL,將其視爲false。

!= ''將返回所有不包含空字符串且不是NULL的值。使用is nullis not null

[AFTER編輯] 你想查詢的是:

所有的
SELECT sample_id, field1, field2 
FROM samples 
WHERE field1 IS NOT NULL OR field2 IS NOT NULL 
ORDER BY RAND() 
LIMIT 1000; 
+0

原始查詢中的ORDER_BY RAND()行只應用於第二個select語句還是兩者? –

+0

@SyafiqKamarulAzman。 。 。如在原始查詢中一樣,它適用於兩者。這就是原始查詢的工作原理,所以應該是答案的作用。 –

0

首先,你的查詢目前沒有工作。他們都選擇使用任何虛假情況,因爲所有的NULL比較是:

mysql> select '' != NULL, NULL != NULL, 0 != NULL, 'hello' != NULL, 42 != NULL, (1=0)!=NULL, (1=1)!=NULL; 
+------------+--------------+-----------+-----------------+------------+-------------+-------------+ 
| '' != NULL | NULL != NULL | 0 != NULL | 'hello' != NULL | 42 != NULL | (1=0)!=NULL | (1=1)!=NULL | 
+------------+--------------+-----------+-----------------+------------+-------------+-------------+ 
|  NULL |   NULL |  NULL |   NULL |  NULL |  NULL |  NULL | 
+------------+--------------+-----------+-----------------+------------+-------------+-------------+ 
1 row in set (0.00 sec) 

select 1 from test where null; 
Empty set (0.00 sec) 

現在,如果你使用不同的條件,例如WHERE field1 IS NOT NULL,查詢可能仍然微妙地不等效

第一個更新的UNIONed子查詢現在將返回field1不爲null的行。這將通過field2不爲空的行進行補充。

UNION ALL會禁止重複。

如果field1和field2都爲null,如果存在,將由UNION ALL選擇兩次,並且選擇的概率爲

因此,在這兩種情況下,您最多可以獲得1000條記錄,但這兩組數據會略有不同。

很可能您的優化查詢一旦更新爲IS NOT NULL而不是!=就是您從一開始就需要的實際查詢。

但是,如果你做希望雙概率雙歸零行,那麼優化的查詢將等價的,如果你在一些隨機過程使用這些數據作爲輸入它可能會扭曲的結果。

+0

由於我不想要雙重概率,這是否意味着我的優化是一個更好的查詢? –

+0

是的,只要你得到適當的檢查(IS NOT NULL)。 – LSerni

0

將order by應用於union的結果。