¿Seleccionar todas las columnas excepto una en MySQL?
365
Estoy tratando de usar una instrucción select para obtener todas las columnas de una determinada tabla MySQL, excepto una. ¿Hay una manera simple de hacer esto?
EDITAR: hay 53 columnas en esta tabla (NO ES MI DISEÑO)
53 columnas? Me quedaría con SELECT * como Thomas sugiere en ese caso ... a menos que esa columna adicional tenga una gran cantidad de datos que no sería deseable recuperar ...?
Mike Stone el
Excepto una columna ... Supongo que sabes cuál debe ignorarse, por lo tanto, INFORMATION_SCHEMA.columns es el camino.
La columna de datos grandes es un problema real cuando se mantienen los datos geográficos. Las columnas pueden tener muchos megabytes de tamaño. Funcionan bien en las cláusulas where para buscar filas, pero a menudo no desea esos datos en los resultados.
Jason
Un uso común para esto es excluir la columna de ID de incremento automático. Por ejemplo, para seleccionar los datos que se insertarán en una tabla diferente, que tiene su propia ID.
ToolmakerSteve
Respuestas:
222
En realidad, hay una manera, por supuesto, necesitas tener permisos para hacer esto ...
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;
Sustitución <table>, <database> and <columns_to_omit>
advertencia: las consultas INFORMATION_SCHEMA tienen un rendimiento bastante bajo, así que tenga cuidado de que este tipo de consulta no esté en la ruta crítica para nada.
Bill Karwin
99
Como dijo @Jan Koritak a continuación, esta respuesta en realidad no funciona si las columnas del título que desea eliminar también son una subcadena del título para cualquier columna que desee conservar. Hay una mejor respuesta similar a esta que se puede encontrar aquí .
donL
8
Esto es mucho peor que solo especificar las columnas, que es una mejor práctica conocida.
HLGEM
3
Esto no funciona si hay espacios en los nombres de columna. Debería actualizarse para siempre rodear los nombres en las <column_name>
comillas inversas
3
Esto tampoco funcionará si la columna a ignorar es la última que aparece en la estructura de la tabla (porque el reemplazo no coincidirá con el coma final).
Vincent Pazeller
61
En las definiciones mysql (manual) no existe tal cosa. Pero si tiene una gran cantidad de columnas col1, ... col100, lo siguiente puede ser útil:
Me dio un mensaje de error en el tercer paso: "El recuento de columnas no coincide con el recuento de valores en la fila 1". Así que cambié el paso 2 a "ACTUALIZAR temp_tb SET id = NULL" y luego funcionó.
oyvey
1
Ok, esto funciona. Pero cuando vuelvo a ejecutar esta consulta, me da un error, que temp_tb ya existe. ¿Durante cuánto tiempo está temp_tb en la memoria? Disculpas si es una pregunta estúpida. PD votó tu respuesta.
Karan
2
@Karan Para ejecutar esta consulta repetidamente, agregue otro comando al principio:DROP TABLE IF EXISTS temp_tb;
gregn3
1
@Karan Para especificar el motor de memoria, use el comando: de lo CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); contrario, se guarda en el disco de manera predeterminada y sobrevive al reinicio del servidor. ( gracias )
gregn3
Excelente respuesta Para soltar varias columnas , consulte esta respuesta .
¡JAJA! Si seguro. Ahora, ¿cómo construye la vista para incluir todo PERO una de las columnas? Creo que ves cómo esto plantea la pregunta original. De hecho, encontré este hilo específicamente porque quería crear una vista que excluyera ciertas columnas sin ser obligado a enumerar todas las columnas restantes explícitamente en la definición de la vista.
La mayoría de las respuestas mejor calificadas en su mayoría solo están buscando formas de generar esta consulta exacta sin escribir a mano
mehtunguh
55
En realidad, por razones de mantenimiento, es útil tener un tipo de consulta "todo menos". De lo contrario, las listas de campos explícitos deben actualizarse si se agregan nuevos campos más adelante.
leiavoia
1
@lev, eso es correcto y DEBEN SER !!! BEporque no sabe si desea tener columnas futuras (pueden ser columnas de metadatos o que no se apliquen a una pantalla en particular). Usted no; desea dañar el rendimiento al devolver más de lo que necesita (lo cual es cierto el 100% del tiempo cuando tiene una unión interna) Le sugiero que lea un poco sobre por qué select * es un antipatrón SQL.
HLGEM
26
El OP indica que hay> 50 columnas, por lo que esto es poco práctico.
augurar
1
@HLGEM No realmente, quería seleccionar todas las columnas sin mantener la consulta cada vez que agrego una nueva columna, excepto una, y esto no funcionaría simplemente en mi caso. Pero de todos modos apliqué la solución de Sean O para mí
OverCoder,
26
Si desea excluir el valor de un campo, por ejemplo, por cuestiones de seguridad / información confidencial, puede recuperar esa columna como nula.
¿Por qué? No funciona Si tiene un salario de columna, esta consulta terminará con los resultados que tienen dos columnas llamadas salario, una llena de nulos y otra con los salarios reales.
Myforwik
44
@ Myforwik Esta consulta sí agrega una segunda salarycolumna. Pero como se recupera después del *, sobrescribe el original. No es bonito, pero funciona.
Sean O
68
SQL siempre ha permitido nombres de columna duplicados en un conjunto de resultados. Si desea que esto funcione, debe ejecutarlo con una aplicación cliente que no admite duplicados y le da prioridad al último duplicado. El cliente oficial de línea de comandos admite dupes. HeidiSQL también los admite. SQL Fiddle no lo hace, pero muestra el primer duplicado, no el último. En resumen: esto no funciona .
Álvaro González el
99
Por supuesto que no funciona. Este es un gran ejemplo de por qué debería probar sus respuestas en mysql, en lugar de a través de bibliotecas que hablan con mysql.
Myforwik
8
@SeanO, @ Alastair, @ Todos, no anulan. El servidor aún devuelve datos confidenciales.
Pacerier
22
Que yo sepa, no lo hay. Puedes hacer algo como:
SELECT col1, col2, col3, col4 FROM tbl
y elija manualmente las columnas que desee. Sin embargo, si quieres muchas columnas, entonces quizás solo quieras hacer:
SELECT*FROM tbl
e ignora lo que no quieres.
En su caso particular, sugeriría:
SELECT*FROM tbl
a menos que solo quieras unas pocas columnas. Si solo quieres cuatro columnas, entonces:
SELECT col3, col6, col45, col 52FROM tbl
estaría bien, pero si desea 50 columnas, entonces cualquier código que haga que la consulta sea (¿demasiado?) difícil de leer.
Seleccionar * es una mala elección siempre. No lo recomiendo Lea sobre por qué es un antipatrón SQl.
HLGEM
18
Mientras probaba las soluciones de @Mahomedalid y @Junaid, encontré un problema. Entonces pensé en compartirlo. Si el nombre de la columna tiene espacios o guiones como el check-in, la consulta fallará. La solución simple consiste en utilizar una marca de retroceso alrededor de los nombres de columna. La consulta modificada está debajo
SET@SQL = CONCAT('SELECT ',(SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME,"`"))FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'AND COLUMN_NAME NOTIN('id')),' FROM users');
PREPARE stmt1 FROM@SQL;EXECUTE stmt1;
Si la columna que no deseaba seleccionar tenía una gran cantidad de datos, y no deseaba incluirla debido a problemas de velocidad y seleccionó las otras columnas con frecuencia, le sugiero que cree una nueva tabla con el campo que normalmente no selecciona con una clave de la tabla original y elimine el campo de la tabla original. Únase a las tablas cuando ese campo adicional sea realmente requerido.
Mi principal problema son las muchas columnas que obtengo al unir tablas. Si bien esta no es la respuesta a su pregunta (cómo seleccionar todas las columnas excepto una de una tabla), creo que vale la pena mencionar que puede especificar obtener todas las columnas de una tabla en particular, en lugar de solo especificartable. .
Aquí hay un ejemplo de cómo esto podría ser muy útil:
seleccionar usuarios. *, phone.meta_value como teléfono, zipcode.meta_value como código postal
de los usuarios
izquierda unirse a user_meta como teléfono
on ((users.user_id = phone.user_id) AND (phone.meta_key = 'phone'))
left join user_meta como código postal
on ((users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode'))
El resultado son todas las columnas de la tabla de usuarios y dos columnas adicionales que se unieron desde la metatabla.
gracias, necesito seleccionar todas las columnas de la primera tabla y solo un campo de la segunda tabla para unirme y su respuesta me ayudó.
mohammad falahat
5
Me gustó la respuesta @Mahomedalidademás de este hecho informado en el comentario de @Bill Karwin. El posible problema planteado por@Jan Koritak es cierto. Lo enfrenté, pero he encontrado un truco para eso y solo quiero compartirlo aquí para cualquiera que se enfrente al problema.
podemos reemplazar la función REPLACE con la cláusula where en la subconsulta de la instrucción Preparada de esta manera:
Usando mi tabla y nombre de columna
SET@SQL = CONCAT('SELECT ',(SELECT GROUP_CONCAT(COLUMN_NAME)FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'AND COLUMN_NAME NOTIN('id')),' FROM users');
PREPARE stmt1 FROM@SQL;EXECUTE stmt1;
Entonces, esto va a excluir solo el campo idpero nocompany_id
Actúa como un contrato con el código y cuando mira la consulta, sabe exactamente qué datos puede extraer de ella sin mirar el esquema de la tabla.
mbillard
66
@kodecraft: es una buena práctica por la misma razón por la que es una buena práctica siempre devolver el mismo tipo de una función (incluso si trabaja en un idioma que no se aplica). Básicamente solo el Principio de Menos Sorpresa.
Daniel Pryden
4
Solo haz
SELECT*FROMtableWHERE whatever
Luego suelte la columna en su lenguaje de programación favorito: php
A menos que la columna que desea excluir sea un BLOB enorme o algo así.
Bill Karwin
1
Esto es malo si está tratando de evitar el desperdicio de datos.
Kristopher Ives
1 columna de 53 no debería hacer ninguna diferencia. Si lo hace, probablemente sea un mal diseño.
Petr Peller
1
SElect * es un antipatrón SQL y nunca debe usarse en código de producción.
HLGEM
1
No estoy de acuerdo con que SELECT * sea algún tipo de antipatrón que "nunca" debería usarse en el código de producción. Es mucho más claro que ha recuperado todas sus columnas, en comparación con la referencia cruzada de una larga lista de columnas que, de hecho, pueden ser todos los campos. También, muy obviamente, es más rápido de codificar, con diferencia. Y hay muchos, muchos casos en los que los campos de la tabla corresponderán exactamente a los campos en una vista o formulario.
Geoff Kendall
4
Estoy de acuerdo con la solución "simple" de enumerar todas las columnas, pero esto puede ser oneroso y los errores tipográficos pueden causar mucho tiempo perdido. Uso una función "getTableColumns" para recuperar los nombres de mis columnas adecuados para pegar en una consulta. Entonces todo lo que necesito hacer es eliminar aquellos que no quiero.
CREATEFUNCTION`getTableColumns`(tablename varchar(100))
RETURNS varchar(5000) CHARSET latin1
BEGINDECLARE done INT DEFAULT0;DECLARE res VARCHAR(5000)DEFAULT"";DECLARE col VARCHAR(200);DECLARE cur1 CURSORFORselect COLUMN_NAME from information_schema.columns
where TABLE_NAME=@tableAND TABLE_SCHEMA="yourdatabase"ORDERBY ORDINAL_POSITION;DECLARECONTINUE HANDLER FORNOT FOUND SET done =1;OPEN cur1;
REPEAT
FETCH cur1 INTO col;IFNOT done THENset res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);ENDIF;
UNTIL done END REPEAT;CLOSE cur1;RETURN res;
Su resultado devuelve una cadena delimitada por comas, por ejemplo ...
Esto será terriblemente lento para cualquier mesa de tamaño moderado.
Joel
3
Estoy de acuerdo en que no es suficiente Select *, si ese que no necesita, como se menciona en otro lugar, es un BLOB, no desea que esa sobrecarga se arrastre.
Crearía una vista con los datos requeridos, luego puede Select *hacerlo con comodidad, si el software de la base de datos los admite. De lo contrario, ponga los enormes datos en otra tabla.
Al principio pensé que podrías usar expresiones regulares, pero como he estado leyendo los documentos MYSQL parece que no puedes. Si fuera usted, usaría otro lenguaje (como PHP) para generar una lista de columnas que desea obtener, almacenarla como una cadena y luego usarla para generar el SQL.
Estoy de acuerdo con la respuesta de @ Mahomedalid, pero no quería hacer algo como una declaración preparada y no quería escribir todos los campos, así que lo que tenía era una solución tonta.
Vaya a la tabla en phpmyadmin-> sql-> select, volcará la consulta: ¡copie, reemplace y listo! :)
Si bien estoy de acuerdo con la respuesta de Thomas (+1;)), me gustaría agregar la advertencia de que asumiré que la columna que no desea contiene casi ningún dato. Si contiene enormes cantidades de texto, xml o blobs binarios, tómese el tiempo para seleccionar cada columna individualmente. Su rendimiento sufrirá lo contrario. ¡Salud!
La respuesta publicada por Mahomedalid tiene un pequeño problema:
El código de función de reemplazo interno estaba reemplazando "<columns_to_delete>, " por "", este reemplazo tiene un problema si el campo a reemplazar es el último en la cadena de concat debido a que el último no tiene la coma "," y no se elimina de la cuerda.
Mi propuesta:
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>');
Sustitución <table>,<database> y `
La columna eliminada se reemplaza por la cadena "FIELD_REMOVED" en mi caso, esto funciona porque estaba tratando de proteger la memoria. (El campo que estaba eliminando es un BLOB de alrededor de 1 MB)
Puede ser que tenga una solución a la discrepancia señalada de Jan Koritak
SELECT CONCAT('SELECT ',(SELECT GROUP_CONCAT(t.col)FROM(SELECTCASEWHEN COLUMN_NAME ='eid'THENNULLELSE COLUMN_NAME
ENDAS col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='employee'AND TABLE_SCHEMA ='test') t
WHERE t.col ISNOTNULL),' FROM employee');
Mesa :
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
Puede usar SQL para generar SQL si lo desea y evaluar el SQL que produce. Esta es una solución general, ya que extrae los nombres de columna del esquema de información. Aquí hay un ejemplo de la línea de comandos de Unix.
Sustituyendo
MYSQL con tu comando mysql
TABLE con el nombre de la tabla
Campo excluido con nombre de campo excluido
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
Realmente solo necesitará extraer los nombres de columna de esta manera solo una vez para construir la lista de columnas excluidas de esa columna, y luego simplemente usar la consulta que ha construido.
Entonces algo como:
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)
Ahora puede reutilizar la $column_listcadena en las consultas que construya.
Me gustaría agregar otro punto de vista para resolver este problema, especialmente si tiene que eliminar una pequeña cantidad de columnas.
Puede usar una herramienta de base de datos como MySQL Workbench para generar la instrucción select por usted, por lo que solo tiene que eliminar manualmente esas columnas para la instrucción generada y copiarla en su script SQL.
En MySQL Workbench, la forma de generarlo es:
Haga clic derecho en la tabla -> enviar al Editor SQL -> Seleccionar toda la declaración.
Falla donde los nombres de tabla o columna requieren puntos de retroceso
Falla si la columna que desea omitir es la última en la lista
Requiere enumerar el nombre de la tabla dos veces (una para seleccionar y otra para el texto de la consulta) lo cual es redundante e innecesario
Potencialmente puede devolver nombres de columna en el orden incorrecto
Todos estos problemas pueden superarse simplemente incluyendo backticks en el SEPARATORpara su GROUP_CONCATy utilizando una WHEREcondición en lugar de REPLACE(). Para mis propósitos (e imagino muchos otros), quería que los nombres de las columnas se devolvieran en el mismo orden en que aparecen en la tabla. Para lograr esto, aquí usamos una ORDER BYcláusula explícita dentro de la GROUP_CONCAT()función:
Tengo una sugerencia pero no una solución. Si algunas de sus columnas tienen conjuntos de datos más grandes, entonces debería intentar con lo siguiente
Llegué bastante tarde en encontrar una respuesta para esto, dicho es como siempre lo he hecho y, francamente, es 100 veces mejor y más ordenado que la mejor respuesta, solo espero que alguien lo vea. Y encontrarlo útil
//create an array, we will call it here.$here = array();//create an SQL query inorderto get allof the column names
$SQL ="SHOW COLUMNS FROM Table";//put allof 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]);
Puede que esté ordenado, pero no responde a la pregunta: no ha preguntado sobre php, y no da una declaración de selección o el resultado de lo que quiere, sino solo una matriz de php que contiene las columnas que desea.
gou1
2
–1. Esto no es código SQL, y no hay ninguna SELECTdeclaración aquí, la palabra ni siquiera aparece una vez.
Frungi
Esto es más simple en la medida en que (a) se sienta más cómodo con PHP que con SQL, o (b) le guste distribuir su código en varias líneas para facilitar su lectura. Reconozco el punto (b). Su enfoque también sería menos eficaz, aunque la diferencia sería menor en muchos casos de uso. También vea otros comentarios sobre su pregunta. No vale la pena gritar, así que sugiero que elimine su comentario inapropiado de la pregunta original.
mc0e
-5
Select * es un antipatrón SQL. No debe usarse en el código de producción por muchas razones, incluyendo:
Se tarda un poco más en procesar. Cuando las cosas se ejecutan millones de veces, esas pequeñas partes pueden importar. Una base de datos lenta donde la lentitud es causada por este tipo de codificación descuidada es el tipo más difícil de ajustar.
Significa que probablemente esté enviando más datos de los que necesita, lo que causa cuellos de botella en el servidor y en la red. Si tiene una unión interna, las posibilidades de enviar más datos de los que necesita son del 100%.
Causa problemas de mantenimiento, especialmente cuando ha agregado nuevas columnas que no desea ver en todas partes. Además, si tiene una nueva columna, es posible que deba hacer algo en la interfaz para determinar qué hacer con esa columna.
Puede romper vistas (sé que esto es cierto en el servidor SQl, puede o no ser cierto en mysql).
Si alguien es lo suficientemente tonto como para reconstruir las tablas con las columnas en un orden diferente (lo cual no debe hacer pero sucede todo el tiempo), todo tipo de código puede romperse. Especialmente codifique un inserto, por ejemplo, donde de repente está colocando la ciudad en el campo address_3 porque no especifica, la base de datos solo puede ir en el orden de las columnas. Esto es lo suficientemente malo cuando cambian los tipos de datos, pero peor cuando las columnas intercambiadas tienen el mismo tipo de datos, ya que puede insertar datos incorrectos que son un desastre para limpiar. Debe preocuparse por la integridad de los datos.
Si se usa en una inserción, la romperá si se agrega una nueva columna en una tabla pero no en la otra.
Puede romper los disparadores. Los problemas de activación pueden ser difíciles de diagnosticar.
Agregue todo esto al tiempo que toma agregar los nombres de las columnas (diablos, incluso puede tener una interfaz que le permita arrastrar los nombres de las columnas (sé que lo hago en SQL Server, apuesto a que hay alguna forma de hacer esto es alguna herramienta que utiliza para escribir consultas mysql.) Veamos, "Puedo causar problemas de mantenimiento, puedo causar problemas de rendimiento y problemas de integridad de datos, pero bueno, ahorré cinco minutos de tiempo de desarrollo". en las columnas específicas que quieras.
Respuestas:
En realidad, hay una manera, por supuesto, necesitas tener permisos para hacer esto ...
Sustitución
<table>, <database> and <columns_to_omit>
fuente
<column_name>
En las definiciones mysql (manual) no existe tal cosa. Pero si tiene una gran cantidad de columnas
col1
, ...col100
, lo siguiente puede ser útil:fuente
DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb);
contrario, se guarda en el disco de manera predeterminada y sobrevive al reinicio del servidor. ( gracias )¿Una vista funcionaría mejor en este caso?
fuente
Tu puedes hacer:
sin obtener la columna 3, aunque tal vez estabas buscando una solución más general?
fuente
Si desea excluir el valor de un campo, por ejemplo, por cuestiones de seguridad / información confidencial, puede recuperar esa columna como nula.
p.ej
fuente
salary
columna. Pero como se recupera después del *, sobrescribe el original. No es bonito, pero funciona.Que yo sepa, no lo hay. Puedes hacer algo como:
y elija manualmente las columnas que desee. Sin embargo, si quieres muchas columnas, entonces quizás solo quieras hacer:
e ignora lo que no quieres.
En su caso particular, sugeriría:
a menos que solo quieras unas pocas columnas. Si solo quieres cuatro columnas, entonces:
estaría bien, pero si desea 50 columnas, entonces cualquier código que haga que la consulta sea (¿demasiado?) difícil de leer.
fuente
Mientras probaba las soluciones de @Mahomedalid y @Junaid, encontré un problema. Entonces pensé en compartirlo. Si el nombre de la columna tiene espacios o guiones como el check-in, la consulta fallará. La solución simple consiste en utilizar una marca de retroceso alrededor de los nombres de columna. La consulta modificada está debajo
fuente
Si la columna que no deseaba seleccionar tenía una gran cantidad de datos, y no deseaba incluirla debido a problemas de velocidad y seleccionó las otras columnas con frecuencia, le sugiero que cree una nueva tabla con el campo que normalmente no selecciona con una clave de la tabla original y elimine el campo de la tabla original. Únase a las tablas cuando ese campo adicional sea realmente requerido.
fuente
Puede usar DESCRIBE my_table y usar los resultados para generar la instrucción SELECT dinámicamente.
fuente
Mi principal problema son las muchas columnas que obtengo al unir tablas. Si bien esta no es la respuesta a su pregunta (cómo seleccionar todas las columnas excepto una de una tabla), creo que vale la pena mencionar que puede especificar obtener todas las columnas de una tabla en particular, en lugar de solo especificar
table.
.
Aquí hay un ejemplo de cómo esto podría ser muy útil:
El resultado son todas las columnas de la tabla de usuarios y dos columnas adicionales que se unieron desde la metatabla.
fuente
Me gustó la respuesta
@Mahomedalid
además de este hecho informado en el comentario de@Bill Karwin
. El posible problema planteado por@Jan Koritak
es cierto. Lo enfrenté, pero he encontrado un truco para eso y solo quiero compartirlo aquí para cualquiera que se enfrente al problema.podemos reemplazar la función REPLACE con la cláusula where en la subconsulta de la instrucción Preparada de esta manera:
Usando mi tabla y nombre de columna
Entonces, esto va a excluir solo el campo
id
pero nocompany_id
fuente
Es una buena práctica especificar las columnas que está consultando incluso si consulta todas las columnas.
Por lo tanto, le sugiero que escriba el nombre de cada columna en la declaración (excluyendo la que no desea).
fuente
Solo haz
Luego suelte la columna en su lenguaje de programación favorito: php
fuente
Estoy de acuerdo con la solución "simple" de enumerar todas las columnas, pero esto puede ser oneroso y los errores tipográficos pueden causar mucho tiempo perdido. Uso una función "getTableColumns" para recuperar los nombres de mis columnas adecuados para pegar en una consulta. Entonces todo lo que necesito hacer es eliminar aquellos que no quiero.
Su resultado devuelve una cadena delimitada por comas, por ejemplo ...
fuente
Sí, aunque puede ser una alta E / S, dependiendo de la tabla, aquí hay una solución que encontré.
fuente
Estoy de acuerdo en que no es suficiente
Select *
, si ese que no necesita, como se menciona en otro lugar, es un BLOB, no desea que esa sobrecarga se arrastre.Crearía una vista con los datos requeridos, luego puede
Select *
hacerlo con comodidad, si el software de la base de datos los admite. De lo contrario, ponga los enormes datos en otra tabla.fuente
Al principio pensé que podrías usar expresiones regulares, pero como he estado leyendo los documentos MYSQL parece que no puedes. Si fuera usted, usaría otro lenguaje (como PHP) para generar una lista de columnas que desea obtener, almacenarla como una cadena y luego usarla para generar el SQL.
fuente
Yo también quería esto, así que creé una función en su lugar.
Entonces, cómo funciona es que ingrese la tabla, luego una columna que no desea o como en una matriz: matriz ("id", "nombre", "cualquier columna")
Entonces, en select, podría usarlo así:
o
fuente
Estoy de acuerdo con la respuesta de @ Mahomedalid, pero no quería hacer algo como una declaración preparada y no quería escribir todos los campos, así que lo que tenía era una solución tonta.
Vaya a la tabla en phpmyadmin-> sql-> select, volcará la consulta: ¡copie, reemplace y listo! :)
fuente
Si bien estoy de acuerdo con la respuesta de Thomas (+1;)), me gustaría agregar la advertencia de que asumiré que la columna que no desea contiene casi ningún dato. Si contiene enormes cantidades de texto, xml o blobs binarios, tómese el tiempo para seleccionar cada columna individualmente. Su rendimiento sufrirá lo contrario. ¡Salud!
fuente
La respuesta publicada por Mahomedalid tiene un pequeño problema:
El código de función de reemplazo interno estaba reemplazando "
<columns_to_delete>,
" por "", este reemplazo tiene un problema si el campo a reemplazar es el último en la cadena de concat debido a que el último no tiene la coma "," y no se elimina de la cuerda.Mi propuesta:
Sustitución
<table>
,<database>
y `La columna eliminada se reemplaza por la cadena "FIELD_REMOVED" en mi caso, esto funciona porque estaba tratando de proteger la memoria. (El campo que estaba eliminando es un BLOB de alrededor de 1 MB)
fuente
Basado en la respuesta @Mahomedalid, he realizado algunas mejoras para admitir "seleccionar todas las columnas excepto algunas en mysql"
Si tiene muchos cols, use este sql para cambiar group_concat_max_len
fuente
Puede ser que tenga una solución a la discrepancia señalada de Jan Koritak
Mesa :
================================
================================
Resultado de la consulta:
fuente
Si siempre es la misma columna, puede crear una vista que no la tenga.
De lo contrario, no, no lo creo.
fuente
Puede usar SQL para generar SQL si lo desea y evaluar el SQL que produce. Esta es una solución general, ya que extrae los nombres de columna del esquema de información. Aquí hay un ejemplo de la línea de comandos de Unix.
Sustituyendo
Realmente solo necesitará extraer los nombres de columna de esta manera solo una vez para construir la lista de columnas excluidas de esa columna, y luego simplemente usar la consulta que ha construido.
Entonces algo como:
Ahora puede reutilizar la
$column_list
cadena en las consultas que construya.fuente
Me gustaría agregar otro punto de vista para resolver este problema, especialmente si tiene que eliminar una pequeña cantidad de columnas.
Puede usar una herramienta de base de datos como MySQL Workbench para generar la instrucción select por usted, por lo que solo tiene que eliminar manualmente esas columnas para la instrucción generada y copiarla en su script SQL.
En MySQL Workbench, la forma de generarlo es:
Haga clic derecho en la tabla -> enviar al Editor SQL -> Seleccionar toda la declaración.
fuente
La respuesta aceptada tiene varias deficiencias.
Todos estos problemas pueden superarse simplemente incluyendo backticks en el
SEPARATOR
para suGROUP_CONCAT
y utilizando unaWHERE
condición en lugar deREPLACE()
. Para mis propósitos (e imagino muchos otros), quería que los nombres de las columnas se devolvieran en el mismo orden en que aparecen en la tabla. Para lograr esto, aquí usamos unaORDER BY
cláusula explícita dentro de laGROUP_CONCAT()
función:fuente
Tengo una sugerencia pero no una solución. Si algunas de sus columnas tienen conjuntos de datos más grandes, entonces debería intentar con lo siguiente
fuente
Llegué bastante tarde en encontrar una respuesta para esto, dicho es como siempre lo he hecho y, francamente, es 100 veces mejor y más ordenado que la mejor respuesta, solo espero que alguien lo vea. Y encontrarlo útil
fuente
SELECT
declaración aquí, la palabra ni siquiera aparece una vez.Select * es un antipatrón SQL. No debe usarse en el código de producción por muchas razones, incluyendo:
Se tarda un poco más en procesar. Cuando las cosas se ejecutan millones de veces, esas pequeñas partes pueden importar. Una base de datos lenta donde la lentitud es causada por este tipo de codificación descuidada es el tipo más difícil de ajustar.
Significa que probablemente esté enviando más datos de los que necesita, lo que causa cuellos de botella en el servidor y en la red. Si tiene una unión interna, las posibilidades de enviar más datos de los que necesita son del 100%.
Causa problemas de mantenimiento, especialmente cuando ha agregado nuevas columnas que no desea ver en todas partes. Además, si tiene una nueva columna, es posible que deba hacer algo en la interfaz para determinar qué hacer con esa columna.
Puede romper vistas (sé que esto es cierto en el servidor SQl, puede o no ser cierto en mysql).
Si alguien es lo suficientemente tonto como para reconstruir las tablas con las columnas en un orden diferente (lo cual no debe hacer pero sucede todo el tiempo), todo tipo de código puede romperse. Especialmente codifique un inserto, por ejemplo, donde de repente está colocando la ciudad en el campo address_3 porque no especifica, la base de datos solo puede ir en el orden de las columnas. Esto es lo suficientemente malo cuando cambian los tipos de datos, pero peor cuando las columnas intercambiadas tienen el mismo tipo de datos, ya que puede insertar datos incorrectos que son un desastre para limpiar. Debe preocuparse por la integridad de los datos.
Si se usa en una inserción, la romperá si se agrega una nueva columna en una tabla pero no en la otra.
Puede romper los disparadores. Los problemas de activación pueden ser difíciles de diagnosticar.
Agregue todo esto al tiempo que toma agregar los nombres de las columnas (diablos, incluso puede tener una interfaz que le permita arrastrar los nombres de las columnas (sé que lo hago en SQL Server, apuesto a que hay alguna forma de hacer esto es alguna herramienta que utiliza para escribir consultas mysql.) Veamos, "Puedo causar problemas de mantenimiento, puedo causar problemas de rendimiento y problemas de integridad de datos, pero bueno, ahorré cinco minutos de tiempo de desarrollo". en las columnas específicas que quieras.
También le sugiero que lea este libro: 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 y palabras clave = sql + antipatterns
fuente