Выбрать все столбцы, кроме одного в MySQL?

Я пытаюсь использовать оператор select, чтобы получить все столбцы из определенной таблицы MySQL, кроме одного. Есть простой способ сделать это?

Обновлено: В этой таблице 53 столбца (НЕ МОЙ ДИЗАЙН)

За исключением одного столбца ... Я полагаю, вы знаете, какой из них следует игнорировать, поэтому INFORMATION_SCHEMA.columns - это способ.

Alfabravo 24.02.2010 01:09

Проверьте этот ответ, он делает то, что вы хотите!

donL 11.12.2012 00:22

53 столбца? Я бы придерживался SELECT *, как предлагает Томас в этом случае ... если в этом дополнительном столбце нет огромного количества данных, которые было бы нежелательно извлекать ...?

Mike Stone 12.08.2008 22:52

Столбец больших данных представляет собой реальную проблему, когда хранятся географические данные. Столбцы могут иметь размер в несколько мегабайт. Они хорошо работают в предложениях where для поиска строк, но вам часто не нужны эти данные в результатах.

Jason 19.04.2020 15:26

Обычно это используется для исключения столбца идентификатора автоинкремента. Например, чтобы выбрать данные для вставки в другую таблицу, у которой есть собственный идентификатор.

ToolmakerSteve 22.04.2020 22:28
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
396
5
372 104
32
Перейти к ответу Данный вопрос помечен как решенный

Ответы 32

Насколько мне известно, нет. Вы можете сделать что-то вроде:

SELECT col1, col2, col3, col4 FROM tbl

и вручную выберите нужные столбцы. Однако, если вам нужно много столбцов, вы можете просто сделать:

SELECT * FROM tbl 

и просто игнорируйте то, что вам не нужно.

В вашем конкретном случае я бы предложил:

SELECT * FROM tbl

если вам не нужно всего несколько столбцов. Если вам нужно всего четыре столбца, тогда:

SELECT col3, col6, col45, col 52 FROM tbl

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

Select * всегда плохой выбор. Не рекомендую. Прочтите, почему это антипаттерн SQl.

HLGEM 16.01.2014 22:03

Ты можешь сделать:

SELECT column1, column2, column4 FROM table WHERE whatever

без получения column3, хотя, возможно, вы искали более общее решение?

Большинство ответов с более высоким рейтингом в основном просто поиск способов сгенерировать этот точный запрос без ввода вручную.

mehtunguh 13.03.2014 01:52

На самом деле, из соображений обслуживания полезно иметь запрос типа «все, кроме». В противном случае явные списки полей должны быть обновлены, если новые поля будут добавлены позже.

leiavoia 25.03.2014 21:12

@lev, это правильно и ОНИ ДОЛЖНЫ БЫТЬ !!! BE потому что вы не знаете, хотите ли вы иметь какие-либо будущие столбцы (они могут быть столбцами метаданных или столбцами, которые не относятся к конкретному экрану). Вы не делаете; хотите снизить производительность, возвращая больше, чем вам нужно (что верно в 100% случаев, когда у вас есть внутреннее соединение). Я предлагаю вам прочитать о том, почему select * является антипаттерном SQL.

HLGEM 22.05.2014 23:27

OP заявляет, что существует> 50 столбцов, поэтому это довольно непрактично.

augurar 10.09.2015 21:13

@HLGEM Не совсем, я хотел выбирать все столбцы без поддержки запроса каждый раз, когда я добавляю новый столбец, кроме одного из них, и в моем случае это не сработало бы. Но в любом случае я применил решение Шона О для себя

OverCoder 15.09.2016 14:00

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

Вы можете использовать ОПИСАТЬ my_table и использовать результаты этого для динамического создания оператора SELECT.

Будет ли в этом случае работать лучше?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

