Есть ли разница между Select * и Select [list each col]

Я использую MS SQL Server 2005. Есть ли разница между механизмом SQL между

SELECT * FROM MyTable;

и

SELECT ColA, ColB, ColC FROM MyTable;

Когда ColA, ColB и ColC представляют каждый столбец в таблице?

Если они одинаковы, есть ли причина, почему вы должны использовать второй? У меня есть проект, который тяжелый для LINQ, и я не уверен, что стандартный SELECT *, который он создает, является плохой практикой или если я всегда должен быть .Select() на нем, чтобы указать, какие cols я хочу.

EDIT: Изменено "Когда ColA, ColB и ColC - все столбцы таблицы?" на "Когда ColA, ColB и ColC представляют каждый столбец в таблице?" для ясности.

Ответ 1

Как правило, лучше быть явным, поэтому Select col1, col2 from Table лучше. Причина в том, что в какой-то момент дополнительный столбец может быть добавлен в эту таблицу и приведет к возврату ненужных данных из запроса.

Это не жесткое правило.

Ответ 2

1) Второй более явный вопрос о том, какие столбцы возвращены. Значением второго является то, насколько вы цените явное знание того, какие столбцы возвращаются.

2) Это связано с потенциально меньшим количеством данных, возвращаемых, когда имеется больше столбцов, чем явно используемые.

3) Если вы измените таблицу, добавив новый столбец, первый запрос изменится, а второй - нет. Если у вас есть код типа "для всех возвращенных столбцов do...", то результаты будут изменены, если вы используете первый, но не второй.

Ответ 3

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

Ответ 4

Двумя сторонами проблемы являются следующие: явная спецификация столбца дает лучшую производительность при добавлении новых столбцов, но * спецификация не требует обслуживания при добавлении новых столбцов.

Что использовать, зависит от того, какие столбцы вы хотите добавить в таблицу, и какова точка запроса.

Если вы используете свою таблицу в качестве хранилища резервных копий для объекта (что представляется вероятным в случае с LINQ to SQL), вероятно, вам нужны новые столбцы, добавленные в эту таблицу для включения в ваш объект, наоборот. Вы поддерживаете их параллельно. По этой причине для этого случая * спецификация в предложении SELECT является правильной. Явная спецификация даст вам дополнительный бит обслуживания каждый раз, когда что-то изменится, и ошибку, если вы не обновили список полей правильно.

Если запрос будет возвращать много записей, вам, вероятно, будет лучше с явной спецификацией по причинам производительности.

Если обе вещи верны, рассмотрите два разных запроса.

Ответ 5

Вы должны указать явный список столбцов. SELECT * вернет больше столбцов, чем вам нужно создать больше ввода-вывода и сетевого трафика, но, что более важно, может потребоваться дополнительный поиск, даже если существует некластеризованный индекс покрытия (на SQL Server).

Ответ 6

Когда вы выбираете каждое поле в отдельности, более ясно, какие поля на самом деле выбраны.

Ответ 7

Некоторые причины не использовать первый оператор (выберите *):

  • Если вы добавите некоторые большие поля (столбец BLOB будет очень плохим) позже в эту таблицу, вы можете столкнуться с проблемами производительности в приложении
  • Если запрос был объединенным запросом с двумя или более таблицами, некоторые из полей могут иметь одно и то же имя. Было бы лучше убедиться, что имена ваших полей разные.
  • цель запроса более понятна, а второй оператор с точки зрения эстетики программирования

Ответ 8

SELECT * - это плохая практика в большинстве мест.

  • Что делать, если кто-то добавляет столбец BLOB 2gb в эту таблицу?
  • Что добавляет какой-либо столбец в эту таблицу?

Это ошибка, ожидающая случиться.

Ответ 9

Несколько вещей:

  • Большое количество людей разместили здесь рекомендации против использования * и дали несколько веских причин для этих ответов. Из 10 других ответов до сих пор только один не рекомендует перечислять столбцы.
  • Люди часто делают исключения из этого правила при публикации, чтобы помочь таким сайтам, как StackOverflow, потому что они часто не знают, какие столбцы находятся в вашей таблице или важны для вашего запроса. По этой причине вы увидите много кода здесь и в другом месте в Интернете, которое использует синтаксис *, даже если плакат будет стремиться избегать этого в своем собственном коде.

