Regla
Evite SELECCIONE * en SQL consultas.
SELECT * en producción código hace que aplicaciones
frágiles a esquema cambios y oscurece datos dependencias.
Idiomas admitidos: 45+Introducción
Utilizando SELECCIONAR * en las consultas de producción recupera todas las columnas de una tabla, incluidas las que la aplicación no utiliza. Cuando los esquemas de las bases de datos evolucionan y se añaden nuevas columnas (incluyendo datos sensibles como contraseñas o PII), las consultas que utilizan SELECCIONAR * empezar a recuperarlos automáticamente sin cambios en el código. Esto crea vulnerabilidades de seguridad y rompe suposiciones en la lógica de tu aplicación.
Por qué es importante
Impacto en el rendimiento: La recuperación de columnas innecesarias aumenta el tiempo de ejecución de la consulta, el tamaño de la transferencia de red y el consumo de memoria. Una tabla con 50 columnas cuando solo se necesitan 5 significa que se están transfiriendo 10 veces más datos de los necesarios, lo que degrada los tiempos de respuesta y aumenta los costes de infraestructura.
Implicaciones para la seguridad: Las nuevas columnas añadidas a las tablas (campos de auditoría, indicadores internos, datos sensibles de los usuarios) se exponen automáticamente a través de SELECCIONAR * consultas. Su API podría empezar a filtrar hashes de contraseñas, SSN o datos empresariales internos que nunca estuvieron destinados a ese punto final.
Mantenimiento del código: En SELECCIONAR * las consultas se rompen tras cambios en el esquema, el fallo se produce en tiempo de ejecución, no en tiempo de compilación. Una nueva columna no anulable o un campo renombrado provocan errores de producción. Las listas de columnas explícitas aclaran las dependencias y rompen las compilaciones cuando los esquemas cambian de forma incompatible.
Ejemplos de códigos
❌ No conforme:
async function getUserProfile(userId) {
const query = 'SELECT * FROM users WHERE id = ?';
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Por qué es incorrecto: Esta consulta recupera todas las columnas, incluidos los campos potencialmente sensibles como password_hash, ssn, internal_notes o deleted_at. A medida que crece el esquema, esta consulta se vuelve más lenta y expone más datos, aunque la aplicación solo utiliza tres campos.
✅ Conforme:
async function getUserProfile(userId) {
const query = `
SELECT name, email, created_at
FROM users
WHERE id = ?
`;
const [user] = await db.execute(query, [userId]);
return {
name: user.name,
email: user.email,
createdAt: user.created_at
};
}
Conclusión
Especifique siempre listas de columnas explícitas en las consultas SQL. Esto evita fugas de datos, mejora el rendimiento y aclara las dependencias entre el código y el esquema. El pequeño coste inicial de escribir los nombres de las columnas evita toda una serie de problemas de seguridad y rendimiento.
.avif)
