Recuperación de datos en MySQL con la sentencia SELECT

La instrucción SELECT permite extraer información almacenada en tablas y vistas dentro de una base de datos MySQL.

Estructura general de SELECT

La sintaxis básica contempla las siguientes cláusulas:

  • SELECT: define qué columnas se desean obtener. Se pueden listar separadas por coma o usar * para traer todas.
  • FROM: indica la tabla o vista origen.
  • JOIN: combina registros de tablas relacionadas mediante condiciones de enlace.
  • WHERE: aplica filtros a nivel de fila.
  • GROUP BY: agrupa filas para aplicar fucniones de agregación.
  • HAVING: filtra grupos generados por GROUP BY.
  • ORDER BY: ordena el conjunto resultante.
  • LIMIT: restringe la cantidad de filas dveueltas.

Consultas básicas

Para obtener columnas específicas de una tabla de empleados:

SELECT apellido, nombre, cargo FROM empleados;

Para recuperar todas las columnas disponibles:

SELECT * FROM empleados;

Filtrado por condiciones

Búsqueda basada en valores numéricos:

SELECT * FROM alumnos WHERE calificacion > 90;

Búsqueda basada en texto:

SELECT nombre FROM empleados WHERE nombre = 'Tom';

Combinación de múltiples condiciones lógicas:

SELECT apellido, nombre, fecha_nac, region
FROM empleados
WHERE fecha_nac < '1995-02' AND (region = 'VA' OR region = 'BA');

Manejo de valores NULL

Los operadores convencionales no funcionan con NULL. Se deben emplear IS NULL o IS NOT NULL:

SELECT nombre, fecha_nac
FROM empleados
WHERE fecha_fallecimiento IS NULL;

Ordenamiento de resultados

SELECT apellido, nombre
FROM empleados
ORDER BY region DESC, apellido ASC;

Se ordena primero por región de forma descendente y, en caso de empate, por apellido ascendente.

Operaciones con fechas

En MySQL, el formato de fecha sigue el patrón Año-Mes-Día.

Filtrar por una fecha exacta:

SELECT * FROM eventos WHERE fecha = '2002-10-01';

Consultar un rango de fechas:

SELECT * FROM empleados
WHERE fecha_ingreso BETWEEN '2015-06-01' AND '2016-06-01';

Extraer componentes individuales de una fecha usando YEAR(), MONTH() y DAYOFMONTH():

SELECT apellido, nombre, fecha_nac, region
FROM empleados
WHERE MONTH(fecha_nac) = 7 AND DAYOFMONTH(fecha_nac) = 6;

Calcular diferencias entre fechas con TO_DAYS():

SELECT apellido, nombre,
       TO_DAYS(fecha_fallecimiento) - TO_DAYS(fecha_nac) AS edad
FROM presidentes;

Verificar registros próximos a vencer dentro de 60 días:

SELECT apellido, nombre, fecha_expiracion
FROM miembros
WHERE (TO_DAYS(fecha_expiracion) - TO_DAYS(CURDATE())) < 60;

Búsqueda por patrones

Se utilizan LIKE y NOT LIKE junto con comodines: _ representa un carácter y % representa múltiples caracteres.

SELECT CONCAT(nombre, ' ', apellido) AS nombre_completo
FROM empleados
WHERE apellido LIKE 'W%';

Para encontrar coincidencias en cualquier posición del apellido:

SELECT CONCAT(nombre, ' ', apellido) AS nombre_completo
FROM empleados
WHERE apellido LIKE '%W%';

Limitación de resultados

Obtener los primeros 5 registros ordenados por fecha de naciimento:

SELECT apellido, nombre, fecha_nac, region
FROM presidentes
ORDER BY fecha_nac
LIMIT 5;

Saltar los primeros 10 registros y devolver los 5 siguientes:

SELECT apellido, nombre, fecha_nac, region
FROM presidentes
ORDER BY fecha_nac
LIMIT 10, 5;

Seleccionar un registro aleatorio mediante RAND():

SELECT apellido, nombre, fecha_nac, region
FROM presidentes
ORDER BY RAND()
LIMIT 1;

Agregación y estadísticas

Eliminar duplicados con DISTINCT:

SELECT DISTINCT region FROM presidentes;

Contar el total de registros con COUNT(). COUNT(*) incluye filas con NULL; COUNT(columna) las excluye:

SELECT COUNT(*) FROM presidentes;

Agrupar resultados con GROUP BY para obtener conteos por categoría:

SELECT sexo, COUNT(*) AS total
FROM estudiantes
GROUP BY sexo;

Obtener los 4 estados con mayor número de presidentes:

SELECT region, COUNT(*) AS cantidad
FROM presidentes
GROUP BY region
ORDER BY cantidad DESC
LIMIT 4;

Consultas con múltiples tablas (JOIN)

La combinación de tablas permite relacionar información distribuida en distintas entidades. Se referencia cada columna como tabla.columna para evitar ambigüedades.

Obtener calificaciones de estudiantes por evento en una fecha específica:

SELECT s.id_estudiante, e.fecha, s.puntaje, e.tipo
FROM eventos e, calificaciones s
WHERE e.fecha = '2003-09-12'
  AND e.id_evento = s.id_evento;

Reemplazar el identificador por el nombre del estudiante incorporando una tercera tabla:

SELECT est.nombre, ev.nombre AS evento, s.puntaje, ev.tipo
FROM eventos ev, calificaciones s, estudiantes est
WHERE ev.fecha = '2003-09-12'
  AND ev.id_evento = s.id_evento
  AND s.id_estudiante = est.id_estudiante;

Contar ausencias por estudiante:

SELECT est.id_estudiante, est.nombre,
       COUNT(a.fecha) AS total_ausencias
FROM estudiantes est, ausencias a
WHERE est.id_estudiante = a.id_estudiante
GROUP BY est.id_estudiante;

Etiquetas: MySQL select JOIN group by WHERE

Publicado el 6-27 17:01