2013-08-17 47 views
1

我正在開發一個應用程序,我正在閱讀有關查詢如何工作。我在某處讀到你應該避免選擇* FROM ... where blah = blah爲什麼要在SQL中避免SELECT *?

這是爲什麼?如果你想挑選幾乎所有東西,那麼解決方法是什麼?

+6

請參閱:http://stackoverflow.com/questions/3639861/why-is-select-considered-harmful – vee

+1

不僅僅是PHP,任何標記歧義的數據庫語句都應該避免。 –

+0

所以基本上你應該只做SELECT Row1,Row2,Row3 ... Rowi FROM ... where blah = blah? – user2352165

回答

0

最初需要知道您需要什麼數據。儘管如此,如果這樣的請求不會太多,您可以一次選擇全部。在性能上的差異,你只會看到重型項目。

0

這不是對您的問題的直接回答「爲什麼?」 (如果需要的話,請降低答案)。這是「如果您需要的話,什麼是解決方法」問題的答案。

當我需要表中的所有列時,避免SELECT *的唯一解決方法是獲取所有列的列表。當我已經很忙的時候,我只是忙於工作而不需要。

爲了把一個向後捻從辦公空間 charaacter彼得·吉本斯一行:「事實是,鮑勃,這並不是說我不在乎,它只是我很懶」。

通過使用SQLyog右鍵菜單選項生成包含所有列的骨架SELECT語句,使用MySQL可以減少繁忙工作。

對於引用多個表的SQL語句,我希望每個列引用都有一個表別名的限定,所以我將使用一條SQL語句爲我檢索一個現成的列列表:

SELECT GROUP_CONCAT(CONCAT('t.',c.column_name) 
     ORDER BY c.ordinal_position 
     ) AS col_list 
    FROM information_schema.columns c 
WHERE c.table_schema = 'mydatabase' 
    AND c.table_name = 'mytable' 

如果我只需要幾齣一個長長的名單,很容易對我來說,讓他們走出一個垂直列表

SELECT CONCAT(',s.`',c.column_name,'`') AS col_names 
    FROM information_schema.columns c 
WHERE c.table_schema = 'mydatabase' 
    AND c.table_name = 'mytable' 
ORDER BY c.ordinal_position 

當列引用合格,反引號時,才需要爲「特殊「字符(或者可能是一些奇怪的區分大小寫的settin g)

我可以從那個列表開始,並且刪除我知道我不需要的列。

再次,我很抱歉,這不回答「爲什麼?」這個問題。在類似問題的答案中有幾個很好的理由。對我而言,一個重要的原因是未來的讀者不必去別的地方找出哪些列正在返回。當然,他們可以複製聲明,並在不同的環境中運行它,以查看列表。但是,如果語句具有變量替換,綁定變量,以及點和雙引號以及調用mysql_real_escape_string(在mysql_接口的情況下),那麼這是一個比它需要更大的麻煩。當然,可以修改代碼以在執行之前回顯SQL文本,讀者可能需要這樣做。但只是審查代碼的人不應該這樣做。並且讓列表和表達式的列表按照比表中列的順序位置更合適的順序返回,我認爲這只是爲了獲得更多可讀代碼。 (如果聲明返回列很重要,那麼我認爲在查詢中顯示列名是合理的。)

(這是根據應用程序代碼,將要包含的語句在一個應用程序中。對於臨時查詢和開發等,我自由地使用了SELECT c.*。但是當一個聲明進入應用程序時,*被替換。

相關問題