Generador de consultas SQL
Crea una instrucción SELECT sin escribirla: elige una tabla, añade JOIN (la condición ON se rellena a partir de tus claves foráneas), elige columnas y agregados, añade filtros WHERE y HAVING, ordena y limita. La herramienta escribe SQL limpio y formateado para MySQL, PostgreSQL, SQLite o SQL Server y explica cualquier cosa que fallaría.
Última actualización:
Tus tablas
FROM
Columnas de SELECT
WHERE (filtrar filas)
GROUP BY y HAVING
ORDER BY y LIMIT
Tu SQL
Cómo usar Generador de consultas SQL
- Revisa tus tablas: abre Tus tablas y pega instrucciones CREATE TABLE, o conserva el esquema de tienda online de ejemplo.
- Elige la tabla de FROM y añade JOIN. La herramienta sugiere una tabla relacionada y rellena las columnas de ON a partir de las claves foráneas; ajústalas si hace falta.
- Elige las columnas que se devolverán, con una función opcional como COUNT o SUM y un alias.
- Añade filtros: las condiciones WHERE filtran filas y las condiciones HAVING filtran grupos después de la agregación.
- Ordena y limita, elige tu base de datos y luego copia o descarga el SQL.
Anatomía de una consulta SELECT
La consulta de ejemplo que se crea al cargar responde a una pregunta real: ¿qué clientes de EE. UU. y Canadá hicieron al menos dos pedidos y cuánto gastaron?
| Cláusula | En el ejemplo | Propósito |
|---|---|---|
| SELECT | c.id, c.full_name, COUNT(o.id) AS order_count, SUM(o.total) AS total_spent | Columnas y valores calculados que se devuelven |
| FROM / JOIN | customers AS c LEFT JOIN orders AS o ON o.customer_id = c.id | De dónde vienen las filas y cómo se relacionan las tablas |
| WHERE | c.country IN ('US', 'CA') | Filtrar filas individuales |
| GROUP BY | c.id, c.full_name | Una fila de resultado por cliente |
| HAVING | COUNT(o.id) >= 2 | Filtrar grupos usando agregados |
| ORDER BY | total_spent DESC | Ordenar el resultado, aquí por un alias |
| LIMIT | LIMIT 10 | Devolver solo las primeras filas |
Tipos de JOIN
| JOIN | Devuelve | Uso habitual |
|---|---|---|
| INNER JOIN | Solo las filas con coincidencia en ambas tablas | Pedidos con su cliente |
| LEFT JOIN | Todas las filas de la izquierda, con NULL donde el lado derecho no tiene coincidencia | Todos los clientes, incluidos los que no tienen pedidos |
| RIGHT JOIN | Todas las filas de la derecha, con NULL donde el lado izquierdo no tiene coincidencia | Rara vez hace falta; intercambia las tablas y usa LEFT JOIN |
| FULL JOIN | Todas las filas de ambos lados | Conciliar dos listas (no disponible en MySQL) |
| CROSS JOIN | Todas las combinaciones de filas | Generar una cuadrícula calendario × producto |
Consejos para consultas correctas y rápidas
- Filtra una tabla unida con LEFT JOIN en la cláusula ON, no en WHERE:
WHERE o.status = 'paid'elimina a los clientes sin pedidos y convierte silenciosamente el LEFT JOIN en un INNER JOIN. - COUNT(columna) omite los NULL, mientras que COUNT(*) cuenta filas, así que con un LEFT JOIN usa
COUNT(o.id)para obtener 0 en los clientes sin pedidos. - Usa siempre ORDER BY al paginar con LIMIT / OFFSET; de lo contrario, las filas pueden cambiar de página.
- Indexa las columnas usadas en JOIN … ON y WHERE, sobre todo claves foráneas como
orders.customer_id. - Usa parámetros en el código de tu aplicación (
WHERE email = ?) en lugar de pegar la entrada del usuario en el SQL.
Preguntas frecuentes
¿En qué orden ejecuta SQL las cláusulas?
Lógicamente, un SELECT se evalúa como FROM y JOIN, luego WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY y, por último, LIMIT / OFFSET. Por eso WHERE no puede usar agregados ni alias de columnas, HAVING sí puede usar agregados y ORDER BY puede usar los alias de SELECT.
¿Cuál es la diferencia entre WHERE y HAVING?
WHERE filtra filas individuales antes de agruparlas, así que no puede usar funciones como COUNT o SUM. HAVING filtra los grupos después de GROUP BY; por ejemplo, HAVING COUNT(o.id) >= 2 para quedarse solo con los clientes con al menos dos pedidos.
¿Cuál es la diferencia entre INNER JOIN y LEFT JOIN?
INNER JOIN devuelve solo las filas que tienen coincidencia en ambas tablas. LEFT JOIN devuelve todas las filas de la tabla izquierda y rellena con NULL las columnas de la tabla derecha cuando no hay coincidencia, así que los clientes sin pedidos siguen apareciendo con un conteo de 0.
¿Por qué toda columna no agregada debe estar en GROUP BY?
Cuando las filas se agrupan, cada fila de salida representa muchas filas de entrada, así que una columna simple debe tener un único valor por grupo. El SQL estándar exige que esté en GROUP BY (PostgreSQL permite columnas que dependen de una clave primaria agrupada, y el modo ONLY_FULL_GROUP_BY de MySQL aplica la regla). El generador las añade automáticamente.
¿Cómo se escribe LIMIT en SQL Server?
SQL Server no tiene LIMIT. El generador usa SELECT TOP (n) para un límite simple, y ORDER BY … OFFSET n ROWS FETCH NEXT m ROWS ONLY cuando además omites filas. OFFSET requiere una cláusula ORDER BY.
¿Cómo se ponen entre comillas los valores de los filtros?
Los números comparados con columnas numéricas quedan sin comillas; los demás valores se convierten en literales de cadena, con las comillas simples duplicadas por seguridad. Las listas IN se dividen por comas. Los valores como :name, ?, $1 o @param se conservan como marcadores de parámetros, que es lo que deberías usar en el código de tu aplicación para evitar la inyección SQL.
¿El generador ejecuta la consulta?
No. Solo escribe el texto SQL en tu navegador. Ejecútalo en tu cliente de base de datos, o pruébalo con un archivo CSV usando la herramienta Consultar CSV con SQL.
¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?
Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.