Ответ 10

Это хорошо для передовой совместимости.

Когда вы используете

SELECT * FROM myTable

а в "myTable" - 3 столбца. Вы получаете те же результаты, что и

SELECT Column1, Column2, Column3 FROM myTable

Но если вы добавите новый столбец в будущем, вы получите разные результаты.

Конечно, если вы измените имя на один из существующих столбцов, в первом случае вы получите результаты, а во втором случае вы получите ошибку (я думаю, это правильное поведение приложения).

Ответ 11

Если ваш код зависит от определенных столбцов, находящихся в определенном порядке, вам нужно указать столбцы. Если нет, это не имеет особого значения, если вы используете "*" или записываете имена столбцов в инструкции select.

Например, если вы вставляете столбец в таблицу.

Возьмите эту таблицу: ColA ColB ColC

У вас может быть запрос:

SELECT *
FROM myTable

Тогда код может быть:

rs = executeSql("SELECT * FROM myTable")
while (rs.read())
    Print "Col A" + rs[0]
    Print "Col B" + rs[1]
    Print "Col C" + rs[2]

Если вы добавите столбец между ColB и ColC, запрос не вернет то, что вы ищете.

Ответ 12

Быстрый просмотр плана выполнения запроса показывает, что запросы одинаковы.

Общее правило заключается в том, что вы захотите ограничить свои запросы только теми полями, которые вам нужны.

Ответ 13

Для LinqToSql, если вы планируете позже изменять эти записи, вы должны вывести всю запись в память.

Ответ 14

Это зависит от того, что вы подразумеваете под "разницей". Существует очевидная разница в синтаксисе, но реальная разница - это производительность.

Когда вы говорите SELECT * FROM MyTable, вы сообщаете механизму запросов SQL возвращать набор данных с all столбцов из этой таблицы, а SELECT ColA, ColB, ColC FROM MyTable сообщает механизму запросов вернуть данные установите только ColA, ColB и ColC из таблицы.

Скажите, что у вас есть таблица со 100 столбцами, определенная как CHAR [10]. SELECT * вернет 100 столбцов * 10 байт данных, а SELECT ColA, ColB, ColC вернет 3 столбца * 10 байт данных. Это огромная разница в размере данных, которые передаются обратно через провод.

Указание списка столбцов также значительно упрощает поиск столбцов. Недостатком является то, что если вы добавите/удалите столбец из таблицы, вам необходимо также обновить список столбцов, но я думаю, что небольшая цена по сравнению с приростом производительности.

Ответ 15

SELECT * FROM MyTable

select * зависит от порядка столбцов в схеме, поэтому, если вы ссылаетесь на результат, заданный индексом # коллекции, вы будете искать неправильный столбец.

SELECT Col1,Col2,Col3 FROM MyTable

этот запрос даст вам коллекцию, которая остается неизменной во времени, но как часто вы меняете порядок столбцов?

Ответ 16

выбор каждого столбца лучше, чем просто *, потому что если вы добавляете или удаляете новую строку, вам нужно посмотреть на код и посмотреть, что вы делали с полученными данными.
Кроме того, это помогает лучше понять ваш код и позволяет использовать псевдонимы в качестве имен столбцов (в случае, если вы выполняете объединение таблиц с разделяемым им столбцом)

Ответ 17

Пример того, почему вы никогда (imho) не должны использовать SELECT *. Это не относится к MSSQL, а скорее к MySQL. Версии до 5.0.12 возвращают столбцы из определенных типов объединений нестандартным образом. Конечно, если ваши запросы определяют, какие столбцы вам нужны, и в каком порядке у вас нет проблем. Представьте себе удовольствие, если они этого не сделают.

(Одно из возможных исключений: ваш запрос SELECT из одной таблицы и позволяет идентифицировать столбцы на выбранном вами языке программирования по имени, а не положению.)

Ответ 18

Использование "SELECT *" оптимизируется для ввода текста программиста. Это. Это единственное преимущество.