N006-M4 Tier 1 · Foundations · medium ecommerce · Brightlane

Return the name and price of every product in the sweep

Part of Boolean Logic in WHERE (AND, OR, NOT) in SQL

The problem

Brightlane's promotions team is sweeping products into a clearance event. The sweep covers two groups: products priced below $30, and products that have not yet been assigned to a category.

Write a query to return the name and price of every product in the sweep.

Assumptions:

  • The products table contains every product in Brightlane's catalogue.
  • A product that has not been assigned to a category has category_id set to NULL.
  • A product qualifies for the sweep if it satisfies either condition; products that satisfy both still appear once.

Output:

  • One row per qualifying product, with columns name and price.
Schema · ecommerce 5 tables
categories
id integer
name text
parent_id? integer
products
id integer
name text
category_id integer
price numeric
stock_qty integer
attributes? jsonb
order_items
id integer
order_id integer
product_id integer
quantity integer
unit_price numeric
customers
id integer
name text
email text
city? text
country text
created_at timestamptz
is_active boolean
orders
id integer
customer_id integer
ordered_at timestamptz
status text
total_amount numeric

Run previews · Check grades

Write a query, then run it to see results here.

Worked solution Try it yourself first
Solution query
SELECT
  name,
  price
FROM
  products
WHERE
  price < 30
  OR category_id IS NULL

The shape

A price comparison and an IS NULL test joined by OR — the sweep grabs anything cheap and anything uncategorised. Each row is evaluated once, so a product that satisfies both conditions still appears once.

Clause by clause

  • SELECT name, price returns the two columns the promotions team needs to staff the clearance event.
  • FROM products reads the catalogue.
  • WHERE price < 30 OR category_id IS NULL is the qualifying rule. price < 30 keeps rows priced under $30 — items like the Kids' T-Shirt at 19.99 and the Yoga Mat at 29.99. category_id IS NULL keeps rows that haven't been assigned to a category yet, which is why Gift Card $50 and Gift Card $100 show up despite being well above $30. The OR accepts a row when at least one side is true.

Why OR and not two separate queries

A single WHERE with an OR does the union of the two groups in one pass. Running two queries and stitching the results together would produce the same logical set, but it would require deduplication afterwards — any product that's both cheap and uncategorised would appear in both result sets. WHERE evaluates each row exactly once and includes it in the output exactly once, so the union is built in naturally with no duplicate handling needed.

Why IS NULL and not category_id = NULL

= NULL returns unknown for every row, even the ones where category_id actually is NULL. WHERE keeps only rows where the condition evaluates to true, so the unknown rows are silently dropped. The query would still run, but the uncategorised products would never reach the sweep. IS NULL is the only operator that tests for the absence of a value and returns true or false.

You practiced combining a comparison and an IS NULL test with OR. OR is the recurring shape when a row qualifies for membership in either of two groups; duplicates from rows that satisfy both conditions are not produced because WHERE evaluates each row exactly once.

How you actually get good at SQL

Reading explains SQL. Writing it, over and over with instant feedback, is what makes you fluent.

That's the whole SQLMaxx loop: 600+ real problems, instant AI feedback, mastery you can actually see, and spaced review that won't let you forget.

A stack of SQL practice problem cards, the top card showing an employees table.
615 problems · 66 concepts

Real problems. Not toy examples.

615 hand-built problems spanning all 66 concepts, from basic SELECTs to window functions, built on real schemas and real business questions, the kind you'll actually get asked on the job. Enough reps to make SQL automatic.

A retro computer showing a SQL query marked correct with a green checkmark.
Instant AI feedback

Write a query. Know if it's right in one second.

No copying an answer and hoping it clicked. The AI grader checks your real query against real data, catches exactly what's wrong, and explains the fix in plain English, like a senior analyst reading over your shoulder on every problem.

A circular mastery progress dial filling from blue to green, the SQLMaxx diamond at its center.
Mastery tracking

Stop guessing whether you actually know it.

SQLMaxx tracks every concept and shows you what you've mastered and what's still shaky. Your skills fill in one concept at a time, so 'I think I get joins' becomes something you can prove.

A SQL query editor circled by a blue return arrow with a clock, scheduled to come back for review.
Spaced review

Learn it once. Keep it for good.

Most of what you learn this week fades by next week. So when a concept comes due for review, SQLMaxx hands you a fresh problem to solve from a blank editor, not a flashcard to re-read. A research-backed spaced-repetition algorithm (FSRS) times each return for right before you'd forget, so your SQL is still there months later, when the interview or the job actually needs it.

Practice, feedback, mastery, review. That's the loop that turns reading into real skill.

Start free

No account, no credit card. Start solving in under a minute.