ХАХА! Да, конечно. Теперь, как создать представление, которое будет включать все, НО один из столбцов. Я думаю, вы понимаете, как возникает исходный вопрос. Фактически, я нашел этот поток специально, потому что я хотел создать представление, которое исключало определенные столбцы, без необходимости явно перечислять все оставшиеся столбцы в определении представления.

Chris Nadovich 14.01.2019 06:11

Вы получили ответ на «Снарка» десятилетней давности. вы бы не сделали этого для одноразовых запросов. это архитектурное решение.

Chaos 13.03.2021 00:42

Я согласен с тем, что Select * недостаточно, если тот, который вам не нужен, как упоминалось в другом месте, является BLOB, вы не хотите, чтобы эти накладные расходы вкрались.

Я бы создал Посмотреть с необходимыми данными, тогда вы сможете с комфортом Select * - если программное обеспечение базы данных поддерживает их. В противном случае поместите огромные данные в другую таблицу.

Если это всегда один и тот же столбец, вы можете создать представление, в котором его нет.

В противном случае нет, я так не думаю.

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

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

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

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

mbillard 23.02.2009 17:54

@kodecraft: Это хорошая практика по той же причине, что и всегда возвращать один и тот же тип из функции (даже если вы работаете на языке, где это не применяется). По сути, это принцип наименьшего удивления.

Daniel Pryden 04.09.2009 00:47

Сначала я подумал, что вы можете использовать регулярные выражения, но, поскольку я читал Документы MYSQL, кажется, что вы не можете. На вашем месте я бы использовал другой язык (например, PHP) для создания списка столбцов, который вы хотите получить, сохранил его как строку, а затем использовал бы его для генерации SQL.

Хотя я согласен с ответом Томаса (+1;)), я хотел бы добавить предостережение, что я предполагаю, что столбец, который вы хотите не, почти не содержит данных. Если он содержит огромное количество текста, XML или двоичных двоичных объектов, найдите время, чтобы выбрать каждый столбец по отдельности. В противном случае ваша производительность пострадает. Ваше здоровье!

Вы можете использовать SQL для генерации SQL, если хотите, и оценить SQL, который он производит. Это общее решение, поскольку оно извлекает имена столбцов из информационной схемы. Вот пример из командной строки Unix.

Подставляя

  • MYSQL с вашей командой mysql
  • ТАБЛИЦА с названием таблицы
  • EXCLUDEDFIELD с именем исключенного поля
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name = "TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL

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

Так что-то вроде:

column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name = "TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)

Теперь вы можете повторно использовать строку $column_list в создаваемых вами запросах.

Ответ принят как подходящий

На самом деле есть способ, вам, конечно же, нужны разрешения для этого ...

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

Замена <table>, <database> and <columns_to_omit>

предостережение: запросы INFORMATION_SCHEMA имеют довольно низкую производительность, поэтому будьте осторожны, этот тип запроса не является критическим для чего-либо.

Bill Karwin 21.09.2011 01:08

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

donL 11.12.2012 02:11

Это решение не работает, если у вас есть имена столбцов, такие как id, product_id и т. д. stackoverflow.com/a/17719025/1827513 - правильный ответ.

cazgp 02.01.2014 15:49

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

HLGEM 16.01.2014 22:08

Конечно, это хуже, чем просто указать столбцы, дело в том, что иногда вам нужно сгенерировать SQL из инструмента CASE или фреймворка всего за один шаг без использования внешних языков.

Mahomedalid 25.06.2014 02:42

Это не работает, если в именах столбцов есть пробелы. Его следует обновить, чтобы имена всегда были заключены в обратные кавычки <column_name>.

adamF 25.07.2014 02:01

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

Vincent Pazeller 17.02.2015 16:46

Действительно отличное решение для нашей БД, таблицы которой содержат досадно большой XML-столбец.

belwood 18.03.2015 17:17

Просто делать

SELECT * FROM table WHERE whatever

Затем опустите столбец на своем любимом языке программирования: php

