Connect tables with JOIN
Combine related rows and learn what happens when a match is missing.
- Choose between an inner join and a left join for a question.
JOIN combines rows using a relationship between tables. INNER JOIN returns rows with matches on both sides. LEFT JOIN keeps every row from the left table and fills right-side columns with NULL when there is no match.
1SELECT customers.name, orders.order_id, orders.total
2FROM customers
3INNER JOIN orders
4 ON orders.customer_id = customers.customer_id;
5
6SELECT customers.name, orders.order_id
7FROM customers
8LEFT JOIN orders
9 ON orders.customer_id = customers.customer_id;Qualify column names with their table when names overlap or the query could be ambiguous. The ON condition states how rows relate; join behavior for duplicate matches can produce multiple result rows.
Key takeaways
Choose between an inner join and a left join for a question.
Use table and column names that make the query easy to read.
Check which rows a query affects before relying on its result.
Lesson quiz
5 questions · pass with 4 correct · up to 50 XP
Passing this quiz completes the lesson and keeps your streak going. Questions you miss come back in review sessions later.
Practice: write SQL queries
Write queries against small sample databases and run them locally in your browser. Each test starts from a fresh SQLite database.
Include customers with no orders
Return every customer’s name and any matching order ID. Customers without orders should still appear. Sort by customer ID, then order ID.
- All customers and orders
Sample tables and rows
Each test rebuilds an in-memory database for the selected dialect before running your query.
CREATE TABLE customers (customer_id INTEGER PRIMARY KEY, name TEXT); CREATE TABLE orders (order_id INTEGER PRIMARY KEY, customer_id INTEGER, total REAL); INSERT INTO customers VALUES (1, 'Sam Lee'), (2, 'Ari Chen'), (3, 'Jo Diaz'); INSERT INTO orders VALUES (101, 1, 20), (102, 1, 15), (103, 3, 9);Using SQLite 3 (sql.js), an embedded database. Queries run locally in a worker against a fresh in-memory database for each test.
Questions about this lesson
Stuck? Ask. Figured something out? Share it. Explaining is one of the best ways to learn.
Loading posts…