Skip to main content

MySQL WHERE Clause

Introduction

The WHERE clause is one of the most important components of MySQL queries. It allows you to filter data by specifying conditions that must be met for records to be included in the query results. Without filtering, your queries would return all records in a table, which is rarely what you want in real applications.

In this tutorial, you'll learn how to use the WHERE clause to specify conditions, filter data, and retrieve only the information you need from your database tables.

Basic Syntax

The basic syntax of a WHERE clause in MySQL is:

sql
SELECT column1, column2, ...
FROM table_name
WHERE condition;

The WHERE clause appears after the FROM clause in a SELECT statement and before any GROUP BY, HAVING, or ORDER BY clauses.

Simple Conditions

Let's start with some simple conditions using our example database. Assume we have a products table with the following structure:

sql
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
category VARCHAR(50),
price DECIMAL(10, 2),
stock INT,
date_added DATE
);

Equality Comparison

To select products where the category is exactly "Electronics":

sql
SELECT product_id, product_name, price
FROM products
WHERE category = 'Electronics';

Output:

+------------+-------------------+--------+
| product_id | product_name | price |
+------------+-------------------+--------+
| 1 | Smartphone X | 699.99 |
| 3 | Wireless Headset | 149.99 |
| 5 | Smart Watch | 249.99 |
+------------+-------------------+--------+

Inequality Comparison

To find products that are not in the "Clothing" category:

sql
SELECT product_name, category
FROM products
WHERE category != 'Clothing';

You can also use the <> operator instead of !=:

sql
SELECT product_name, category
FROM products
WHERE category <> 'Clothing';

Comparison Operators

MySQL supports the following comparison operators:

  • = Equal to
  • != or <> Not equal to
  • < Less than
  • > Greater than
  • <= Less than or equal to
  • >= Greater than or equal to

Example: Find products priced higher than $200:

sql
SELECT product_name, price
FROM products
WHERE price > 200;

Output:

+----------------+--------+
| product_name | price |
+----------------+--------+
| Smartphone X | 699.99 |
| Laptop Pro | 1299.99|
| Smart Watch | 249.99 |
+----------------+--------+

Combining Multiple Conditions

Logical AND

To combine multiple conditions where ALL conditions must be true, use the AND operator:

sql
SELECT product_name, price, stock
FROM products
WHERE price < 200 AND stock > 10;

This query returns products that cost less than $200 AND have more than 10 items in stock.

Logical OR

To combine conditions where AT LEAST ONE condition must be true, use the OR operator:

sql
SELECT product_name, category, price
FROM products
WHERE category = 'Electronics' OR price > 500;

This query returns products that are either in the Electronics category OR cost more than $500.

Logical NOT

The NOT operator negates a condition:

sql
SELECT product_name, category
FROM products
WHERE NOT category = 'Electronics';

This is equivalent to:

sql
SELECT product_name, category
FROM products
WHERE category <> 'Electronics';

Combining AND, OR and NOT

You can combine these operators for complex conditions. Use parentheses to make the logic clear:

sql
SELECT product_name, category, price, stock
FROM products
WHERE (category = 'Electronics' AND price < 300)
OR (stock < 5 AND NOT category = 'Clothing');

Special Conditions

BETWEEN Operator

The BETWEEN operator selects values within a given range (inclusive):

sql
SELECT product_name, price
FROM products
WHERE price BETWEEN 100 AND 300;

This returns products with prices from 100to100 to 300 (including both 100and100 and 300).

IN Operator

The IN operator allows you to specify multiple values in a WHERE clause:

sql
SELECT product_name, category
FROM products
WHERE category IN ('Electronics', 'Books', 'Games');

This returns products in any of the listed categories.

LIKE Operator

The LIKE operator performs pattern matching:

sql
SELECT product_name
FROM products
WHERE product_name LIKE 'Smart%';

This returns products whose names start with "Smart".

Pattern wildcards:

  • % - Represents zero, one, or multiple characters
  • _ - Represents exactly one character

Examples:

  • '%phone%' - Contains "phone" anywhere
  • 'S_art' - Starts with "S", then any single character, followed by "art"

IS NULL / IS NOT NULL

To find records with NULL values:

sql
SELECT product_name, description
FROM products
WHERE description IS NULL;

To find non-NULL records:

sql
SELECT product_name, description
FROM products
WHERE description IS NOT NULL;

Real-World Examples

E-commerce Filtering

Imagine you're building an e-commerce website and need to show products that are:

  1. In the Electronics category
  2. Priced under $500
  3. Currently in stock
sql
SELECT product_name, price, stock
FROM products
WHERE category = 'Electronics'
AND price < 500
AND stock > 0
ORDER BY price;

Date Filtering

Find products added in the last 30 days:

sql
SELECT product_name, date_added
FROM products
WHERE date_added >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY);

Complex Business Rule

Find discountable products based on complex business rules:

sql
SELECT product_name, price, category, stock
FROM products
WHERE (price > 100 AND stock > 20)
OR (category = 'Clearance' AND price > 50)
OR (date_added < DATE_SUB(CURRENT_DATE(), INTERVAL 180 DAY) AND stock > 10);

Subquery in WHERE Clause

You can also use subqueries in a WHERE clause:

sql
SELECT product_name, price
FROM products
WHERE product_id IN (
SELECT product_id
FROM order_items
GROUP BY product_id
HAVING COUNT(*) > 10
);

This finds products that have appeared in more than 10 orders.

Common Mistakes and Tips

Case Sensitivity

By default, string comparisons in MySQL are not case-sensitive. If you need case-sensitive comparisons, you can use the BINARY keyword:

sql
SELECT product_name
FROM products
WHERE BINARY category = 'electronics'; -- Won't match 'Electronics'

Optimizing WHERE Clauses

For better performance:

  1. Place the most restrictive conditions first when using AND
  2. Ensure columns used in WHERE clauses are indexed
  3. Avoid using functions on indexed columns in the WHERE clause, as this prevents index usage

Leading Wildcards

Using a leading wildcard (like LIKE '%phone') prevents the use of indexes and can be slow on large tables. Try to avoid if possible.

Summary

The WHERE clause is an essential part of MySQL queries that allows you to filter data based on specific conditions. Key points to remember:

  • Use comparison operators (=, <>, <, >, <=, >=) for basic conditions
  • Combine conditions with logical operators (AND, OR, NOT)
  • Use special operators like BETWEEN, IN, and LIKE for more complex filtering
  • Handle NULL values with IS NULL and IS NOT NULL
  • Be aware of performance implications, especially with wildcards and functions

By mastering the WHERE clause, you can retrieve exactly the data you need from your database, making your applications more efficient and responsive.

Practice Exercises

  1. Write a query to find all products in the 'Books' category with a price less than $20.
  2. Find all products that have the word 'Pro' in their name and cost more than $200.
  3. List products that are either out of stock OR were added more than 90 days ago.
  4. Find products that are not in the categories 'Electronics', 'Clothing', or 'Books'.
  5. Create a query to find products with stock between 5 and 15, and price above the average product price.

Additional Resources



If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)