Chapter 20: PostgreSQL WHERE – Filter Data
Part 1: What is the WHERE Clause?
The WHERE clause filters rows from a table based on specified conditions. Only rows that satisfy the condition are included in the result set.
The Basic Syntax
|
0 1 2 3 4 5 6 7 8 |
<span class="token keyword">SELECT</span> column1<span class="token punctuation">,</span> column2<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token keyword">FROM</span> table_name <span class="token keyword">WHERE</span> condition<span class="token punctuation">;</span> |
The condition can be simple (like price > 100) or incredibly complex with multiple parts combined using logical operators.
A Visual Understanding
Imagine a table as a filing cabinet with many drawers (rows). The WHERE clause is like telling your assistant: “Only show me the files where the customer is from Austin AND they spent more than $50.” Your assistant efficiently scans through, checking each file against your criteria, and returns only the matching ones.
Part 2: Setting Up Our Example Data
Let’s create a rich dataset for a bookstore so we can explore all the WHERE clause features:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
<span class="token comment">-- Create a comprehensive books table</span> <span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> books <span class="token punctuation">(</span> book_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> title <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">,</span> author <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> genre <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">,</span> price <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pages <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> publication_date <span class="token keyword">DATE</span><span class="token punctuation">,</span> in_stock <span class="token keyword">BOOLEAN</span><span class="token punctuation">,</span> publisher <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> rating <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> sold_copies <span class="token keyword">INTEGER</span><span class="token punctuation">,</span> <span class="token keyword">language</span> <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Insert diverse sample data</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> books <span class="token punctuation">(</span>title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> genre<span class="token punctuation">,</span> price<span class="token punctuation">,</span> pages<span class="token punctuation">,</span> publication_date<span class="token punctuation">,</span> in_stock<span class="token punctuation">,</span> publisher<span class="token punctuation">,</span> rating<span class="token punctuation">,</span> sold_copies<span class="token punctuation">,</span> <span class="token keyword">language</span><span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token string">'The Silent Patient'</span><span class="token punctuation">,</span> <span class="token string">'Alex Michaelides'</span><span class="token punctuation">,</span> <span class="token string">'Thriller'</span><span class="token punctuation">,</span> <span class="token number">24.99</span><span class="token punctuation">,</span> <span class="token number">336</span><span class="token punctuation">,</span> <span class="token string">'2019-02-05'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Celadon Books'</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">1500000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Where the Crawdads Sing'</span><span class="token punctuation">,</span> <span class="token string">'Delia Owens'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">26.99</span><span class="token punctuation">,</span> <span class="token number">384</span><span class="token punctuation">,</span> <span class="token string">'2018-08-14'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'G.P. Putnam''s Sons'</span><span class="token punctuation">,</span> <span class="token number">4.8</span><span class="token punctuation">,</span> <span class="token number">12000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Becoming'</span><span class="token punctuation">,</span> <span class="token string">'Michelle Obama'</span><span class="token punctuation">,</span> <span class="token string">'Biography'</span><span class="token punctuation">,</span> <span class="token number">32.50</span><span class="token punctuation">,</span> <span class="token number">448</span><span class="token punctuation">,</span> <span class="token string">'2018-11-13'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Crown'</span><span class="token punctuation">,</span> <span class="token number">4.9</span><span class="token punctuation">,</span> <span class="token number">10000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Atomic Habits'</span><span class="token punctuation">,</span> <span class="token string">'James Clear'</span><span class="token punctuation">,</span> <span class="token string">'Self-help'</span><span class="token punctuation">,</span> <span class="token number">21.99</span><span class="token punctuation">,</span> <span class="token number">320</span><span class="token punctuation">,</span> <span class="token string">'2018-10-16'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Avery'</span><span class="token punctuation">,</span> <span class="token number">4.9</span><span class="token punctuation">,</span> <span class="token number">8000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Educated'</span><span class="token punctuation">,</span> <span class="token string">'Tara Westover'</span><span class="token punctuation">,</span> <span class="token string">'Biography'</span><span class="token punctuation">,</span> <span class="token number">27.99</span><span class="token punctuation">,</span> <span class="token number">352</span><span class="token punctuation">,</span> <span class="token string">'2018-02-20'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Random House'</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">6000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Midnight Library'</span><span class="token punctuation">,</span> <span class="token string">'Matt Haig'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">25.99</span><span class="token punctuation">,</span> <span class="token number">304</span><span class="token punctuation">,</span> <span class="token string">'2020-08-13'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Viking'</span><span class="token punctuation">,</span> <span class="token number">4.3</span><span class="token punctuation">,</span> <span class="token number">3000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Dune'</span><span class="token punctuation">,</span> <span class="token string">'Frank Herbert'</span><span class="token punctuation">,</span> <span class="token string">'Science Fiction'</span><span class="token punctuation">,</span> <span class="token number">18.99</span><span class="token punctuation">,</span> <span class="token number">688</span><span class="token punctuation">,</span> <span class="token string">'1965-08-01'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Chilton Books'</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">20000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Hobbit'</span><span class="token punctuation">,</span> <span class="token string">'J.R.R. Tolkien'</span><span class="token punctuation">,</span> <span class="token string">'Fantasy'</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token number">310</span><span class="token punctuation">,</span> <span class="token string">'1937-09-21'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Allen & Unwin'</span><span class="token punctuation">,</span> <span class="token number">4.8</span><span class="token punctuation">,</span> <span class="token number">100000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'1984'</span><span class="token punctuation">,</span> <span class="token string">'George Orwell'</span><span class="token punctuation">,</span> <span class="token string">'Science Fiction'</span><span class="token punctuation">,</span> <span class="token number">13.99</span><span class="token punctuation">,</span> <span class="token number">328</span><span class="token punctuation">,</span> <span class="token string">'1949-06-08'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Secker & Warburg'</span><span class="token punctuation">,</span> <span class="token number">4.6</span><span class="token punctuation">,</span> <span class="token number">30000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Pride and Prejudice'</span><span class="token punctuation">,</span> <span class="token string">'Jane Austen'</span><span class="token punctuation">,</span> <span class="token string">'Romance'</span><span class="token punctuation">,</span> <span class="token number">9.99</span><span class="token punctuation">,</span> <span class="token number">432</span><span class="token punctuation">,</span> <span class="token string">'1813-01-28'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'T. Egerton'</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">20000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Catcher in the Rye'</span><span class="token punctuation">,</span> <span class="token string">'J.D. Salinger'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">12.99</span><span class="token punctuation">,</span> <span class="token number">277</span><span class="token punctuation">,</span> <span class="token string">'1951-07-16'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token string">'Little, Brown and Company'</span><span class="token punctuation">,</span> <span class="token number">4.0</span><span class="token punctuation">,</span> <span class="token number">65000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'To Kill a Mockingbird'</span><span class="token punctuation">,</span> <span class="token string">'Harper Lee'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token number">281</span><span class="token punctuation">,</span> <span class="token string">'1960-07-11'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'J.B. Lippincott & Co.'</span><span class="token punctuation">,</span> <span class="token number">4.8</span><span class="token punctuation">,</span> <span class="token number">40000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Great Gatsby'</span><span class="token punctuation">,</span> <span class="token string">'F. Scott Fitzgerald'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">11.99</span><span class="token punctuation">,</span> <span class="token number">180</span><span class="token punctuation">,</span> <span class="token string">'1925-04-10'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Charles Scribner''s Sons'</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">25000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Brave New World'</span><span class="token punctuation">,</span> <span class="token string">'Aldous Huxley'</span><span class="token punctuation">,</span> <span class="token string">'Science Fiction'</span><span class="token punctuation">,</span> <span class="token number">13.99</span><span class="token punctuation">,</span> <span class="token number">288</span><span class="token punctuation">,</span> <span class="token string">'1932-01-01'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Chatto & Windus'</span><span class="token punctuation">,</span> <span class="token number">4.4</span><span class="token punctuation">,</span> <span class="token number">15000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Alchemist'</span><span class="token punctuation">,</span> <span class="token string">'Paulo Coelho'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">15.99</span><span class="token punctuation">,</span> <span class="token number">208</span><span class="token punctuation">,</span> <span class="token string">'1988-01-01'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'HarperTorch'</span><span class="token punctuation">,</span> <span class="token number">4.6</span><span class="token punctuation">,</span> <span class="token number">65000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Sapiens'</span><span class="token punctuation">,</span> <span class="token string">'Yuval Noah Harari'</span><span class="token punctuation">,</span> <span class="token string">'History'</span><span class="token punctuation">,</span> <span class="token number">24.99</span><span class="token punctuation">,</span> <span class="token number">464</span><span class="token punctuation">,</span> <span class="token string">'2011-01-01'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Harper'</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">12000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Da Vinci Code'</span><span class="token punctuation">,</span> <span class="token string">'Dan Brown'</span><span class="token punctuation">,</span> <span class="token string">'Thriller'</span><span class="token punctuation">,</span> <span class="token number">16.99</span><span class="token punctuation">,</span> <span class="token number">592</span><span class="token punctuation">,</span> <span class="token string">'2003-03-18'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token string">'Doubleday'</span><span class="token punctuation">,</span> <span class="token number">4.1</span><span class="token punctuation">,</span> <span class="token number">80000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Hunger Games'</span><span class="token punctuation">,</span> <span class="token string">'Suzanne Collins'</span><span class="token punctuation">,</span> <span class="token string">'Young Adult'</span><span class="token punctuation">,</span> <span class="token number">14.99</span><span class="token punctuation">,</span> <span class="token number">384</span><span class="token punctuation">,</span> <span class="token string">'2008-09-14'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Scholastic Press'</span><span class="token punctuation">,</span> <span class="token number">4.5</span><span class="token punctuation">,</span> <span class="token number">65000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Gone Girl'</span><span class="token punctuation">,</span> <span class="token string">'Gillian Flynn'</span><span class="token punctuation">,</span> <span class="token string">'Thriller'</span><span class="token punctuation">,</span> <span class="token number">15.99</span><span class="token punctuation">,</span> <span class="token number">432</span><span class="token punctuation">,</span> <span class="token string">'2012-05-24'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Crown Publishing Group'</span><span class="token punctuation">,</span> <span class="token number">4.2</span><span class="token punctuation">,</span> <span class="token number">20000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'The Help'</span><span class="token punctuation">,</span> <span class="token string">'Kathryn Stockett'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">13.99</span><span class="token punctuation">,</span> <span class="token number">464</span><span class="token punctuation">,</span> <span class="token string">'2009-02-10'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Penguin Books'</span><span class="token punctuation">,</span> <span class="token number">4.7</span><span class="token punctuation">,</span> <span class="token number">15000000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">-- Add some books in other languages</span> <span class="token punctuation">(</span><span class="token string">'Cien años de soledad'</span><span class="token punctuation">,</span> <span class="token string">'Gabriel García Márquez'</span><span class="token punctuation">,</span> <span class="token string">'Fiction'</span><span class="token punctuation">,</span> <span class="token number">18.99</span><span class="token punctuation">,</span> <span class="token number">417</span><span class="token punctuation">,</span> <span class="token string">'1967-05-30'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Editorial Sudamericana'</span><span class="token punctuation">,</span> <span class="token number">4.9</span><span class="token punctuation">,</span> <span class="token number">50000000</span><span class="token punctuation">,</span> <span class="token string">'Spanish'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Le Petit Prince'</span><span class="token punctuation">,</span> <span class="token string">'Antoine de Saint-Exupéry'</span><span class="token punctuation">,</span> <span class="token string">'Children'</span><span class="token punctuation">,</span> <span class="token number">12.99</span><span class="token punctuation">,</span> <span class="token number">96</span><span class="token punctuation">,</span> <span class="token string">'1943-04-06'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Reynal & Hitchcock'</span><span class="token punctuation">,</span> <span class="token number">4.9</span><span class="token punctuation">,</span> <span class="token number">200000000</span><span class="token punctuation">,</span> <span class="token string">'French'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">-- Add some books with NULL values for demonstration</span> <span class="token punctuation">(</span><span class="token string">'Mystery Book'</span><span class="token punctuation">,</span> <span class="token string">'Unknown Author'</span><span class="token punctuation">,</span> <span class="token string">'Mystery'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token string">'2020-01-01'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Incomplete Records'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token number">9.99</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token string">'Self-published'</span><span class="token punctuation">,</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token number">1000</span><span class="token punctuation">,</span> <span class="token string">'English'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Part 3: Basic Comparison Operators
The foundation of WHERE clauses is comparison operators. Let’s explore each one with examples.
1. Equal To (=)
Find books by a specific author:
|
0 1 2 3 4 5 6 7 8 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> price<span class="token punctuation">,</span> in_stock <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">=</span> <span class="token string">'George Orwell'</span><span class="token punctuation">;</span> |
Result:
| title | author | price | in_stock |
|---|---|---|---|
| 1984 | George Orwell | 13.99 | true |
2. Not Equal To (!= or <>)
Find all books NOT by Jane Austen:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> genre <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">!=</span> <span class="token string">'Jane Austen'</span> <span class="token keyword">LIMIT</span> <span class="token number">5</span><span class="token punctuation">;</span> |
Note: Both != and <> work the same way. I prefer != for readability.
3. Greater Than (>)
Find books priced above $25:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> price<span class="token punctuation">,</span> author <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">25</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Result:
| title | price | author |
|---|---|---|
| Becoming | 32.50 | Michelle Obama |
| Educated | 27.99 | Tara Westover |
| Where the Crawdads Sing | 26.99 | Delia Owens |
| The Midnight Library | 25.99 | Matt Haig |
4. Less Than (<)
Find books under $10:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator"><</span> <span class="token number">10</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price<span class="token punctuation">;</span> |
Result:
| title | price |
|---|---|
| Pride and Prejudice | 9.99 |
| Incomplete Records | 9.99 |
5. Greater Than or Equal To (>=)
Find books with 400+ pages:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> pages<span class="token punctuation">,</span> author <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> pages <span class="token operator">>=</span> <span class="token number">400</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> pages <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Result:
| title | pages | author |
|---|---|---|
| Sapiens | 464 | Yuval Noah Harari |
| Becoming | 448 | Michelle Obama |
| The Help | 464 | Kathryn Stockett |
| Pride and Prejudice | 432 | Jane Austen |
| Gone Girl | 432 | Gillian Flynn |
| Dune | 688 | Frank Herbert |
6. Less Than or Equal To (<=)
Find books published in 1950 or earlier:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publication_date <span class="token operator"><=</span> <span class="token string">'1950-01-01'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publication_date<span class="token punctuation">;</span> |
Result:
| title | publication_date |
|---|---|
| Pride and Prejudice | 1813-01-28 |
| The Hobbit | 1937-09-21 |
| Brave New World | 1932-01-01 |
| 1984 | 1949-06-08 |
| Le Petit Prince | 1943-04-06 |
Part 4: Logical Operators (AND, OR, NOT)
Real-world queries rarely use just one condition. Logical operators let you combine multiple conditions.
1. AND – Both Conditions Must Be True
Find affordable fiction books in stock:
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> genre<span class="token punctuation">,</span> price<span class="token punctuation">,</span> in_stock <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> genre <span class="token operator">=</span> <span class="token string">'Fiction'</span> <span class="token operator">AND</span> price <span class="token operator"><</span> <span class="token number">15</span> <span class="token operator">AND</span> in_stock <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price<span class="token punctuation">;</span> |
Result:
| title | genre | price | in_stock |
|---|---|---|---|
| The Great Gatsby | Fiction | 11.99 | true |
| The Catcher in the Rye | Fiction | 12.99 | false |
| The Alchemist | Fiction | 15.99 | true |
Notice that “The Catcher in the Rye” is excluded because it’s out of stock (in_stock = false).
2. OR – At Least One Condition Must Be True
Find books that are either by George Orwell OR published before 1950:
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">=</span> <span class="token string">'George Orwell'</span> <span class="token operator">OR</span> publication_date <span class="token operator"><</span> <span class="token string">'1950-01-01'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publication_date<span class="token punctuation">;</span> |
Result:
| title | author | publication_date |
|---|---|---|
| Pride and Prejudice | Jane Austen | 1813-01-28 |
| The Hobbit | J.R.R. Tolkien | 1937-09-21 |
| Brave New World | Aldous Huxley | 1932-01-01 |
| 1984 | George Orwell | 1949-06-08 |
| Le Petit Prince | Antoine de Saint-Exupéry | 1943-04-06 |
3. NOT – Negate a Condition
Find books that are NOT in the Fiction genre:
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> genre <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> <span class="token operator">NOT</span> genre <span class="token operator">=</span> <span class="token string">'Fiction'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> genre<span class="token punctuation">,</span> title <span class="token keyword">LIMIT</span> <span class="token number">10</span><span class="token punctuation">;</span> |
Result (partial):
| title | genre |
|---|---|
| Becoming | Biography |
| Educated | Biography |
| The Hobbit | Fantasy |
| Sapiens | History |
| Mystery Book | Mystery |
| Pride and Prejudice | Romance |
You can also write this as WHERE genre != 'Fiction'. I find NOT more readable for complex conditions.
4. Combining AND, OR, and NOT with Parentheses
This is crucial! Without parentheses, AND has precedence over OR, which can lead to unexpected results.
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- Find books by either Jane Austen OR George Orwell, that cost less than $15</span> <span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>author <span class="token operator">=</span> <span class="token string">'Jane Austen'</span> <span class="token operator">OR</span> author <span class="token operator">=</span> <span class="token string">'George Orwell'</span><span class="token punctuation">)</span> <span class="token operator">AND</span> price <span class="token operator"><</span> <span class="token number">15</span><span class="token punctuation">;</span> |
Result:
| title | author | price |
|---|---|---|
| 1984 | George Orwell | 13.99 |
| Pride and Prejudice | Jane Austen | 9.99 |
Without parentheses, this happens:
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- This is WRONG! It finds books where (author = 'Jane Austen') OR </span> <span class="token comment">-- (author = 'George Orwell' AND price < 15)</span> <span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">=</span> <span class="token string">'Jane Austen'</span> <span class="token operator">OR</span> author <span class="token operator">=</span> <span class="token string">'George Orwell'</span> <span class="token operator">AND</span> price <span class="token operator"><</span> <span class="token number">15</span><span class="token punctuation">;</span> |
This would include ALL books by Jane Austen regardless of price!
Part 5: Special Operators for More Expressive Conditions
1. BETWEEN – Range Checking
Find books published between 2000 and 2020:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publication_date <span class="token operator">BETWEEN</span> <span class="token string">'2000-01-01'</span> <span class="token operator">AND</span> <span class="token string">'2020-12-31'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publication_date<span class="token punctuation">;</span> |
Result:
| title | publication_date |
|---|---|
| The Da Vinci Code | 2003-03-18 |
| The Hunger Games | 2008-09-14 |
| The Help | 2009-02-10 |
| Gone Girl | 2012-05-24 |
| The Silent Patient | 2019-02-05 |
| Where the Crawdads Sing | 2018-08-14 |
| Becoming | 2018-11-13 |
| Atomic Habits | 2018-10-16 |
| Educated | 2018-02-20 |
| The Midnight Library | 2020-08-13 |
BETWEEN is inclusive – it includes both boundary values.
Find books with page counts between 300 and 400:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> pages <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> pages <span class="token operator">BETWEEN</span> <span class="token number">300</span> <span class="token operator">AND</span> <span class="token number">400</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> pages<span class="token punctuation">;</span> |
2. IN – Match Any Value in a List
Find books in specific genres:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> genre <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> genre <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token string">'Thriller'</span><span class="token punctuation">,</span> <span class="token string">'Science Fiction'</span><span class="token punctuation">,</span> <span class="token string">'Fantasy'</span><span class="token punctuation">)</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> genre<span class="token punctuation">,</span> title<span class="token punctuation">;</span> |
Result:
| title | genre |
|---|---|
| The Hobbit | Fantasy |
| 1984 | Science Fiction |
| Brave New World | Science Fiction |
| Dune | Science Fiction |
| Gone Girl | Thriller |
| The Da Vinci Code | Thriller |
| The Silent Patient | Thriller |
This is much cleaner than writing multiple OR conditions:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">-- The same query without IN (much messier!)</span> <span class="token keyword">WHERE</span> genre <span class="token operator">=</span> <span class="token string">'Thriller'</span> <span class="token operator">OR</span> genre <span class="token operator">=</span> <span class="token string">'Science Fiction'</span> <span class="token operator">OR</span> genre <span class="token operator">=</span> <span class="token string">'Fantasy'</span> |
3. LIKE – Pattern Matching with Wildcards
% matches any sequence of characters (including zero characters)
_ matches exactly one character
Find books with titles starting with “The”:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">LIKE</span> <span class="token string">'The %'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> title<span class="token punctuation">;</span> |
Result:
| title | author |
|---|---|
| The Alchemist | Paulo Coelho |
| The Catcher in the Rye | J.D. Salinger |
| The Da Vinci Code | Dan Brown |
| The Great Gatsby | F. Scott Fitzgerald |
| The Help | Kathryn Stockett |
| The Hobbit | J.R.R. Tolkien |
| The Hunger Games | Suzanne Collins |
| The Midnight Library | Matt Haig |
| The Silent Patient | Alex Michaelides |
Find books with “of” anywhere in the title:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">LIKE</span> <span class="token string">'%of%'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> title<span class="token punctuation">;</span> |
Result:
| title |
|---|
| Cien años de soledad |
| Pride and Prejudice |
| The House of Mirth |
| The Lord of the Rings |
| … |
Find authors with 5-letter first names (using _ for single characters):
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> <span class="token keyword">DISTINCT</span> author <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">LIKE</span> <span class="token string">'_____ %'</span> <span class="token comment">-- 5 characters, space, then anything</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> author<span class="token punctuation">;</span> |
4. ILIKE – Case-Insensitive Pattern Matching
Standard LIKE is case-sensitive. ILIKE ignores case:
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- This won't find 'the' with lowercase</span> <span class="token keyword">SELECT</span> title <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">LIKE</span> <span class="token string">'%the%'</span><span class="token punctuation">;</span> <span class="token comment">-- This will find 'the' or 'The' or 'THE'</span> <span class="token keyword">SELECT</span> title <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">ILIKE</span> <span class="token string">'%the%'</span><span class="token punctuation">;</span> |
5. Regular Expressions with ~ and ~*
For even more powerful pattern matching:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">-- Find titles ending with a number (using regular expression)</span> <span class="token keyword">SELECT</span> title <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">~</span> <span class="token string">'[0-9]$'</span><span class="token punctuation">;</span> <span class="token comment">-- Case-insensitive version</span> <span class="token keyword">SELECT</span> title <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">~</span><span class="token operator">*</span> <span class="token string">'^the'</span><span class="token punctuation">;</span> <span class="token comment">-- Titles starting with 'the' in any case</span> |
Part 6: NULL Handling
NULL represents missing or unknown data. Working with NULL requires special operators.
1. IS NULL – Find Missing Values
Find books with missing prices:
|
0 1 2 3 4 5 6 7 8 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> price<span class="token punctuation">,</span> author <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">IS</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> |
Result:
| title | price | author |
|---|---|---|
| Mystery Book | NULL | Unknown Author |
2. IS NOT NULL – Find Values That Exist
Find books with all information present:
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> price<span class="token punctuation">,</span> pages<span class="token punctuation">,</span> publisher <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token operator">AND</span> price <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token operator">AND</span> pages <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">LIMIT</span> <span class="token number">5</span><span class="token punctuation">;</span> |
3. The NULL Trap – Common Mistake
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- This WON'T work!</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">=</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> <span class="token comment">-- This WILL work!</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">IS</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> |
Why? NULL is not a value – it’s the absence of a value. You can’t compare with equals; you must use IS NULL.
4. NULL in Comparisons
When NULL appears in comparisons, the result is always NULL (which is treated as false in WHERE):
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">-- These return no rows if price is NULL:</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">></span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token comment">-- NULL is not > 10</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator"><=</span> <span class="token number">20</span><span class="token punctuation">;</span> <span class="token comment">-- NULL is not <= 20</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">!=</span> <span class="token number">15</span><span class="token punctuation">;</span> <span class="token comment">-- NULL is not != 15</span> |
NULL values are excluded from all comparison conditions unless explicitly included with IS NULL.
Part 7: Date and Time Filters
Working with dates is incredibly common in real applications.
1. Exact Date Matching
|
0 1 2 3 4 5 6 7 8 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publication_date <span class="token operator">=</span> <span class="token string">'1949-06-08'</span><span class="token punctuation">;</span> |
2. Date Ranges
|
0 1 2 3 4 5 6 7 8 9 10 11 |
<span class="token comment">-- Books published in the 1980s</span> <span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publication_date <span class="token operator">>=</span> <span class="token string">'1980-01-01'</span> <span class="token operator">AND</span> publication_date <span class="token operator"><</span> <span class="token string">'1990-01-01'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publication_date<span class="token punctuation">;</span> |
3. Date Functions in WHERE
Find books published in the last 50 years:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publication_date <span class="token operator">>=</span> <span class="token punctuation">(</span><span class="token keyword">CURRENT_DATE</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'50 years'</span><span class="token punctuation">)</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publication_date <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Find books published in the 21st century:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> EXTRACT<span class="token punctuation">(</span><span class="token keyword">YEAR</span> <span class="token keyword">FROM</span> publication_date<span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token number">2000</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publication_date<span class="token punctuation">;</span> |
Find books published in specific months:
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publication_date <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> EXTRACT<span class="token punctuation">(</span><span class="token keyword">MONTH</span> <span class="token keyword">FROM</span> publication_date<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">11</span> <span class="token comment">-- November</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publication_date<span class="token punctuation">;</span> |
Part 8: Complex Real-World Examples
Example 1: Advanced Book Search
Find highly-rated, moderately-priced fiction books in stock:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> genre<span class="token punctuation">,</span> price<span class="token punctuation">,</span> rating<span class="token punctuation">,</span> sold_copies <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> genre <span class="token operator">=</span> <span class="token string">'Fiction'</span> <span class="token operator">AND</span> rating <span class="token operator">>=</span> <span class="token number">4.5</span> <span class="token operator">AND</span> price <span class="token operator">BETWEEN</span> <span class="token number">10</span> <span class="token operator">AND</span> <span class="token number">20</span> <span class="token operator">AND</span> in_stock <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token operator">AND</span> sold_copies <span class="token operator">></span> <span class="token number">1000000</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> rating <span class="token keyword">DESC</span><span class="token punctuation">,</span> sold_copies <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Example 2: Publisher Analysis
Find publishers with specific patterns and conditions:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> publisher<span class="token punctuation">,</span> publication_date<span class="token punctuation">,</span> <span class="token keyword">language</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publisher <span class="token operator">LIKE</span> <span class="token string">'%House%'</span> <span class="token operator">OR</span> publisher <span class="token operator">LIKE</span> <span class="token string">'%Books%'</span> <span class="token operator">AND</span> <span class="token keyword">language</span> <span class="token operator">=</span> <span class="token string">'English'</span> <span class="token operator">AND</span> publication_date <span class="token operator">></span> <span class="token string">'2000-01-01'</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> publisher<span class="token punctuation">,</span> publication_date<span class="token punctuation">;</span> |
Example 3: Inventory Management
Find books that need reordering (low stock, but popular):
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<span class="token comment">-- First, let's add a stock_quantity column</span> <span class="token keyword">ALTER</span> <span class="token keyword">TABLE</span> books <span class="token keyword">ADD</span> <span class="token keyword">COLUMN</span> stock_quantity <span class="token keyword">INTEGER</span><span class="token punctuation">;</span> <span class="token keyword">UPDATE</span> books <span class="token keyword">SET</span> stock_quantity <span class="token operator">=</span> <span class="token keyword">CASE</span> <span class="token keyword">WHEN</span> title <span class="token operator">LIKE</span> <span class="token string">'The%'</span> <span class="token keyword">THEN</span> <span class="token number">10</span> <span class="token keyword">WHEN</span> genre <span class="token operator">=</span> <span class="token string">'Fiction'</span> <span class="token keyword">THEN</span> <span class="token number">25</span> <span class="token keyword">ELSE</span> <span class="token number">5</span> <span class="token keyword">END</span><span class="token punctuation">;</span> <span class="token comment">-- Now find books to reorder</span> <span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> author<span class="token punctuation">,</span> genre<span class="token punctuation">,</span> stock_quantity<span class="token punctuation">,</span> sold_copies<span class="token punctuation">,</span> rating <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> stock_quantity <span class="token operator"><</span> <span class="token number">15</span> <span class="token operator">AND</span> <span class="token punctuation">(</span>sold_copies <span class="token operator">></span> <span class="token number">10000000</span> <span class="token operator">OR</span> rating <span class="token operator">></span> <span class="token number">4.7</span><span class="token punctuation">)</span> <span class="token operator">AND</span> in_stock <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> stock_quantity<span class="token punctuation">,</span> sold_copies <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Example 4: Multi-Criteria Customer Search
Imagine we have a customers table (let’s create one quickly):
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> customers <span class="token punctuation">(</span> customer_id <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span> name <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span> city <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">,</span> state <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> signup_date <span class="token keyword">DATE</span><span class="token punctuation">,</span> total_spent <span class="token keyword">DECIMAL</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> email_opt_in <span class="token keyword">BOOLEAN</span><span class="token punctuation">,</span> age <span class="token keyword">INTEGER</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> customers <span class="token punctuation">(</span>name<span class="token punctuation">,</span> city<span class="token punctuation">,</span> state<span class="token punctuation">,</span> signup_date<span class="token punctuation">,</span> total_spent<span class="token punctuation">,</span> email_opt_in<span class="token punctuation">,</span> age<span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token string">'Alice Johnson'</span><span class="token punctuation">,</span> <span class="token string">'Austin'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-01-15'</span><span class="token punctuation">,</span> <span class="token number">1250.00</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token number">32</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Bob Smith'</span><span class="token punctuation">,</span> <span class="token string">'Dallas'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-02-20'</span><span class="token punctuation">,</span> <span class="token number">450.50</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token number">45</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Carol White'</span><span class="token punctuation">,</span> <span class="token string">'Austin'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-03-10'</span><span class="token punctuation">,</span> <span class="token number">890.75</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token number">28</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'David Brown'</span><span class="token punctuation">,</span> <span class="token string">'Houston'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-01-05'</span><span class="token punctuation">,</span> <span class="token number">2100.00</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token number">51</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Eva Green'</span><span class="token punctuation">,</span> <span class="token string">'San Antonio'</span><span class="token punctuation">,</span> <span class="token string">'TX'</span><span class="token punctuation">,</span> <span class="token string">'2023-04-12'</span><span class="token punctuation">,</span> <span class="token number">320.25</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Find VIP customers for marketing</span> <span class="token keyword">SELECT</span> name<span class="token punctuation">,</span> city<span class="token punctuation">,</span> total_spent<span class="token punctuation">,</span> signup_date<span class="token punctuation">,</span> age <span class="token keyword">FROM</span> customers <span class="token keyword">WHERE</span> total_spent <span class="token operator">></span> <span class="token number">1000</span> <span class="token operator">AND</span> <span class="token punctuation">(</span>signup_date <span class="token operator">></span> <span class="token string">'2023-01-01'</span> <span class="token operator">OR</span> email_opt_in <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token operator">AND</span> state <span class="token operator">=</span> <span class="token string">'TX'</span> <span class="token operator">AND</span> age <span class="token operator">BETWEEN</span> <span class="token number">25</span> <span class="token operator">AND</span> <span class="token number">60</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> total_spent <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
Part 9: Combining WHERE with Other Clauses
WHERE with ORDER BY
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> price<span class="token punctuation">,</span> rating <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator"><</span> <span class="token number">20</span> <span class="token operator">AND</span> rating <span class="token operator">></span> <span class="token number">4.5</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> rating <span class="token keyword">DESC</span><span class="token punctuation">,</span> price <span class="token keyword">ASC</span><span class="token punctuation">;</span> |
WHERE with GROUP BY and HAVING
The WHERE clause filters rows BEFORE grouping, while HAVING filters groups AFTER grouping:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- First, WHERE filters to recent books, then GROUP BY, then HAVING filters genres</span> <span class="token keyword">SELECT</span> genre<span class="token punctuation">,</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> book_count<span class="token punctuation">,</span> <span class="token function">AVG</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span> <span class="token keyword">AS</span> avg_price<span class="token punctuation">,</span> <span class="token function">AVG</span><span class="token punctuation">(</span>rating<span class="token punctuation">)</span> <span class="token keyword">AS</span> avg_rating <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publication_date <span class="token operator">></span> <span class="token string">'1950-01-01'</span> <span class="token comment">-- Filter rows first</span> <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> genre <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token number">2</span> <span class="token comment">-- Filter groups after</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> avg_rating <span class="token keyword">DESC</span><span class="token punctuation">;</span> |
WHERE with LIMIT
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> price<span class="token punctuation">,</span> rating <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> in_stock <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token operator">AND</span> rating <span class="token operator">></span> <span class="token number">4.0</span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> price <span class="token keyword">DESC</span> <span class="token keyword">LIMIT</span> <span class="token number">5</span><span class="token punctuation">;</span> |
Part 10: Performance Considerations
1. Indexes for WHERE Clauses
Indexes dramatically speed up WHERE conditions. Create indexes on columns frequently used in WHERE:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token comment">-- Index for single column equality</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_books_genre <span class="token keyword">ON</span> books<span class="token punctuation">(</span>genre<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Index for range queries</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_books_price <span class="token keyword">ON</span> books<span class="token punctuation">(</span>price<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Composite index for multiple columns</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_books_genre_price <span class="token keyword">ON</span> books<span class="token punctuation">(</span>genre<span class="token punctuation">,</span> price<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Index for date ranges</span> <span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_books_publication_date <span class="token keyword">ON</span> books<span class="token punctuation">(</span>publication_date<span class="token punctuation">)</span><span class="token punctuation">;</span> |
2. Use EXPLAIN to Understand Query Execution
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token keyword">EXPLAIN</span> <span class="token keyword">ANALYZE</span> <span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> genre <span class="token operator">=</span> <span class="token string">'Fiction'</span> <span class="token operator">AND</span> price <span class="token operator">BETWEEN</span> <span class="token number">10</span> <span class="token operator">AND</span> <span class="token number">20</span><span class="token punctuation">;</span> |
This shows whether PostgreSQL uses your indexes and how it executes the query.
3. Be Careful with Functions on Indexed Columns
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- This WON'T use an index on publication_date</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> EXTRACT<span class="token punctuation">(</span><span class="token keyword">YEAR</span> <span class="token keyword">FROM</span> publication_date<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">1949</span><span class="token punctuation">;</span> <span class="token comment">-- This CAN use an index on publication_date</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> publication_date <span class="token operator">BETWEEN</span> <span class="token string">'1949-01-01'</span> <span class="token operator">AND</span> <span class="token string">'1949-12-31'</span><span class="token punctuation">;</span> |
4. LIKE Performance
-
LIKE 'pattern%'can use an index (anchored at start) -
LIKE '%pattern'cannot use a standard index (wildcard at start) -
Consider
pg_trgmextension for text search with leading wildcards
Part 11: Common Mistakes and How to Avoid Them
Mistake 1: Using = with NULL
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- ❌ Wrong</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">=</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> <span class="token comment">-- ✅ Correct</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">IS</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> |
Mistake 2: Forgetting Quotes Around Strings
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">-- ❌ Wrong</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">=</span> George Orwell<span class="token punctuation">;</span> <span class="token comment">-- ✅ Correct</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> author <span class="token operator">=</span> <span class="token string">'George Orwell'</span><span class="token punctuation">;</span> |
Mistake 3: Mixing AND/OR Without Parentheses
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- ❌ Wrong - finds all biographies OR (self-help AND cheap)</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> genre <span class="token operator">=</span> <span class="token string">'Biography'</span> <span class="token operator">OR</span> genre <span class="token operator">=</span> <span class="token string">'Self-help'</span> <span class="token operator">AND</span> price <span class="token operator"><</span> <span class="token number">20</span><span class="token punctuation">;</span> <span class="token comment">-- ✅ Correct</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>genre <span class="token operator">=</span> <span class="token string">'Biography'</span> <span class="token operator">OR</span> genre <span class="token operator">=</span> <span class="token string">'Self-help'</span><span class="token punctuation">)</span> <span class="token operator">AND</span> price <span class="token operator"><</span> <span class="token number">20</span><span class="token punctuation">;</span> |
Mistake 4: Using IN with an Empty List
|
0 1 2 3 4 5 6 7 |
<span class="token comment">-- This returns no rows (not an error)</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> genre <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Mistake 5: Not Handling NULL in NOT IN
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">-- If any price is NULL, this returns NO rows!</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> price <span class="token operator">NOT</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">-- Better to handle NULL explicitly</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>price <span class="token operator">NOT</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">)</span> <span class="token operator">OR</span> price <span class="token operator">IS</span> <span class="token boolean">NULL</span><span class="token punctuation">)</span> <span class="token operator">AND</span> price <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">;</span> <span class="token comment">-- Or exclude NULLs if you want</span> |
Mistake 6: Assuming Boolean Comparisons
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">-- These all work, but be clear:</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> in_stock <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> in_stock<span class="token punctuation">;</span> <span class="token comment">-- Same, but less explicit</span> <span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> <span class="token operator">NOT</span> in_stock<span class="token punctuation">;</span> <span class="token comment">-- For false values</span> |
I recommend using explicit = true and = false for clarity.
Summary: The WHERE Clause Philosophy
The WHERE clause is your primary tool for asking precise questions of your data. Master these concepts in order:
-
Basic comparisons (=, !=, >, <, >=, <=)
-
Logical combinations (AND, OR, NOT with parentheses)
-
Special operators (BETWEEN, IN, LIKE, ILIKE)
-
NULL handling (IS NULL, IS NOT NULL)
-
Date and time filtering
-
Performance optimization (indexes, EXPLAIN)
Remember the execution order:
-
FROM (identify table)
-
WHERE (filter rows) – happens HERE!
-
GROUP BY (group filtered rows)
-
HAVING (filter groups)
-
SELECT (choose columns)
-
ORDER BY (sort results)
-
LIMIT (limit output)
Every time you write a WHERE clause, you’re refining your question to the database. Start broad, then narrow down step by step. Test with small result sets first, then add complexity.
The WHERE clause transforms you from someone who just looks at data into someone who can interrogate it, find patterns, answer questions, and make data-driven decisions. It’s the difference between “Here’s our entire customer list” and “Here are our high-value customers in Texas who haven’t ordered in 6 months.”
Practice with these examples, experiment with your own data, and soon filtering with WHERE will become second nature!
Would you like me to elaborate on any specific aspect of the WHERE clause, such as more complex conditions, performance tuning, or integration with joins and subqueries?
