2013-08-17 2 views
1

Я разрабатываю приложение, и я читал о том, как работают запросы. Я где-то читал, что вам следует избегать SELECT * FROM ... где blah = blahПочему SELECT * следует избегать в SQL?

Почему это? И каково обходное решение, если вы пытаетесь выбрать почти все?

+6

См. Здесь: http://stackoverflow.com/questions/3639861/why-is-select-considered-harmful – vee

+1

Не следует просто исключать любую инструкцию базы данных, которая отмечает неоднозначность. –

+0

Так что в основном вы должны просто делать SELECT Row1, Row2, Row3 ... Rowi FROM ... где blah = blah? – user2352165

ответ

0

Первоначально нужно знать, какие данные вам понадобятся. Хотя, вы можете выбрать все сразу, если таких запросов не будет много. Разница в производительности, вы увидите только в тяжелых проектах.

0

Это не прямой ответ на ваш вопрос «Почему?». (так что дайте ответ, если вам нужно.) Это ответ на вопрос «что такое обходной путь, если вам нужно».

Единственным обходным решением, которое следует избегать SELECT *, когда мне нужны все столбцы в таблице, - это получить список всех столбцов. И это просто лишний труд, который я работаю, мне не нужно, когда я уже занят.

Чтобы поставить обратный поворот на линии Office Space charaacter Питер Гиббонса: «Дело в том, Боб, это не значит, что я не забочусь, это просто, что я ленивый

С MySQL я делаю для менее занятой работы с помощью опции контекстного меню SQLyog для создания скелетного оператора SELECT, который содержит все столбцы.

Для оператора 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 

Когда ссылки на столбцы квалифицируется, кавычка нужна только для " специальные "символы в именах столбцов (или, может быть, некоторые странные чувствительные к регистру настройки g.)

Я могу начать с этого списка и уничтожить столбцы, которые, как я знаю, мне не нужны.

Опять же, прошу прощения, что это не отвечает на вопрос «Почему?». В ответах на подобные вопросы есть несколько веских причин. Для меня большая причина в том, что будущему читателю этого заявления не придется искать в другом месте, чтобы узнать, какие столбцы возвращаются. Конечно, они могут скопировать инструкцию и запустить ее в другой среде, чтобы просмотреть список. Но если оператор имеет переменные подстановки, связывающие переменные, а также точки и двойные кавычки и вызовы в mysql_real_escape_string (в случае интерфейса mysql_), это большая проблема, чем это должно быть. Конечно, код может быть изменен, чтобы вывести текст SQL перед его выполнением, и читателю, возможно, потребуется это сделать. Но кто-то, просто просматривая код, не должен этого делать. И имея список столбцов и выражений, возвращаемых оператором, в порядке, более подходящем, чем порядковая позиция столбцов в таблице, я думаю, что это просто делает для более читаемого кода. (Если важно, чтобы столбец был возвращен оператором, то я думаю, что разумно, чтобы имя столбца было отображено в запросе.)

(Это было в терминах кода приложения, утверждений, которые будут включены в приложении. Для специальных запросов и разработки и т. д. я свободно использую SELECT c.*.Но когда заявление идет в приложение, то заменяется *.

Смежные вопросы