¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Consultas SQL para sacar informes

Después de esta lección: Puedo responder a la pregunta de un jefe con una consulta SQL.

Lección de 50 min6 comandosLaboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

«¿Cuánto hemos vendido por categoría?»

Una consulta SQL es una pregunta que le haces a una base de datos, y la base te devuelve las filas que la responden. Con ella sacas un informe en segundos, sin contar nada a mano.

Tu encargada de la tienda te pregunta cuántos productos hay de cada categoría. En una hoja tardarías un rato. Con una consulta, es una sola línea.

Al terminar esta lección

Nota

Puedo responder a la pregunta de un jefe con una consulta SQL.

Palabras clave

PalabraQué significaEjemplo
Consultauna pregunta que haces a una base de datos
Agregadouna cuenta o una suma de muchas filasCOUNT(*)
GROUP BYreúne las filas en un grupo por cada valor
HAVINGse queda con los grupos que pasan una prueba
JOINune dos tablas por una columna que tienen en común
Informela respuesta ordenada a una pregunta de trabajo

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Cómo convertir una pregunta en SQL

Casi todas las preguntas de un jefe llevan las mismas piezas. «Cuántos» pide una cuenta. «En total» pide una suma. «Por categoría» pide un grupo. «Con el nombre de» pide unir otra tabla.

Primero subraya esas palabras en la pregunta. Después escribe la consulta pieza a pieza.

Ejemplo resuelto: de la pregunta a la consulta

Pregunta del jefePalabra que buscasPieza de SQL
¿Cuántos pedidos hay?cuántosCOUNT(*)
¿Cuánto cuesta el producto más caro?más caroMAX(price)
¿Cuántos pedidos hay de cada estado?de cadaGROUP BY status
¿Qué categorías tienen pocas unidades?pocasHAVING SUM(stock) < 60
¿Cómo se llama la categoría de cada producto?el nombre deJOIN categories

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Aceptar el certificado del servidor

Comando
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un nombre corto para la tienda

Comando
alias sql='mariadb -h db -u student -pstudent shop -t -e'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un agregado resume muchas filas en un número

Los agregados más usados son COUNT (cuántas filas), SUM (la suma), AVG (la media), MIN (el menor) y MAX (el mayor).

Sin más, un agregado resume toda la tabla en una sola fila. Ponle un nombre al resultado con AS, para que el informe se lea bien.

El producto más barato y el más caro

Comando
sql "SELECT MIN(price) AS cheapest, MAX(price) AS dearest FROM products"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

GROUP BY da un resumen por cada grupo

Con GROUP BY obtienes un resumen por cada valor distinto de una columna. Es la pieza de «por categoría», «por mes» o «por estado».

La columna del grupo va en el SELECT y en el GROUP BY. El agregado va solo en el SELECT.

Pedidos de cada estado

Comando
sql "SELECT status, COUNT(*) AS orders FROM orders GROUP BY status ORDER BY status"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pruébalo: ventas por producto

Código: sql
-- Cuántas ventas y cuántas unidades tiene cada producto.
SELECT item_id, COUNT(*) AS sales_count, SUM(quantity) AS units
FROM sales
GROUP BY item_id
ORDER BY units DESC;
-- Cambia SUM(quantity) por MAX(quantity) y ejecútalo otra vez.

HAVING filtra los grupos

WHERE filtra filas antes de formar los grupos. HAVING filtra los grupos una vez formados, y se usa con un agregado.

El orden de las piezas es siempre el mismo: WHERE, GROUP BY, HAVING y ORDER BY.

Categorías con menos de 60 unidades

Comando
sql "SELECT categories.name, SUM(products.stock) AS units FROM products JOIN categories ON categories.id = products.category_id GROUP BY categories.name HAVING SUM(products.stock) < 60 ORDER BY units"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

JOIN une dos tablas por una columna común

Los productos guardan solo el número de su categoría, category_id. El nombre está en la tabla categories.

JOIN ... ON junta cada producto con la categoría cuyo id coincide. Si dos tablas tienen una columna con el mismo nombre, escribe antes la tabla: categories.name.

Productos de cada categoría

Comando
sql "SELECT categories.name, COUNT(*) AS items FROM products JOIN categories ON categories.id = products.category_id GROUP BY categories.name ORDER BY items DESC, categories.name"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: coincidir por la clave

products.nameproducts.category_idcategories.idcategories.name
Trowel33Garden
Teapot44Kitchen
Chef Knife44Kitchen
Ukulele55Music

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que un JOIN muestra todas las filas de la primera tabla. Un JOIN normal solo deja las filas que tienen pareja. Por eso las dos filas de productos sin categoría no salen en el informe. Cuéntalas aparte si importan.

Para ir más lejos

Escribe la consulta del laboratorio que dice cuántos pedidos hay en cada estado, pero solo de los pedidos hechos por el empleado número 6. Piensa si necesitas WHERE o HAVING.

Después explica con tus palabras por qué el informe de categorías no incluye las dos filas de productos sin categoría.

Sobre este laboratorio y su código: Laboratorio de MySQL y phpMyAdmin con una base de datos de una tienda para practicar SQL

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.