while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
   unset($data["id"]);
   foreach ($data as $k => $v) { 
      echo"$v,";
   }      
}

Если столбец, который вы хотите исключить, не является огромным BLOB или чем-то в этом роде.

Bill Karwin 21.09.2011 01:09

Это плохо, если вы пытаетесь избежать потери данных.

Kristopher Ives 26.09.2011 00:13

1 столбец из 53 не должен иметь никакого значения. Если это так, вероятно, это плохой дизайн.

Petr Peller 20.06.2013 21:41

SElect * - это антипаттерн SQL, и его никогда не следует использовать в производственном коде.

HLGEM 30.03.2015 16:56

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

Geoff Kendall 18.07.2018 01:38

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

zeeshan 08.01.2019 07:01

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

Rene Wooller 30.05.2019 10:50

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

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp

Это будет ужасно медленно для любого стола среднего размера.

Joel 15.02.2014 03:22

В определениях mysql (руководство) такого нет. Но если у вас действительно большое количество столбцов col1, ..., col100, вам может пригодиться следующее:

DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
   #// ALTER TABLE temp_tb DROP col_a, ... , DROP col_z; #// for a few columns to drop
SELECT * FROM temp_tb;

Выдал мне сообщение об ошибке на 3-м шаге: «Количество столбцов не соответствует количеству значений в строке 1». Поэтому я изменил шаг 2 на «UPDATE temp_tb SET id = NULL», и тогда он сработал.

oyvey 21.11.2016 10:44

Хорошо, это работает. Но когда я снова запускаю этот запрос, он выдает ошибку, что temp_tb уже существует. Сколько времени temp_tb находится в памяти? Прошу прощения, если это глупый вопрос. P.S. поддержал ваш ответ.

Karan 26.09.2018 20:26

@Karan Чтобы повторно запускать этот запрос, добавьте еще одну команду в начало: DROP TABLE IF EXISTS temp_tb;

gregn3 11.07.2019 20:43

@Karan Чтобы указать механизм памяти, используйте команду: CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); , в противном случае он сохраняется на диск по умолчанию и переживает перезапуск сервера. (Благодарность)

gregn3 11.07.2019 21:00

Отличный ответ. Для удаление нескольких столбцов см. этот ответ.

S3DEV 13.02.2020 15:21

HEY DATABASE COPY EVERYTHING TO MEMORY SO I CAN READ ONE THING; :)

MuhsinFatih 23.10.2020 15:21

Я согласен с «простым» решением перечислить все столбцы, но это может быть обременительным, а опечатки могут привести к потере времени. Я использую функцию getTableColumns для получения имен моих столбцов, подходящих для вставки в запрос. Тогда все, что мне нужно сделать, это удалить те, которые мне не нужны.

CREATE FUNCTION `getTableColumns`(tablename varchar(100)) 
          RETURNS varchar(5000) CHARSET latin1
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE res  VARCHAR(5000) DEFAULT "";

  DECLARE col  VARCHAR(200);
  DECLARE cur1 CURSOR FOR 
    select COLUMN_NAME from information_schema.columns 
    where TABLE_NAME=@table AND TABLE_SCHEMA = "yourdatabase" ORDER BY ORDINAL_POSITION;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur1;
  REPEAT
       FETCH cur1 INTO col;
       IF NOT done THEN 
          set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
       END IF;
    UNTIL done END REPEAT;
  CLOSE cur1;
  RETURN res;

Ваш результат возвращает строку с разделителями-запятыми, например ...

col1,col2,col3,col4,...col53

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

Вот пример того, как это может быть очень полезно:

select users.*, phone.meta_value as phone, zipcode.meta_value as zipcode

from users

left join user_meta as phone
on ( (users.user_id = phone.user_id) AND (phone.meta_key = 'phone') )

