«¿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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Consulta | una pregunta que haces a una base de datos | |
| Agregado | una cuenta o una suma de muchas filas | COUNT(*) |
| GROUP BY | reúne las filas en un grupo por cada valor | |
| HAVING | se queda con los grupos que pasan una prueba | |
| JOIN | une dos tablas por una columna que tienen en común | |
| Informe | la 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 jefe | Palabra que buscas | Pieza de SQL |
|---|---|---|
| ¿Cuántos pedidos hay? | cuántos | COUNT(*) |
| ¿Cuánto cuesta el producto más caro? | más caro | MAX(price) |
| ¿Cuántos pedidos hay de cada estado? | de cada | GROUP BY status |
| ¿Qué categorías tienen pocas unidades? | pocas | HAVING SUM(stock) < 60 |
| ¿Cómo se llama la categoría de cada producto? | el nombre de | JOIN categories |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Aceptar el certificado del servidor
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfSe 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
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
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
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
-- 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
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
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.name | products.category_id | categories.id | categories.name |
|---|---|---|---|
| Trowel | 3 | 3 | Garden |
| Teapot | 4 | 4 | Kitchen |
| Chef Knife | 4 | 4 | Kitchen |
| Ukulele | 5 | 5 | Music |
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.