Coding/Learn/sql/sql in
SQL & Relational Database Engineering Complete Course
01.Introduction & Relational Database Architecture
02.Syntax, Clauses & Execution Order
03.SELECT: Column Projection & Expressions
04.SELECT DISTINCT & Row Deduplication
05.WHERE Clause: Filtering Predicates & Comparison
06.ORDER BY: Sorting, Multi-Column & NULLS Ordering
07.Logical Operators: AND, OR, NOT & Operator Precedence
08.Comments: Single-Line (--), Multi-Line (/* */) & Query Hints
09.Operators: Arithmetic, Bitwise & String Concatenation
10.LIKE Operator & Wildcard Characters (%, _)
11.IN & NOT IN: Membership Operators & Subqueries
12.BETWEEN: Range Filtering for Numbers, Dates & Text
13.NULL Values: Three-Valued Logic, IS NULL & IS NOT NULL
14.Aliases: AS Keyword for Columns & Tables
15.SELECT TOP, LIMIT & OFFSET Pagination
16.INSERT INTO: Single & Multi-Row Insertions
17.UPDATE: Modifying Existing Records & Safe WHERE Rules
18.DELETE: Removing Rows vs TRUNCATE TABLE
19.SELECT INTO & Table Backups (CREATE TABLE AS SELECT)
20.INSERT INTO SELECT: Bulk Data Migration
21.Aggregate Functions: Statistical Summaries
22.MIN() & MAX(): Finding Extremes Across Types
23.COUNT: COUNT(*), COUNT(column) & COUNT(DISTINCT)
24.SUM() & AVG(): Numerical Aggregation & Averages
25.GROUP BY: Aggregation Buckets & Categorical Metrics
26.HAVING: Filtering Aggregated Groups vs WHERE
27.Joins Architecture: Relational Modeling & Venn Diagrams
28.INNER JOIN: Matching Intersections Across Tables
29.LEFT JOIN: Preserving Unmatched Left Rows & Finding Orphans
30.RIGHT JOIN: Preserving Unmatched Right Rows
31.FULL JOIN: Full Outer Join & Complete Reconciliation
32.SELF JOIN: Hierarchies, Trees & Parent-Child Relationships
33.UNION: Combining Result Sets with Automatic Deduplication
34.UNION ALL vs UNION: Performance & Duplicates
35.EXISTS & NOT EXISTS: Correlated Subqueries
36.ANY & ALL: Quantified Comparison Subqueries
37.CASE: Conditional Expressions & Data Transposition
38.Null Functions: COALESCE, IFNULL, ISNULL & NULLIF
39.Stored Procedures, Functions & Query Parameters
40.CREATE & DROP DATABASE: Environment Lifecycle
41.CREATE TABLE: Defining Schemas & Types
42.DROP & TRUNCATE TABLE: Structure vs Data Purging
43.ALTER TABLE: Modifying Columns & Schema Evolution
44.AUTO INCREMENT & Sequences: Identity Generation
45.Date & Time Formats: Timestamp Manipulation
46.Views: Virtual Tables & Security Layers
47.Constraints Overview: Relational Integrity
48.NOT NULL & UNIQUE: Data Invariants
49.PRIMARY KEY: Entity Uniqueness & Clustering
50.FOREIGN KEY: Referential Integrity & Cascades
51.CHECK & DEFAULT: Business Rules at DB Layer
52.CREATE INDEX: B-Trees & Query Optimization
53.Injection Defense: Threat Models & Prevention
54.Parameters & Prepared Statements: Safe Execution
55.Database Engines & Hosting Architecture
56.Dialect References & Data Type Standards
57.Production Best Practices & Query Tuning Checklist
58.Interactive Exercises: Multi-Table Analytics Challenges
59.Comprehensive Assessment & Knowledge Check
60.Capstone Project: Enterprise Analytics Engine
61.Mastery Certification & Graduate Verification
Course Certificate0%

Complete all lessons to earn

LearnSQL IN & NOT IN: Membership Operators & Subqueries
11 / 61 0%
Lesson 11 of 61
5 mins read

SQL IN & NOT IN: Membership Operators & Subqueries

PreviousNext Lesson
In Plain English

The `IN` operator specifies multiple discrete values in a `WHERE` clause, serving as a clean, compact shorthand for multiple `OR` conditions. `IN` can check a static list of literal values or the dynamic output of a nested subquery.

The Mental Model

"`IN` is like a VIP guest list checked at the door: "If your name is on this list of 5 approved guests, come on in.""

Deep Dive: How It Works

Shorthand for OR: `WHERE country IN ('USA', 'UK', 'Canada')` is mathematically equivalent to `WHERE country = 'USA' OR country = 'UK' OR country = 'Canada'`.

Dynamic Subquery: `WHERE customer_id IN (SELECT id FROM vip_customers)` matches rows whose IDs appear in the subquery result set.

The NOT IN NULL Trap: If a subquery returns ANY NULL value, `NOT IN` evaluates to `UNKNOWN` for all rows, returning ZERO results!

Syntax Blueprint

SELECT column1
FROM table_name
WHERE column1 IN ('value1', 'value2', 'value3');

Use IN with literal value lists or subqueries to test set membership.

PointCore Rules to Remember

Point star
Cleaner than OR Chains: Replaces 10 repetitive `OR` clauses with a concise, easily maintainable list.
Point star
Subquery Integration: Dynamically filter records based on results from other tables.
Point star
NOT IN Warning: Avoid NOT IN on subqueries with nullable columns; prefer NOT EXISTS.

Common Beginner Traps & How to Fix Them

Mistake:Using `NOT IN (SELECT nullable_col FROM ...)` when the subquery contains a single NULL.

Why it happens: In 3VL logic, `x NOT IN (1, 2, NULL)` becomes `x != 1 AND x != 2 AND x != NULL`, which always evaluates to UNKNOWN.

How to fix: Filter out NULLs in subquery (`WHERE nullable_col IS NOT NULL`) or use `NOT EXISTS`.

Pro Tip: Most database optimizers convert `IN (...)` with literal constants into an efficient array index scan.

Live Interactive Example

Hit Run Code to see it live
Filtering with Literal IN Lists and Subqueries
Python 3.12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Output Console
Click "Run Code" to view the rendered output.
How it works: IN tested membership across both static lists and dynamic subquery table scans.

Your Turn: Micro Challenge

No pressure! Edit the starter code below and test your solution with instant feedback.

Micro Exercise

Filter with IN Operator

  • PointSelect `name` and `status` from `tasks` where `status IN ('todo', 'in_progress')`.
1
2
3
4
5
Sandbox Output
Click "Run & Check" to test your solution.

Finished reading and practicing?

Mark this lesson as completed to update your course progress.

PreviousNext Lesson
Overview100 SheetLearnCertificates