Resumen del curso/Escribe tu propio SQL1 de 4
Hazle una pregunta a una tabla
Hazle una pregunta a una tabla
Escribe SELECT, WHERE, ORDER BY y LIMIT a mano, y detecta tu primer fallo silencioso.
Lee una tabla antes de confiarle una al agente
Esta es la parte que no puedes saltarte. Una consulta que has escrito a mano es una consulta que puedes leer cuando un agente escriba la siguiente, así que escribe estas tú mismo.
Empieza por la forma de una consulta: SELECT nombra las columnas, FROM nombra la tabla y LIMIT limita las filas devueltas. AS cambia el nombre de una columna en la salida: cambia la etiqueta, no los datos.
bruin query --connection duckdb-default \
--description "preview orders with named columns" \
--query "SELECT order_id, ordered_at AS placed_at, order_total AS amount FROM orders LIMIT 5;"
WHERE conserva solo las filas que cumplen una condición. Combina condiciones con AND, OR y NOT. ORDER BY ordena y DISTINCT elimina las filas duplicadas del resultado.
bruin query --connection duckdb-default \
--description "large recent orders sorted by value" \
--query "SELECT order_id, order_total, order_status FROM orders WHERE order_total > 500 AND ordered_at >= '2024-01-01' ORDER BY order_total DESC LIMIT 10;"
Algunos filtros se leen casi como una frase y conviene conocerlos: BETWEEN 100 AND 200 busca un intervalo, IN ('USD', 'EUR') busca una lista, LIKE 'A%' busca un patrón de texto e IS NULL busca valores ausentes. Usa IS NULL, nunca = NULL, porque un valor nunca puede ser igual a algo que está ausente.
Tu primer fallo silencioso
Ahora viene la sorpresa. Cuenta los pedidos que no fueron cancelados:
bruin query --connection duckdb-default \
--description "naive count of orders that are not cancelled" \
--query "SELECT COUNT(*) FROM orders WHERE order_status != 'cancelled';"
La consulta devuelve 1.069. La respuesta correcta es 1.093. Algunos pedidos no tienen ningún estado: order_status es NULL en 24 filas. En SQL, NULL != 'cancelled' no es verdadero. Es desconocido, así que esas 24 filas se descartan sin decir nada. Es un fallo silencioso: la consulta se ejecutó, devolvió un número, el número es incorrecto y nada en pantalla lo sugiere. La regla es sencilla. Usa IS NULL, nunca = NULL, y recurre a IS DISTINCT FROM cuando quieras una comparación que trate NULL como un valor real.
Tu tarea
Trabaja los conceptos básicos en queries/01-first-look.sql. Escribe un SELECT que nombre columnas con AS, un WHERE que filtre y ordene con ORDER BY y limite filas con LIMIT; después reproduce el filtro silencioso de NULL. Ejecuta el recuento ingenuo y confirma que devuelve 1.069:
bruin query --connection duckdb-default \
--description "naive count of orders that are not cancelled" \
--query "SELECT COUNT(*) FROM orders WHERE order_status != 'cancelled';"
Después escribe una versión corregida que devuelva 1.093 y demuestra la diferencia contando los estados ausentes:
bruin query --connection duckdb-default \
--description "orders with a missing status" \
--query "SELECT COUNT(*) AS null_status FROM orders WHERE order_status IS NULL;"
null_status debe ser 24: exactamente la diferencia entre el recuento ingenuo y el correcto. Un filtro correcto conserva esas filas, por ejemplo WHERE order_status IS DISTINCT FROM 'cancelled'.
Comprueba lo que has entendido
- ¿Por qué
!= 'cancelled'devuelve menos filas de las esperadas? - ¿Cuál es la regla para comparar con NULL?
- ¿Cuántas filas descartó silenciosamente el filtro ingenuo?
Hazlo con tu agente
Di next lesson y tu agente impartirá esta lección, te hará estas preguntas y después asignará la tarea anterior. Hazla a mano y luego di review my work: ejecutará tu consulta, la comprobará con una rúbrica y te dirá qué debes corregir o marcará la lección como terminada.