Resumen del curso/Escribe tu propio SQL1 de 4

Hazle una pregunta a una tabla

AnteriorSiguiente

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.

Sign up to our newsletter

Practical updates on open-source data pipelines, AI analysts, governance, and what we are shipping at Bruin.

The signup form is hosted by Brevo. Allow marketing cookies to load it.