42 word problems, no joins, checked against your progress log. Figure out which columns and clauses you need β the hint under each one shows the technique if you get stuck, not the finished query. After you attempt a question, mark which review box it belongs in.
Nothing due yet. Mark a box on a question once you've attempted it.
Box 1 β tomorrow Β· Box 2 β 3 days Β· Box 3 β 1 week Β· Box 4 β 2 weeks Β· Box 5 β 1 month β counted from that level's "Completed" date, not from today. Set each level's date next to its heading first; click a box after attempting a question, click the same box again to clear it. Editing a level's date reschedules every question in it at once.
SELECT / WHERE, logical operators, IN / BETWEEN / LIKE, ORDER BY, DISTINCT, LIMIT / OFFSET, NULL checks.
products, which items are in the 'Electronics' category AND cost more than 500? Show name and price, aliasing price as unit_price.customers, list customer_id, name, city for anyone based in Chennai or Delhi β OR whose name starts with 'A'.orders, show order_id and status for every order that is not cancelled and was placed sometime in the first half of 2026.products, list name and price with the priciest item first, breaking ties alphabetically by name.customers, select name as cust_name and signup_date, sorted alphabetically β but sort using the alias, not the raw column.orders, select order_id, order_date, status sorted by column position β 3rd column first, then 2nd β with any missing status pushed to the bottom.orders, what distinct values can status take?products, find the 2nd, 3rd, and 4th most expensive products β skip the single priciest one.customers, find everyone with no email on file β then flip the query to find everyone who does have one.CAST, arithmetic, string / numeric / date functions, CASE, COALESCE / NULLIF.
orders, show order_id, order_date, and order_id converted to text β call it order_id_text.products, show name, price, and price forced into an integer (price_int). What happens to the decimal part?customers, show signup_date next to the same value cast to TEXT. Does anything visibly change in SQLite?order_items, show product_id, quantity, and what quantity would be if every line item doubled.products, show name, price, and price split three ways. Does it truncate?order_items, show order_id, product_id, quantity, and quantity minus one.customers, build one combined column showing name and city together, separated by ' - '.products, show name in all caps alongside its character length.customers, pull just the username portion out of each email β everything before the @.products, round every price to one decimal place.order_items, tag each row with quantity mod 3 β useful for spotting a pattern across rows.products, show each price floored and ceiled side by side.customers, extract just the signup year from signup_date.orders, work out how many days ago each order was placed, relative to right now.customers, compute the date exactly 30 days after each signup_date.products, label every product 'Premium' (price β₯ 1000), 'Mid' (price β₯ 500), or 'Budget' (below that).orders, translate each status into a friendlier label: delivered β Done, cancelled β Lost, anything else β Pending.customers, tag each row 'South' if city is Chennai or Bangalore, else 'Other'.customers, show name and email, replacing any missing email with the text 'no-email'.orders, do the same for status β replace missing values with 'unknown'.products, compute 100 divided by price, guarding against a divide-by-zero even though it can't happen in this data. What exactly are you guarding against?Aggregates, GROUP BY, HAVING vs WHERE, conditional aggregation. Stops exactly where your teaching has, ahead of Gate 3.
orders, compare the total row count against the count of non-null status values. Are they the same? Why or why not?order_items, find the total and average quantity across every line item.products, find the cheapest price, the priciest, and how many distinct category values exist.order_items, find total quantity sold per product_id.orders, count how many orders fall into each status.customers, count customers per city, busiest city first.order_items, which product_ids have sold more than 5 units in total?orders, ignoring cancelled orders, which status values have at least 2 orders?customers, ignoring anyone with no email on file, which cities have more than 1 customer?orders, in a single row, show how many orders are 'delivered' and how many are 'cancelled', side by side.order_items, per product_id, count how many order lines had a quantity greater than 2.products, in a single row, count how many products are 'Electronics' versus everything else.price never actually hits 0 in this data, so it's testing whether you understand what NULLIF is guarding against, not a real divide-by-zero case.