Bird
Raised Fist0
MySQLquery~10 mins

EXCEPT equivalent in MySQL - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - EXCEPT equivalent
Start: Two SELECT queries
↓
Run first SELECT query
↓
Run second SELECT query
↓
Compare results
↓
Remove rows from first query that appear in second
↓
Return remaining rows as result
This flow shows how to get rows from the first query that are not in the second, mimicking EXCEPT by comparing and filtering results.
Execution Sample
MySQL
SELECT id FROM table1
WHERE id NOT IN (SELECT id FROM table2);
This query returns ids from table1 that do not appear in table2, acting like EXCEPT.
Execution Table
StepActionQuery PartIntermediate ResultExplanation
1Run first SELECTSELECT id FROM table1[1, 2, 3, 4]Get all ids from table1
2Run second SELECTSELECT id FROM table2[3, 4, 5]Get all ids from table2
3Compare resultsFilter table1 ids NOT IN table2 ids[1, 2]Remove ids 3 and 4 found in table2
4Return final resultOutput filtered ids[1, 2]These ids are only in table1
💡 All ids from table1 checked; those in table2 excluded, so execution stops.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
table1_idsempty[1, 2, 3, 4][1, 2, 3, 4][1, 2][1, 2]
table2_idsemptyempty[3, 4, 5][3, 4, 5][3, 4, 5]
result_idsemptyemptyempty[1, 2][1, 2]
Key Moments - 2 Insights
Why do we use NOT IN instead of EXCEPT in MySQL?
MySQL does not support EXCEPT, so NOT IN with a subquery filters out rows from the first query that appear in the second, as shown in execution_table step 3.
What happens if table2 has NULL values in id?
If table2 has NULLs, NOT IN may return no rows because NULL comparison is unknown; use NOT EXISTS or LEFT JOIN for safer results.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the intermediate result after step 2?
A[1, 2, 3, 4]
B[3, 4, 5]
C[1, 2]
D[5, 6]
💡 Hint
Check the 'Intermediate Result' column for step 2 in execution_table.
At which step are rows removed from the first query's results?
AStep 3
BStep 1
CStep 2
DStep 4
💡 Hint
Look for the step where filtering happens in execution_table.
If table2 had no ids, what would the final result be?
ASame as table2 ids
BEmpty set
CSame as table1 ids
DError
💡 Hint
Refer to variable_tracker for how filtering depends on table2_ids.
Concept Snapshot
EXCEPT equivalent in MySQL:
Use NOT IN or NOT EXISTS to exclude rows from first query found in second.
Example: SELECT * FROM A WHERE id NOT IN (SELECT id FROM B);
MySQL lacks EXCEPT keyword.
Watch out for NULLs in subqueries affecting results.
Full Transcript
This visual execution shows how to mimic the EXCEPT operation in MySQL, which does not support EXCEPT directly. We run two SELECT queries: one on table1 and one on table2. Then we filter the results of table1 to exclude any ids found in table2 using NOT IN. The execution table traces each step: first fetching ids from table1, then from table2, then filtering out common ids, and finally returning the unique ids from table1. The variable tracker shows how the lists of ids change after each step. Key moments clarify why NOT IN is used and the impact of NULL values. The quiz tests understanding of intermediate results and filtering steps. The snapshot summarizes the approach and cautions about NULLs.

Practice

(1/5)
1. What does the SQL EXCEPT operation do?
easy
A. Returns rows from the first query that are not in the second query
B. Returns rows common to both queries
C. Returns all rows from both queries combined
D. Deletes rows from the first table

Solution

  1. Step 1: Understand the purpose of EXCEPT

    The EXCEPT operation returns rows that appear in the first query but do not appear in the second query.
  2. Step 2: Compare with other set operations

    Unlike INTERSECT which returns common rows, EXCEPT excludes rows found in the second set.
  3. Final Answer:

    Returns rows from the first query that are not in the second query -> Option A
  4. Quick Check:

    EXCEPT = unique rows in first set [OK]
Hint: EXCEPT means "first minus second" rows [OK]
Common Mistakes:
  • Confusing EXCEPT with INTERSECT
  • Thinking EXCEPT returns all rows combined
  • Assuming EXCEPT deletes data
2. Which of the following is the correct MySQL syntax to simulate EXCEPT using NOT EXISTS?
easy
A. SELECT * FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table2.id = table1.id);
B. SELECT * FROM table1 EXCEPT SELECT * FROM table2;
C. SELECT * FROM table1 JOIN table2 ON table1.id = table2.id WHERE table2.id IS NULL;
D. SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);

