La solicitud

De Ashley Rivera, Líder de Contenido Web
Tu objetivo
Desde products, devuelve product_id, name, category y unit_price de los productos que están activos (is_active es verdadero), en la categoría 'Lighting' o 'Decor', y con unit_price menor a 50.
- Lee de la tabla
productspendiente - Muestra exactamente
product_idnamecategoryunit_pricependiente - 12 filaspendiente
Tu consulta
Cargando el editor…
Solución de referencia
| product_id | name | category | subcategory | unit_price |
|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Ashley, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
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 |
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 |
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 |
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
Los filtros reales tienen varias condiciones. AND exige todas, OR exige al menos una:
SELECT name, unit_price
FROM products
WHERE category = 'Kitchen'
AND unit_price >= 100;
La trampa de la precedencia
AND se evalúa antes que OR, igual que la multiplicación va antes que la suma. Esta consulta parece
correcta y no lo es:
-- bug: returns every Lighting product, plus cheap Decor products
WHERE category = 'Lighting' OR category = 'Decor' AND unit_price < 50
La base de datos la lee como category = 'Lighting' OR (category = 'Decor' AND unit_price < 50). El
límite de precio solo se aplica a Decor. La solución son los paréntesis:
WHERE (category = 'Lighting' OR category = 'Decor') AND unit_price < 50
Regla práctica: siempre que AND y OR aparezcan en la misma cláusula WHERE, añade paréntesis, aunque
creas que no hacen falta. Quien te revise te lo agradecerá.
IN es un OR más limpio
IN comprueba un valor contra una lista y hace desaparecer el problema de precedencia:
WHERE category IN ('Lighting', 'Decor')
AND unit_price < 50
NOT IN excluye una lista: WHERE status NOT IN ('cancelled', 'refunded'). Ojo, sin embargo: si la
lista puede contener un NULL (por ejemplo cuando viene de una subconsulta), NOT IN no devuelve ninguna
fila. El capítulo 7 explica por qué y muestra la alternativa segura NOT EXISTS.
Booleanos
is_active es una columna booleana, así que ya es una condición. WHERE is_active y
WHERE is_active = true son equivalentes en Postgres, DuckDB y BigQuery. MySQL guarda los booleanos como
TINYINT(1) y allí normalmente verás WHERE is_active = 1. Para conservar los productos inactivos, escribe
WHERE NOT is_active.
Comprueba el conteo en ambos sentidos
Cuando un filtro tiene varias condiciones, una comprobación rápida es quitar una condición a la vez y ver cómo cambia el conteo de filas. Si quitar el límite de precio no cambia el conteo, el límite no está haciendo nada, lo que suele significar un error de precedencia o un valor equivocado. Toma segundos y detecta la mayoría de los errores de AND/OR antes de que nadie más vea los números.
Errores comunes
- Escribir
category = 'Lighting' AND category = 'Decor'. Una sola fila no puede tener dos categorías, así que esto siempre devuelve nada. “Lighting y Decor” en lenguaje cotidiano normalmente significa OR en SQL. - Olvidar que
<excluye el límite. “Menos de $50” significa< 50; “$50 o menos” significa<= 50. Cuando un ticket es vago, pregunta, o explica en tu respuesta la elección que hiciste.
En SQL Server
AND, OR, IN y su precedencia son iguales. SQL Server no tiene tipo booleano; las banderas son columnas BIT
con 1 o 0, así que el WHERE is_active a secas no funciona allí:
WHERE category IN ('Lighting', 'Decor') AND unit_price < 50 AND is_active = 1 ¡Linterna encendida!
Practicaste: andorinprecedence
- Resuelto
- Sin pistas
- Al primer intento
