The request

From Tyler Morgan, Junior Data Engineer
Your goal
Create a table supplier_import with columns import_id INTEGER PRIMARY KEY, product_name VARCHAR, category VARCHAR, unit_price DECIMAL(10, 2) and received_on DATE. Keep the four rows in the starter's INSERT and add a fifth: (5, 'Wren Ceramic Table Lamp', 'Lighting', NULL, '2025-11-04'). Finish with a SELECT returning import_id, product_name, unit_price and review_status ('missing price' when unit_price is NULL, 'needs approval' when unit_price is above 500, otherwise 'ok'), sorted by import_id.
- Show exactly
import_idproduct_nameunit_pricereview_statusnot done yet - 5 rows, sorted as askednot done yet
Your query
Loading the editor…
Reference solution
Mote checks your result
Press Run. Each row that matches the goal becomes a firefly in your lantern.
What Tyler gets, and why
Tables
Harbor & Pine store data, ready to query.
customers2,018 rows · 9 columns
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 rows · 8 columns
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 |
orders12,000 rows · 7 columns
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 rows · 6 columns
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 rows · 5 columns
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 rows · 8 columns
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 rows · 7 columns
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 rows · 3 columns
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 |
The lesson
Most of SQL is reading tables that someone else built. This chapter is about building your own. The
first two statements you need are CREATE TABLE, which defines a table’s columns, and INSERT, which
puts rows into it.
CREATE TABLE
A table definition lists each column with a data type:
CREATE TABLE supplier_import (
import_id INTEGER PRIMARY KEY,
product_name VARCHAR,
category VARCHAR,
unit_price DECIMAL(10, 2),
received_on DATE
);
The type decides what the column accepts and how it behaves. INTEGER holds whole numbers,
VARCHAR holds text, DATE holds a calendar day, and DECIMAL(10, 2) holds exact numbers with up to
10 digits, 2 of them after the decimal point. Money always goes in DECIMAL, never in a floating-point
type, because floats store binary approximations: 0.1 + 0.2 is not exactly 0.3 in a DOUBLE.
PRIMARY KEY means every import_id must be present and unique. Insert a second row with id 3 and the
database refuses it with a constraint error. That is the point: keys are how tables join, so the database
protects them.
INSERT INTO … VALUES
INSERT INTO supplier_import VALUES
(1, 'Harlow Brass Pendant', 'Lighting', 189.00, '2025-11-03'),
(5, 'Wren Ceramic Table Lamp', 'Lighting', NULL, '2025-11-04');
Each parenthesized list is one row, with values in the same order as the columns. Text and dates go in
single quotes, numbers do not, and a missing value is written NULL without quotes. 'NULL' in quotes
would be a four-letter string, not a missing value.
When you only fill some columns, name them, and the rest become NULL (or their default):
INSERT INTO supplier_import (import_id, product_name) VALUES (6, 'Sample Lamp');
Naming the columns is also safer in general: the insert keeps working if someone adds a column later.
Read it back
After any change, query the table to confirm it holds what you expect. Here the final SELECT adds a
review flag. The CASE checks for the missing price first, because a NULL price is neither above nor
below 500: NULL > 500 is unknown, and an unknown condition never matches a WHEN.
In this game every run is rolled back afterwards, which is why the solution creates the table each time. On a real database the table would stay until someone drops it.
Common mistakes
- Quoting numbers or forgetting quotes around text and dates.
'189.00'usually still converts, butLightingwithout quotes is read as a column name and fails. - Putting values in the wrong column order.
VALUESfollows the table’s column order unless you list the columns. - Writing
'NULL'or an empty string''for a missing value. Both are real values, soIS NULLwill not find them. - Using
FLOATorDOUBLEfor prices.
In SQL Server
The same table in T-SQL usually uses NVARCHAR(100) for text (Unicode) and often an IDENTITY column
that numbers rows for you:
CREATE TABLE dbo.SupplierImport (
ImportID INT IDENTITY(1,1) PRIMARY KEY,
ProductName NVARCHAR(100),
UnitPrice DECIMAL(10,2)
);
DuckDB’s VARCHAR needs no length, and INSERT INTO ... VALUES with several rows works the same in both.
Lantern lit!
Practised: create tableinsertdata typesprimary keynull
- Solved
- No hints
- First run