Solution

  1. Step 1: Identify how NOT EXISTS works

    NOT EXISTS checks if a row in table1 has no matching row in table2 based on the condition.
  2. Step 2: Match syntax to EXCEPT behavior

    The query selects rows from table1 where no matching id exists in table2, simulating EXCEPT.
  3. Final Answer:

    SELECT * FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table2.id = table1.id); -> Option A
  4. Quick Check:

    NOT EXISTS filters out matching rows [OK]
Hint: Use NOT EXISTS with matching condition for EXCEPT [OK]
Common Mistakes:
  • Using EXCEPT directly in MySQL (unsupported)
  • Confusing JOIN with NOT EXISTS logic
  • Using IN instead of NOT EXISTS
3. Given tables:
table1(id): 1, 2, 3, 4
table2(id): 3, 4, 5
What is the result of this query?
SELECT id FROM table1 WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE table2.id = table1.id);
medium
A. [3, 4]
B. [1, 2]
C. [5]
D. [1, 2, 3, 4, 5]

Solution

  1. Step 1: Identify ids in table1 not in table2

    table1 has 1,2,3,4; table2 has 3,4,5. IDs 1 and 2 are missing in table2.
  2. Step 2: Understand NOT EXISTS filtering

    The query returns ids from table1 where no matching id exists in table2, so 1 and 2 are returned.
  3. Final Answer:

    [1, 2] -> Option B
  4. Quick Check:

    table1 minus table2 = [1, 2] [OK]
Hint: Find ids in first table missing in second [OK]
Common Mistakes:
  • Including ids present in both tables
  • Confusing NOT EXISTS with EXISTS
  • Returning ids from table2 instead
4. Identify the error in this MySQL query intended to simulate EXCEPT:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id WHERE table2.id = NULL;
medium
A. LEFT JOIN should be INNER JOIN
B. Missing ON condition in JOIN
C. Using '=' to compare with NULL instead of IS NULL
D. No error, query is correct

Solution

  1. Step 1: Understand NULL comparison in SQL

    In SQL, NULL cannot be compared using '='; use IS NULL instead.
  2. Step 2: Identify the mistake in WHERE clause

    The condition table2.id = NULL is always false; it should be table2.id IS NULL to find unmatched rows.
  3. Final Answer:

    Using '=' to compare with NULL instead of IS NULL -> Option C
  4. Quick Check:

    NULL comparison requires IS NULL [OK]
Hint: Use IS NULL, not = NULL, to check for NULL values [OK]
Common Mistakes:
  • Using '=' instead of IS NULL
  • Confusing JOIN types
  • Omitting ON clause in JOIN
5. You want to find customers who placed orders last month but did NOT place orders this month. Which query correctly simulates EXCEPT in MySQL?
hard
A. SELECT customer_id FROM orders LEFT JOIN orders o2 ON orders.customer_id = o2.customer_id WHERE o2.order_date BETWEEN '2024-06-01' AND '2024-06-30';
B. SELECT customer_id FROM orders WHERE order_date BETWEEN '2024-06-01' AND '2024-06-30' EXCEPT SELECT customer_id FROM orders WHERE order_date BETWEEN '2024-05-01' AND '2024-05-31';
C. SELECT customer_id FROM orders WHERE order_date BETWEEN '2024-05-01' AND '2024-06-30';
D. SELECT customer_id FROM orders WHERE order_date BETWEEN '2024-05-01' AND '2024-05-31' AND NOT EXISTS (SELECT 1 FROM orders o2 WHERE o2.customer_id = orders.customer_id AND o2.order_date BETWEEN '2024-06-01' AND '2024-06-30');

Solution

  1. Step 1: Identify the time frames and logic

    We want customers who ordered in May but not in June.
  2. Step 2: Use NOT EXISTS to exclude June customers

    The query selects May customers and excludes those with June orders using NOT EXISTS subquery.
  3. Step 3: Check other options

    SELECT customer_id FROM orders WHERE order_date BETWEEN '2024-06-01' AND '2024-06-30' EXCEPT SELECT customer_id FROM orders WHERE order_date BETWEEN '2024-05-01' AND '2024-05-31'; uses EXCEPT which MySQL does not support; C returns all customers in both months; D returns June customers only.
  4. Final Answer:

    SELECT customer_id FROM orders WHERE order_date BETWEEN '2024-05-01' AND '2024-05-31' AND NOT EXISTS (SELECT 1 FROM orders o2 WHERE o2.customer_id = orders.customer_id AND o2.order_date BETWEEN '2024-06-01' AND '2024-06-30'); -> Option D
  5. Quick Check:

    NOT EXISTS excludes June orders [OK]
Hint: Use NOT EXISTS with date ranges to exclude recent orders [OK]
Common Mistakes:
  • Using EXCEPT directly in MySQL
  • Selecting all orders without filtering
  • Confusing LEFT JOIN logic
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard