El comando SHOW DATABASES es generalmente la primera sentencia que ejecutas al conectarte a un servidor MySQL. Te muestra todas las bases de datos a las que tienes acceso, dándote una vista rápida del contenido del servidor. Aunque parece un comando simple, tiene opciones de filtrado y una relación directa con el sistema de permisos que vale la pena entender.

Uso básico

La sintaxis más simple lista todas las bases de datos visibles para tu usuario:

SHOW DATABASES;
Database
information_schema
erp_produccion
mysql
performance_schema
sys
tienda_online

El resultado siempre incluye las bases de datos del sistema: information_schema, mysql, performance_schema y sys. Estas bases de datos son internas de MySQL y contienen metadatos, estadísticas de rendimiento y utilidades de diagnóstico.

Un usuario solo ve las bases de datos sobre las que tiene algún privilegio. Si un usuario tiene acceso únicamente a tienda_online, ese será el único resultado (junto con information_schema, que siempre es visible):

-- Conectado como usuario 'app_tienda'
SHOW DATABASES;
Database
information_schema
tienda_online

Filtrar con LIKE

Puedes filtrar los resultados usando la cláusula LIKE con los comodines % (cualquier secuencia de caracteres) y _ (un solo carácter):

-- Bases de datos que empiezan con 'erp'
SHOW DATABASES LIKE 'erp%';
Database (erp%)
erp_produccion
-- Bases de datos que contienen 'tienda'
SHOW DATABASES LIKE '%tienda%';
Database (%tienda%)
tienda_online
-- Bases de datos con exactamente 3 caracteres
SHOW DATABASES LIKE '___';
Database (___)
sys

El filtrado con LIKE es útil cuando el servidor tiene muchas bases de datos y necesitas encontrar una específica rápidamente.

Filtrar con WHERE

Para filtros más complejos, puedes usar la cláusula WHERE:

-- Bases de datos que no son del sistema
SHOW DATABASES
WHERE `Database` NOT IN
  ('information_schema', 'mysql', 'performance_schema', 'sys');
Database
erp_produccion
tienda_online
-- Bases de datos cuyo nombre tiene más de 10 caracteres
SHOW DATABASES WHERE LENGTH(`Database`) > 10;
Database
erp_produccion
information_schema
performance_schema
tienda_online

Equivalente con information_schema

El comando SHOW DATABASES es en realidad un atajo para consultar la tabla SCHEMATA del information_schema. La consulta equivalente sería:

SELECT SCHEMA_NAME
FROM information_schema.SCHEMATA
ORDER BY SCHEMA_NAME;
SCHEMA_NAME
erp_produccion
information_schema
mysql
performance_schema
sys
tienda_online

La ventaja de consultar information_schema directamente es que puedes obtener información adicional como el juego de caracteres por defecto de cada base de datos:

SELECT
  SCHEMA_NAME AS base_datos,
  DEFAULT_CHARACTER_SET_NAME AS charset,
  DEFAULT_COLLATION_NAME AS collation
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME NOT IN
  ('information_schema', 'mysql', 'performance_schema', 'sys')
ORDER BY SCHEMA_NAME;
base_datoscharsetcollation
erp_produccionutf8mb4utf8mb4_unicode_ci
tienda_onlineutf8mb4utf8mb4_general_ci

Esta información es útil cuando necesitas verificar que todas las bases de datos usan el juego de caracteres correcto. Tener bases de datos con collations diferentes puede causar problemas en consultas que cruzan datos entre ellas.

Caso práctico: inventario de bases de datos con estadísticas

Como administrador, a menudo necesitas un informe que muestre no solo los nombres de las bases de datos, sino también cuántas tablas tiene cada una y cuánto espacio ocupan:

SELECT
  s.SCHEMA_NAME AS base_datos,
  COUNT(t.TABLE_NAME) AS num_tablas,
  ROUND(SUM(t.DATA_LENGTH + t.INDEX_LENGTH) / 1024 / 1024, 2)
    AS tamaño_mb
FROM information_schema.SCHEMATA s
LEFT JOIN information_schema.TABLES t
  ON s.SCHEMA_NAME = t.TABLE_SCHEMA
WHERE s.SCHEMA_NAME NOT IN
  ('information_schema', 'mysql', 'performance_schema', 'sys')
GROUP BY s.SCHEMA_NAME
ORDER BY tamaño_mb DESC;
base_datosnum_tablastamaño_mb
erp_produccion948012.45
tienda_online382201.30

Caso práctico: verificar la existencia de una base de datos en scripts

En scripts de automatización, a menudo necesitas verificar si una base de datos existe antes de intentar crearla o conectarte a ella:

SELECT SCHEMA_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'tienda_online';

Si la consulta devuelve una fila, la base de datos existe. Si no devuelve nada, no existe. Puedes usar esto en scripts de shell:

DB_EXISTE=$(mysql --login-path=produccion -N -e \
  "SELECT COUNT(*) FROM information_schema.SCHEMATA
   WHERE SCHEMA_NAME = 'tienda_online'")
 
if [ "$DB_EXISTE" -eq 1 ]; then
  echo "La base de datos existe"
else
  echo "La base de datos NO existe"
fi

O directamente en SQL con CREATE DATABASE IF NOT EXISTS:

CREATE DATABASE IF NOT EXISTS tienda_analytics
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

SHOW DATABASES es un comando que usarás constantemente como punto de partida para explorar un servidor. En el siguiente artículo veremos SHOW TABLES, que te permite explorar el contenido de una base de datos específica.

Escrito por Eduardo Lázaro