Tema SQL

GROUP_CONCAT() (MySQL / MariaDB)

Agregado que concatena valores de un grupo en una sola cadena, con separador configurable y orden opcional. Muy usado para listas legibles en informes; el límite de longitud lo controla group_concat_max_len.

Todos los temas

129 tema(s) · elige uno para abrirlo

SELECT básico INNER JOIN LEFT JOIN Filtro sobre agregados (HAVING) Subconsulta escalar en WHERE INSERT: nuevas filas UPDATE: modificar filas existentes DELETE UNION / UNION ALL CTE (WITH) DISTINCT EXISTS (subconsulta) CASE (expresión condicional) GROUP BY ORDER BY RIGHT JOIN CROSS JOIN CREATE TABLE CREATE INDEX CREATE VIEW ALTER TABLE TRUNCATE TABLE MERGE / UPSERT Tipos de datos SQL WHERE: predicados y filtros LIMIT, OFFSET y FETCH LIKE y comodines IN y BETWEEN ANY, SOME y ALL Funciones de agregación Funciones escalares (texto, número,... COALESCE, NULLIF e IFNULL/ISNULL FULL OUTER JOIN SELF JOIN Subconsulta correlacionada INTERSECT y EXCEPT / MINUS CTE recursiva (WITH RECURSIVE) Funciones de ventana (OVER) DROP VIEW DROP INDEX DROP TABLE CREATE DATABASE Restricciones: NOT NULL, UNIQUE, PRI... FOREIGN KEY (clave foránea) Secuencias e identidad (AUTO_INCREME... Tablas temporales GRANT y REVOKE (DCL) Transacciones (BEGIN, COMMIT, ROLLBA... Triggers (disparadores) Procedimientos almacenados Funciones definidas por el usuario JSON en SQL LATERAL y APPLY (CROSS / OUTER) PIVOT y UNPIVOT RETURNING y OUTPUT FETCH … WITH TIES y OFFSET/FETCH DISTINCT ON (PostgreSQL) TABLESAMPLE FOR UPDATE, SKIP LOCKED y NOWAIT FIND_IN_SET() (MySQL / MariaDB) GROUP_CONCAT() (MySQL / MariaDB) IF() (MySQL / MariaDB) IFNULL() (MySQL / MariaDB) NULLIF() (MySQL / MariaDB) FIELD() (MySQL / MariaDB) ELT() (MySQL / MariaDB) STR_TO_DATE() (MySQL / MariaDB) DATE_FORMAT() (MySQL / MariaDB) TIMESTAMPDIFF() (MySQL / MariaDB) UUID() (MySQL / MariaDB) RAND() (MySQL / MariaDB) CONCAT_WS() (MySQL / MariaDB) SUBSTRING_INDEX() (MySQL / MariaDB) JSON_EXTRACT() (MySQL / MariaDB) JSON_UNQUOTE() (MySQL / MariaDB) MAKE_SET() (MySQL / MariaDB) EXPORT_SET() (MySQL / MariaDB) SLEEP() (MySQL / MariaDB) BENCHMARK() (MySQL / MariaDB) STRING_AGG() (SQL Server) ISNULL() (SQL Server) GETDATE() (SQL Server) SYSDATETIME() (SQL Server) DATEDIFF() (SQL Server) DATEADD() (SQL Server) IIF() (SQL Server) CHOOSE() (SQL Server) TRY_CAST / TRY_CONVERT (SQL Server) NEWID() (SQL Server) generate_series() (PostgreSQL) unnest() (PostgreSQL) array_agg() (PostgreSQL) jsonb_build_object() (PostgreSQL) jsonb_each() (PostgreSQL) to_tsvector() (PostgreSQL) to_tsquery() (PostgreSQL) set_config() (PostgreSQL) current_setting() (PostgreSQL) pg_sleep() (PostgreSQL) LAST_INSERT_ID() (MySQL / MariaDB) MATCH() … AGAINST() (MySQL / MariaDB... INSERT … ON DUPLICATE KEY UPDATE (My... UNIX_TIMESTAMP() / FROM_UNIXTIME() (... JSON_TABLE() (MySQL / MariaDB) REGEXP / RLIKE (MySQL / MariaDB) CONV() (MySQL / MariaDB) QUOTE() (MySQL / MariaDB) INSERT IGNORE (MySQL / MariaDB) ANY_VALUE() (MySQL / MariaDB) FOR JSON (SQL Server) CROSS APPLY / OUTER APPLY (SQL Serve... STUFF() (SQL Server) FORMAT() (SQL Server) TRY_PARSE() (SQL Server) EOMONTH() (SQL Server) STRING_SPLIT() (SQL Server) PIVOT (SQL Server) AT TIME ZONE (SQL Server) OPENJSON (SQL Server) date_trunc() (PostgreSQL) age() (PostgreSQL) jsonb_path_query / SQL/JSON (Postgre... Operadores de array (PostgreSQL) COPY (PostgreSQL) row_to_json / to_jsonb (PostgreSQL) Tipos rango (PostgreSQL) INTERVAL (PostgreSQL) FILTER en agregados (PostgreSQL) GENERATED … AS IDENTITY (PostgreSQL)

Descripción

GROUP_CONCAT([DISTINCT] expr [ORDER BY …] [SEPARATOR str]) resume muchas filas en un texto. DISTINCT elimina duplicados antes de concatenar; ORDER BY define el orden de los valores en la cadena resultante; SEPARATOR cambia el coma por defecto (p. ej. salto de línea o « | »). En sesiones con group_concat_max_len bajo, el resultado se trunca sin error explícito en algunos modos: revisa el valor en entornos de producción. No es estándar SQL: en otros motores se usan STRING_AGG (SQL Server, PostgreSQL ≥14 con sintaxis similar), LISTAGG (Oracle) o agregados personalizados. Para datos jerárquicos grandes, una cadena gigante puede ser señal de que conviene otra forma de serialización (JSON_ARRAYAGG en motores que lo permitan).

Estructura general

Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.

SQL
GROUP_CONCAT([DISTINCT] expresión [ORDER BY …] [SEPARATOR 'cad'])

Componentes

Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.

Contexto GROUP BY
Se usa junto a GROUP BY; las columnas no agrupadas deben ir dentro del agregado o en GROUP BY.
DISTINCT
Evita repetir valores idénticos en la lista concatenada.
ORDER BY interno
Ordena los valores antes de concatenar (no confundir con ORDER BY del SELECT exterior).
Límite de longitud
Ajusta group_concat_max_len si concatenas muchos valores.

Ejemplos

Ejemplo 1

SQL
SELECT departamento_id,
       GROUP_CONCAT(nombre ORDER BY nombre SEPARATOR ', ') AS empleados
FROM empleados
GROUP BY departamento_id;

Ejemplo 2

SQL
SELECT usuario_id,
       GROUP_CONCAT(DISTINCT tag ORDER BY tag SEPARATOR ' | ') AS tags
FROM usuario_tags
GROUP BY usuario_id;

Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.