left join user_meta as zipcode
on ( (users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode') )

Результатом являются все столбцы из таблицы пользователей и два дополнительных столбца, которые были объединены из метатаблицы.

спасибо, мне нужно выбрать все столбцы первой таблицы и только одно поле из второй таблицы при объединении, и ваш ответ мне помог.

mohammad falahat 27.06.2012 14:44

Ответ, отправленный Магомедалидом, содержит небольшую проблему:

Код функции замены внутри заменял "<columns_to_delete>," на "", у этой замены есть проблема, если заменяемое поле является последним в строке concat из-за того, что последнее не имеет символьной запятой "," и не удаляется из строки.

Мое предложение:

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
                  '<columns_to_delete>', '\'FIELD_REMOVED\'')
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE TABLE_NAME = '<table>'
             AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

Замена <table>, <database> и `

Удаленный столбец заменяется строкой «FIELD_REMOVED», в моем случае это работает, потому что я пытался сохранить память. (Поле, которое я удалял, представляет собой большой двоичный объект размером около 1 МБ)

Ответ от @Mahomedalid мне понравился, к тому же об этом сообщается в комментарии @Bill Karwin. Возможная проблема, поднятая @Jan Koritak, верна. Я столкнулся с этим, но я нашел уловку для этого и просто хочу поделиться им здесь для всех, кто сталкивается с проблемой.

мы можем заменить функцию REPLACE предложением where в подзапросе подготовленного оператора следующим образом:

Используя имя моей таблицы и столбца

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

Итак, это будет исключать только поле id, но не company_id.

Основываясь на ответе @Mahomedalid, я сделал некоторые улучшения для поддержки «выбрать все столбцы, кроме некоторых в mysql».

SET @database    = 'database_name';
SET @tablename   = 'table_name';
SET @cols2delete = 'col1,col2,col3';

SET @sql = CONCAT(
'SELECT ', 
(
    SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
), 
' FROM ',
@tablename);

SELECT @sql;

Если у вас много столбцов, используйте этот sql для изменения group_concat_max_len

SET @@group_concat_max_len = 2048;

Я довольно поздно придумал ответ на этот вопрос, скажем так, я всегда это делал, и, честно говоря, он в 100 раз лучше и аккуратнее, чем лучший ответ, я только надеюсь, что кто-то его увидит. И считаю это полезным

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);

Это может быть аккуратно, но это не отвечает на вопрос: он не спрашивал о php, и вы не указываете оператор выбора или результат того, что он хочет, а только массив php, содержащий нужные ему столбцы.

gou1 15.05.2013 20:10

–1. Это не код SQL, и здесь нет оператора SELECT - это слово даже не встречается ни разу.

Frungi 23.07.2013 14:12

Это аккуратнее лишь в той степени, в которой (а) вам удобнее работать с PHP, чем с SQL, или (б) вам нравится размещать свой код на нескольких строках для удобства чтения. Я бы уступил пункт (б). Ваш подход также будет менее производительным, хотя во многих случаях разница будет незначительной. Также смотрите другие комментарии к вашему вопросу. Не стоит кричать, поэтому предложите вам удалить неприемлемый комментарий из исходного вопроса.

mc0e 11.09.2013 13:32

Я тоже этого хотел, поэтому вместо этого создал функцию.

public function getColsExcept($table,$remove){
    $res =mysql_query("SHOW COLUMNS FROM $table");

    while($arr = mysql_fetch_assoc($res)){
        $cols[] = $arr['Field'];
    }
    if (is_array($remove)){
        $newCols = array_diff($cols,$remove);
        return "`".implode("`,`",$newCols)."`";
    }else{
        $length = count($cols);
        for($i=0;$i<$length;$i++){
            if ($cols[$i] == $remove)
                unset($cols[$i]);
        }
        return "`".implode("`,`",$cols)."`";
    }
}

Итак, как это работает: вы вводите таблицу, а затем столбец, который вам не нужен, или как в массиве: array ("id", "name", "anycolumn")

Итак, в select вы можете использовать это так:

mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");

или же

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");

Если вы хотите исключить значение поля, например для проблем безопасности / конфиденциальной информации вы можете получить этот столбец как нулевой.

например

SELECT *, NULL AS salary FROM users

Почему? Не работает. Если у вас есть столбец salary, этот запрос просто завершится с результатами, содержащими два столбца с именем salary, один с нулями и один с фактическими зарплатами.

Myforwik 30.08.2013 03:50

@Myforwik Этот запрос действительно добавляет второй столбец salary. Но поскольку он извлекается после *, он перезаписывает оригинал. Это некрасиво, но работает.

Sean O 30.08.2013 22:17

Вы правы, @SeanO - я также не осознавал, что он заменяет исходный столбец. Очень аккуратный!

Alastair 13.09.2013 09:07

SQL всегда допускал повторяющиеся имена столбцов в наборе результатов. Если вы хотите, чтобы это сработало, вам нужно запустить его с клиентским приложением, которое не поддерживает дублирование. и отдает приоритет последнему дублированию. Официальный клиент командной строки поддерживает дублирование. HeidiSQL также поддерживает их. SQL Fiddle - нет, но отображает дублирование первый, не последнее. Подводя итог: это не работает.

Álvaro González 01.10.2013 12:24

Конечно не работает. Это отличный пример того, почему вы должны проверять свои ответы в самом mysql, а не через библиотеки, которые общаются с mysql.

Myforwik 03.10.2013 09:18

@SeanO, @ Alastair, @ Everyone, Не отменяет. Сервер по-прежнему возвращает конфиденциальные данные.

Pacerier 05.02.2015 07:23

Не работает. Возвращает два столбца, один с данными и один с нулями.

Ethan Allen 01.03.2017 22:43

похоже, что он сделает свою работу, но вместо этого добавляет новый столбец.

Chris Russo 16.09.2019 09:18

Если вы выберете Object или Assoc, он перезапишет столбцы

Ahmed Ali 17.02.2020 13:41

Пробуя решения @Mahomedalid и @Junaid, я обнаружил проблему. Так что подумал о том, чтобы поделиться им. Если в имени столбца есть пробелы или дефисы, такие как отметка, запрос завершится ошибкой. Простое решение - использовать обратную кавычку вокруг имен столбцов. Измененный запрос ниже

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

Может у меня есть решение, чтобы Яна Коритака указал на несоответствие

SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
    SELECT CASE
    WHEN COLUMN_NAME = 'eid' THEN NULL
    ELSE COLUMN_NAME
    END AS col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );

Стол :

SELECT table_name,column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'

================================

table_name  column_name
employee    eid
employee    name_eid
employee    sal

================================

Результат запроса:

'SELECT name_eid,sal FROM employee'

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

Вы можете использовать инструмент БД, такой как MySQL Workbench, чтобы сгенерировать для вас оператор выбора, поэтому вам просто нужно вручную удалить эти столбцы для сгенерированного оператора и скопировать его в свой сценарий SQL.

В MySQL Workbench способ его создания:

Щелкните правой кнопкой мыши по таблице -> отправить в редактор Sql -> Выбрать все инструкции.

Select * - это антипаттерн SQL. Его не следует использовать в производственном коде по многим причинам, в том числе:

Обработка занимает немного больше времени. Когда что-то запускается миллионы раз, эти крошечные биты могут иметь значение. Медленная база данных, в которой медлительность вызвана этим типом неаккуратного кодирования, является самым сложным для настройки производительности.

Это означает, что вы, вероятно, отправляете больше данных, чем вам нужно, что вызывает узкие места как на сервере, так и в сети. Если у вас есть внутреннее соединение, шансы отправить больше данных, чем вам нужно, составляют 100%.

Это вызывает проблемы с обслуживанием, особенно когда вы добавляете новые столбцы, которые не хотите видеть повсюду. Кроме того, если у вас есть новый столбец, вам может потребоваться что-то сделать с интерфейсом, чтобы определить, что делать с этим столбцом.

Это может нарушить представления (я знаю, что это правда на сервере SQl, это может быть или не быть правдой в mysql).

Если кому-то хватит глупости перестроить таблицы со столбцами в другом порядке (чего не следует делать, но это происходит постоянно), любой код может сломаться. Специально код для вставки, например, когда вы внезапно помещаете город в поле address_3, потому что без указания, база данных может идти только в порядке столбцов. Это достаточно плохо, когда типы данных меняются, но хуже, когда замененные столбцы имеют один и тот же тип данных, потому что вы можете иногда вставлять неверные данные, которые нужно очистить беспорядком. Вам нужно позаботиться о целостности данных.

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

Это может сломать триггеры. Проблемы с триггером бывает сложно диагностировать.

Сложите все это против времени, необходимого для добавления имен столбцов (черт возьми, у вас даже может быть интерфейс, который позволяет вам перетаскивать имена столбцов (я знаю, что делаю это в SQL Server, держу пари, что есть какой-то способ do this - это какой-то инструмент, который вы используете для написания запросов mysql.) Давайте посмотрим: «Я могу вызвать проблемы с обслуживанием, я могу вызвать проблемы с производительностью и я могу вызвать проблемы с целостностью данных, но эй, я сэкономил пять минут времени разработки». в нужных столбцах.

Я также предлагаю вам прочитать эту книгу: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1-1&keywords=sql+antipatterns

Я согласен с ответом @Mahomedalid, но я не хотел делать что-то вроде подготовленного оператора, и я не хотел вводить все поля, поэтому то, что у меня было, было глупым решением.

Перейдите в таблицу в phpmyadmin-> sql-> select, он выдает запрос: скопировать, заменить и готово! :)

У принятого ответа есть несколько недостатков.

  • Не работает там, где для имен таблиц или столбцов требуются обратные кавычки.
  • Это не сработает, если столбец, который вы хотите пропустить, находится последним в списке.
  • Требуется дважды указать имя таблицы (один раз для выбора, а другой - для текста запроса), что является избыточным и ненужным.
  • Он потенциально может возвращать имена столбцов в неправильный порядок

Все эти проблемы можно решить, просто включив обратные кавычки в SEPARATOR для вашего GROUP_CONCAT и используя условие WHERE вместо REPLACE(). Для моих целей (и я представляю себе многие другие) я хотел, чтобы имена столбцов возвращались в том же порядке, в котором они появляются в самой таблице. Для этого мы используем явное предложение ORDER BY внутри функции GROUP_CONCAT():

SELECT CONCAT(
    'SELECT `',
    GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
    '` FROM `',
    `TABLE_SCHEMA`,
    '`.`',
    TABLE_NAME,
    '`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
    AND `TABLE_NAME` = 'my_table'
    AND `COLUMN_NAME` != 'column_to_omit';

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

SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table

Если вы используете MySQL Workbench, вы можете щелкнуть правой кнопкой мыши свою таблицу и выбрать Send to sql editor, а затем Select All Statement. Это создаст оператор, в котором перечислены все поля, например:

SELECT `purchase_history`.`id`,
    `purchase_history`.`user_id`,
    `purchase_history`.`deleted_at`
FROM `fs_normal_run_2`.`purchase_history`;
SELECT * FROM fs_normal_run_2.purchase_history;

Теперь вы можете просто удалить те, которые вам не нужны.

Я использую эту работу, хотя она может быть «не по теме» - с использованием mysql workbench и построителя запросов -

  1. Откройте представление столбцов
  2. Shift выберите все столбцы, которые вы хотите в своем запросе (в вашем случае все, кроме одного, что я делаю)
  3. Щелкните правой кнопкой мыши и выберите отправить в редактор SQL-> краткое имя.
  4. Теперь у вас есть список, и вы можете скопировать и вставить запрос куда угодно.

Другие вопросы по теме