Nivel 1 · Encuentra los pedidos reembolsados
¿Es nuevo para ti? Lee primero el concepto: Cómo decide WHERE qué filas se quedan
0 de 3
La solicitud

De Rachel Adams, Líder de Atención al Cliente
Tu objetivo
Desde orders, devuelve order_id, customer_id, order_date y channel de todos los pedidos cuyo status es 'refunded'.
- Lee de la tabla
orderspendiente - Muestra exactamente
order_idcustomer_idorder_datechannelpendiente - 304 filaspendiente
Tu consulta
Cargando el editor…
Solución de referencia
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Rachel, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NULL |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NULL |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NULL |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NULL |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NULL |
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NULL | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NULL | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NULL | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
WHERE conserva solo las filas para las que una condición es verdadera. Va después de FROM:
SELECT order_id, customer_id, order_date, channel
FROM orders
WHERE status = 'refunded';
Puedes filtrar por una columna que no seleccionas. status decide qué filas sobreviven, pero no tiene
por qué aparecer en la salida.
Operadores de comparación
| operador | significado |
|---|---|
= |
igual |
<> o != |
distinto (<> es el estándar de SQL; != funciona casi en todas partes) |
<, <=, >, >= |
menor / mayor que |
Los números se escriben tal cual (shipping_fee > 10), el texto y las fechas van entre comillas simples
(channel = 'app', signup_date >= '2025-01-01'). Las comillas dobles significan otra cosa en Postgres
y DuckDB: entrecomillan un identificador, como el nombre de una columna. WHERE status = "refunded" busca una
columna llamada refunded y falla. MySQL acepta comillas dobles para cadenas por defecto, un
hábito que conviene desaprender.
Las coincidencias exactas son exactas
'refunded', 'Refunded' y 'refunded ' (con un espacio al final) son tres valores distintos en
Postgres, DuckDB y BigQuery. MySQL compara texto sin distinguir mayúsculas por defecto, lo que oculta
datos desordenados hasta que la consulta pasa a otra base de datos. Antes de filtrar una columna de texto, ejecuta
SELECT DISTINCT status FROM orders; y copia los valores exactos que veas.
Cómo lee tu consulta la base de datos
Tú escribes SELECT ... FROM ... WHERE, pero la base de datos ejecuta lógicamente primero FROM, luego WHERE
y después SELECT. Por eso no puedes usar un alias de columna de la lista de SELECT dentro de WHERE en la mayoría de
las bases de datos:
-- fails in Postgres, MySQL and BigQuery
SELECT order_id, shipping_fee * 2 AS double_fee
FROM orders
WHERE double_fee > 20;
Repite mejor la expresión en WHERE. DuckDB es flexible y permite el alias, pero el SQL portable
no cuenta con eso. Esta idea del “orden lógico” vuelve con GROUP BY y HAVING en el capítulo 4,
donde es una pregunta favorita de las entrevistas.
Errores comunes
- Filtrar por una ortografía incorrecta del valor y luego reportar “cero reembolsos”. Si un filtro no devuelve nada, revisa los valores distintos antes de concluir.
- Filtrar por un número guardado como texto.
WHERE shipping_fee = '6.95'funciona en DuckDB y Postgres porque el literal se convierte, pero comparar columnas de texto con números puede fallar o comparar alfabéticamente en otras bases de datos. Usa el mismo tipo que la columna. - Usar
=con una lista de valores.status = 'refunded', 'cancelled'no es válido; necesitasIN, que viene a continuación.
En SQL Server
Los operadores de comparación son los mismos. Las comparaciones de texto normalmente no: la intercalación (collation) por defecto de SQL Server ignora las mayúsculas, así que esto coincide con ‘refunded’, ‘Refunded’ y ‘REFUNDED’ allí, mientras que DuckDB y Postgres coinciden solo con la ortografía exacta:
SELECT order_id FROM orders WHERE status = 'Refunded'; ¡Linterna encendida!
Practicaste: wherecomparison
- Resuelto
- Sin pistas
- Al primer intento
