MÓDULO 2 · CLASE 1
Anatomía de una consulta SELECT
Clase de lectura. Las partes de un SELECT, en qué orden se escriben, en qué orden las procesa el motor y cómo tratar los valores NULL.
Idea clave
Los ejemplos usan la basetablas_libro (USE tablas_libro;). SELECT es la instrucción para leer datos. Se escribe con sus cláusulas en un orden fijo, pero el motor las procesa en otro orden. Entender esa diferencia evita la mayoría de los errores de principiante.1. Las cláusulas, en el orden en que se escriben
SELECT columnas o cálculos -- qué mostrar
FROM tabla -- de dónde
WHERE condición sobre filas -- qué filas entran
GROUP BY columnas -- cómo agrupar
HAVING condición sobre grupos -- qué grupos quedan
ORDER BY columnas [ASC|DESC] -- cómo ordenar
LIMIT n; -- cuántas filas devolverSolo SELECT es obligatorio (y casi siempre FROM). El resto es opcional, pero si aparece tiene que respetar este orden: por ejemplo, HAVING va después de GROUP BY y antes de ORDER BY.
2. El orden lógico: cómo la procesa el motor
| Paso | Cláusula | Qué hace |
|---|---|---|
| 1 | FROM (y JOIN) | Toma la tabla o une las tablas |
| 2 | WHERE | Filtra filas |
| 3 | GROUP BY | Forma grupos |
| 4 | HAVING | Filtra grupos |
| 5 | SELECT | Calcula las columnas y los alias |
| 6 | ORDER BY | Ordena el resultado |
| 7 | LIMIT | Recorta la cantidad de filas |
Consecuencia práctica
ComoWHERE se procesa antes que SELECT, no podés usar en WHERE un alias creado en el SELECT. En MySQL sí podés usarlo en ORDER BY, GROUP BY y HAVING.-- Error: el alias "total" todavía no existe en WHERE
SELECT ID_LINEA, CANTIDAD * PRECIO AS total
FROM lineas_factura
WHERE total > 5;
-- Correcto: repetir la expresión en WHERE (o usar el alias en ORDER BY)
SELECT ID_LINEA, ROUND(CANTIDAD * PRECIO, 2) AS total
FROM lineas_factura
WHERE CANTIDAD * PRECIO > 5
ORDER BY total DESC;
-- línea 1 → 27.78 · línea 3 → 6.63. Piezas que vas a usar todo el tiempo
- Alias con
AS: renombran columnas o tablas en el resultado (SUM(SALARIO) AS total_salarios). - DISTINCT: elimina filas repetidas (
SELECT DISTINCT CARGO FROM empleados). - Operadores en
WHERE:=,<>,>,BETWEEN,IN,LIKE, combinados conAND,ORyNOT. - ORDER BY con
ASC(por defecto) oDESC, y LIMIT para un “top N”. - Comentarios:
-- una líneao/* varias líneas */.
4. El valor NULL
NULL significa “sin dato”: no es cero ni texto vacío. Por eso no se compara con =:
-- Vehículos sin inspección previa (ULTI_ITV vacía)
-- No devuelve nada: NULL = NULL no es verdadero
SELECT MARCA, MODELO FROM vehiculos WHERE ULTI_ITV = NULL;
-- Correcto → Alfa Romeo Brera, BMW X3, Ford Fiesta
SELECT MARCA, MODELO FROM vehiculos WHERE ULTI_ITV IS NULL;
SELECT MARCA, MODELO FROM vehiculos WHERE ULTI_ITV IS NOT NULL;Además, las funciones de agregación (SUM, AVG, COUNT(columna)) ignoran los NULL; COUNT(*) cuenta todas las filas. En vehiculos, COUNT(*) da 5 y COUNT(ULTI_ITV) da 2.
Buenas prácticas
EvitáSELECT * en reportes: pedí solo las columnas que necesitás. Escribí las palabras clave en mayúsculas, una cláusula por línea, y terminá cada instrucción con ;.Bibliografía
- MySQL 8.0 Reference Manual. SELECT Statement.
- MySQL 8.0 Reference Manual. Retrieving Information from a Table.
- MySQL 8.0 Reference Manual. Examples of Common Queries.
- MySQL 8.0 Reference Manual. Aggregate Function Descriptions.
El manual oficial de MySQL está en inglés; podés usar el traductor del navegador.
Siguiente clase: Primeras consultas SQL.
