Wicked Smart Data
LearnInsightsAboutContact
Sign InLet's Build
LearnInsightsAboutContact
Sign InLet's Build
Wicked Smart Data

Intelligence, automation, and expert execution — plus an elite library of free knowledge. We turn complexity into competitive advantage.

Start a conversation

Platform

  • Learning Paths
  • Insights
  • RSS Feed

Company

  • About
  • Contact
  • Work With Us

Legal

  • Privacy Policy
  • Terms of Service

© 2026 Wicked Smart Data. All rights reserved.

Intelligence · Automation · Advantage

All Insights
SQL

Filtering and Sorting Data in SQL: WHERE, AND, OR, IN, BETWEEN, ORDER BY

Master SQL's filtering and sorting operations to transform overwhelming datasets into precisely targeted results. Learn to combine multiple conditions and organize data exactly how you need it.

🌱 Foundation13 min readApr 21, 2026Updated Aug 29, 2026
Filtering and Sorting Data in SQL: WHERE, AND, OR, IN, BETWEEN, ORDER BY
On this page
  • Prerequisites
  • Understanding the WHERE Clause: Your Data Filter
  • Combining Conditions with AND: When All Criteria Must Be True
  • Expanding Possibilities with OR: When Any Condition Can Be True
  • Mixing AND and OR: The Power of Parentheses
  • Streamlining Lists with IN: A Cleaner Alternative to Multiple ORs
  • Finding Ranges with BETWEEN: Inclusive Boundary Checking
  • Organizing Results with ORDER BY: Making Data Meaningful
  • Combining Everything: Complex Real-World Queries
  • Hands-On Exercise
  • Common Mistakes & Troubleshooting
  • Summary & Next Steps
  • Filtering and Sorting Data in SQL: Your First Steps to Meaningful Analysis

    Imagine you're handed a massive customer database with millions of records spanning decades. Your boss walks over and asks, "Can you show me just the customers from New York who made purchases over $500 in the last quarter, sorted by purchase amount?" Without filtering and sorting capabilities, you'd be drowning in irrelevant data. This is exactly why mastering SQL's filtering and sorting operations is crucial for any data professional.

    By the end of this lesson, you'll transform from someone who can only see entire datasets to someone who can slice, dice, and organize data with surgical precision. You'll learn to ask specific questions of your data and get exactly the answers you need, presented exactly how you want them.

    What you'll learn:

    • How to filter rows using WHERE clauses with multiple conditions
    • When and how to use AND, OR, IN, and BETWEEN operators effectively
    • How to sort results with ORDER BY for meaningful data presentation
    • How to combine filtering and sorting for comprehensive data analysis
    • Common pitfalls and how to avoid them when building complex queries

    Prerequisites

    This lesson assumes you understand basic SQL SELECT statements and can connect to a database. If you can write SELECT * FROM table_name and understand what it does, you're ready to proceed.

    Understanding the WHERE Clause: Your Data Filter

    Think of the WHERE clause as a bouncer at an exclusive club. It examines each row in your table and decides whether that row meets your criteria. Only the rows that pass your test make it into your final results.

    Let's start with a realistic scenario. You're working with an e-commerce company's customer orders table that looks like this:

    CREATE TABLE customer_orders (
        order_id INT,
        customer_name VARCHAR(100),
        order_date DATE,
        total_amount DECIMAL(10,2),
        shipping_state VARCHAR(50),
        product_category VARCHAR(50),
        payment_method VARCHAR(30)
    );
    

    Your most basic filter looks like this:

    SELECT customer_name, total_amount, order_date
    FROM customer_orders
    WHERE total_amount > 100;
    

    This query examines every single row in the customer_orders table. For each row, it asks: "Is the total_amount greater than 100?" If yes, that row gets included in your results. If no, it's filtered out completely.

    The WHERE clause always comes after the FROM clause and before any ORDER BY clause. This order matters because SQL needs to know which table you're querying before it can apply filters to that table's data.

    Let's see what kinds of conditions you can create:

    -- Exact matches
    SELECT * FROM customer_orders 
    WHERE shipping_state = 'California';
    
    -- Numeric comparisons
    SELECT * FROM customer_orders 
    WHERE total_amount >= 250;
    
    -- Date comparisons
    SELECT * FROM customer_orders 
    WHERE order_date > '2023-01-01';
    
    -- Text pattern matching
    SELECT * FROM customer_orders 
    WHERE customer_name LIKE 'Smith%';
    

    Notice that text values need single quotes, while numbers and dates can vary depending on your database system. Most modern databases accept dates in 'YYYY-MM-DD' format.

    Tip

    The LIKE operator with % is incredibly powerful. 'Smith%' matches any name starting with "Smith", while '%Smith%' would match any name containing "Smith" anywhere within it.

    Combining Conditions with AND: When All Criteria Must Be True

    Real-world questions rarely involve just one condition. You might need customers from California AND who spent more than $200 AND who ordered in the last 30 days. This is where the AND operator becomes essential.

    When you use AND, every single condition must be true for a row to appear in your results. Think of it as a series of gates that each row must pass through:

    SELECT customer_name, total_amount, order_date, shipping_state
    FROM customer_orders
    WHERE shipping_state = 'California'
      AND total_amount > 200
      AND order_date >= '2023-06-01';
    

    This query creates three checkpoints:

    1. Is the shipping state California?
    2. Is the total amount greater than 200?
    3. Is the order date on or after June 1st, 2023?

    Only rows that answer "yes" to all three questions make it into your final results.

    You can chain as many AND conditions as needed:

    SELECT *
    FROM customer_orders
    WHERE shipping_state = 'New York'
      AND total_amount BETWEEN 100 AND 500
      AND product_category = 'Electronics'
      AND payment_method = 'Credit Card'
      AND order_date >= '2023-01-01';
    

    Notice how we're formatting this query with each condition on its own line. This isn't required by SQL, but it makes complex queries much easier to read and debug.

    Expanding Possibilities with OR: When Any Condition Can Be True

    While AND narrows your results, OR expands them. With OR, a row appears in your results if it meets any one of your specified conditions. This is perfect for questions like "Show me orders from California OR New York" or "Show me high-value orders OR recent orders."

    SELECT customer_name, total_amount, shipping_state, order_date
    FROM customer_orders
    WHERE shipping_state = 'California'
       OR shipping_state = 'New York'
       OR shipping_state = 'Texas';
    

    This query will return orders from any of these three states. A customer from California will appear in results, a customer from New York will appear, and a customer from Texas will appear. A customer from Florida will not appear.

    You can also mix different types of conditions with OR:

    SELECT *
    FROM customer_orders
    WHERE total_amount > 1000
       OR product_category = 'Luxury'
       OR customer_name LIKE '%VIP%';
    

    This finds orders that are either high-value (over $1000), or luxury category items, or from customers with "VIP" in their name. An order only needs to meet one of these criteria to be included.

    Mixing AND and OR: The Power of Parentheses

    Here's where things get interesting and where many beginners stumble. When you mix AND and OR in the same query, you need to understand operator precedence. SQL evaluates AND before OR, just like multiplication before addition in math.

    Consider this query:

    -- This might not do what you expect!
    SELECT *
    FROM customer_orders
    WHERE shipping_state = 'California' 
       OR shipping_state = 'New York'
       AND total_amount > 500;
    

    Due to operator precedence, SQL reads this as: "(California) OR (New York AND amount > 500)"

    This means you'll get ALL California orders regardless of amount, but only New York orders over $500. That's probably not what you intended.

    To get orders over $500 from either California OR New York, use parentheses:

    SELECT *
    FROM customer_orders
    WHERE (shipping_state = 'California' OR shipping_state = 'New York')
      AND total_amount > 500;
    

    Parentheses force SQL to evaluate the OR condition first, then apply the AND condition to those results. Now you'll get high-value orders from both states.

    Here's a more complex example:

    SELECT customer_name, total_amount, shipping_state, product_category
    FROM customer_orders
    WHERE (shipping_state = 'California' OR shipping_state = 'New York')
      AND (total_amount > 500 OR product_category = 'Electronics')
      AND order_date >= '2023-01-01';
    

    This finds recent orders from CA or NY that are either high-value or electronics purchases.

    Streamlining Lists with IN: A Cleaner Alternative to Multiple ORs

    When you need to check if a value matches any item in a list, the IN operator is much cleaner than chaining multiple OR conditions. Instead of writing:

    WHERE shipping_state = 'California' 
       OR shipping_state = 'New York'
       OR shipping_state = 'Texas'
       OR shipping_state = 'Florida';
    

    You can write:

    WHERE shipping_state IN ('California', 'New York', 'Texas', 'Florida');
    

    The IN operator is not just cleaner—it's often faster for the database to execute and much easier to maintain. Need to add another state? Just add it to the list.

    IN works with numbers and dates too:

    -- Find orders with specific amounts
    SELECT *
    FROM customer_orders
    WHERE total_amount IN (99.99, 149.99, 199.99, 249.99);
    
    -- Find orders from specific days
    SELECT *
    FROM customer_orders
    WHERE order_date IN ('2023-01-15', '2023-02-14', '2023-03-17');
    

    You can also use NOT IN to exclude specific values:

    SELECT *
    FROM customer_orders
    WHERE shipping_state NOT IN ('Alaska', 'Hawaii')
      AND product_category NOT IN ('Discontinued', 'Recalled');
    

    This finds orders that aren't shipping to Alaska or Hawaii and aren't from discontinued or recalled product categories.

    Finding Ranges with BETWEEN: Inclusive Boundary Checking

    The BETWEEN operator is perfect when you need to find values within a range. It's inclusive, meaning it includes both the start and end values you specify.

    SELECT customer_name, total_amount, order_date
    FROM customer_orders
    WHERE total_amount BETWEEN 100 AND 500;
    

    This is equivalent to:

    WHERE total_amount >= 100 AND total_amount <= 500;
    

    But BETWEEN is more readable and concise. It works great with dates too:

    SELECT *
    FROM customer_orders
    WHERE order_date BETWEEN '2023-06-01' AND '2023-08-31';
    

    This finds all summer orders (June through August, inclusive).

    You can use NOT BETWEEN to exclude ranges:

    SELECT *
    FROM customer_orders
    WHERE total_amount NOT BETWEEN 50 AND 150;
    

    This finds orders that are either under $50 or over $150—everything except the middle range.

    Warning

    Be careful with BETWEEN and datetime values. '2023-08-31' actually means '2023-08-31 00:00:00', so you might miss orders from later in the day on August 31st. For full-day inclusion, use '2023-08-31 23:59:59' or '2023-09-01' as your end date.

    Organizing Results with ORDER BY: Making Data Meaningful

    Filtering gets you the right data, but sorting presents it in a meaningful way. The ORDER BY clause always comes at the very end of your query, after all filtering is complete.

    SELECT customer_name, total_amount, order_date
    FROM customer_orders
    WHERE shipping_state IN ('California', 'New York', 'Texas')
    ORDER BY total_amount;
    

    By default, ORDER BY sorts in ascending order (smallest to largest for numbers, A to Z for text, oldest to newest for dates). To reverse this, add DESC:

    SELECT customer_name, total_amount, order_date
    FROM customer_orders
    WHERE total_amount > 200
    ORDER BY total_amount DESC;
    

    Now you'll see the highest-value orders first, which is often more useful for business analysis.

    You can sort by multiple columns by separating them with commas:

    SELECT customer_name, shipping_state, total_amount, order_date
    FROM customer_orders
    WHERE order_date >= '2023-01-01'
    ORDER BY shipping_state, total_amount DESC;
    

    This first groups results by state (alphabetically), then within each state, shows orders from highest to lowest value. Multi-column sorting is incredibly powerful for creating organized reports.

    You can even mix ascending and descending sorts:

    SELECT customer_name, shipping_state, total_amount, order_date
    FROM customer_orders
    WHERE product_category = 'Electronics'
    ORDER BY shipping_state ASC, order_date DESC, total_amount DESC;
    

    This sorts by state (A to Z), then within each state by newest orders first, then within each date by highest amounts first.

    Combining Everything: Complex Real-World Queries

    Now let's put everything together with realistic business scenarios:

    -- Find high-value recent orders from key markets
    SELECT customer_name, shipping_state, total_amount, order_date, product_category
    FROM customer_orders
    WHERE (shipping_state IN ('California', 'New York', 'Texas', 'Florida'))
      AND order_date BETWEEN '2023-07-01' AND '2023-09-30'
      AND (total_amount > 300 OR product_category IN ('Electronics', 'Luxury'))
    ORDER BY total_amount DESC, order_date DESC;
    

    This query answers: "Show me recent orders from our top markets that are either high-value or in premium categories, with the most valuable and recent orders first."

    Here's another complex example:

    -- Identify potential VIP customers for a promotion
    SELECT customer_name, shipping_state, total_amount, order_date, payment_method
    FROM customer_orders
    WHERE total_amount BETWEEN 500 AND 2000
      AND shipping_state NOT IN ('Alaska', 'Hawaii')  -- Exclude expensive shipping zones
      AND order_date >= '2023-06-01'
      AND payment_method IN ('Credit Card', 'PayPal')
      AND product_category NOT IN ('Clearance', 'Returned')
    ORDER BY total_amount DESC, customer_name;
    

    This finds mid-to-high value customers from the continental US who've ordered recently with reliable payment methods, excluding clearance sales.

    Hands-On Exercise

    Let's practice with a scenario. You're analyzing sales data for a clothing retailer. Create and populate a practice table:

    CREATE TABLE clothing_sales (
        sale_id INT,
        customer_name VARCHAR(100),
        item_category VARCHAR(50),
        sale_amount DECIMAL(8,2),
        sale_date DATE,
        store_location VARCHAR(50),
        season VARCHAR(20),
        customer_age INT
    );
    
    INSERT INTO clothing_sales VALUES
    (1, 'Jennifer Chen', 'Dresses', 89.99, '2023-07-15', 'San Francisco', 'Summer', 34),
    (2, 'Michael Rodriguez', 'Shirts', 45.50, '2023-06-22', 'Austin', 'Summer', 28),
    (3, 'Sarah Johnson', 'Jackets', 129.99, '2023-09-10', 'Seattle', 'Fall', 42),
    (4, 'David Kim', 'Pants', 79.99, '2023-08-05', 'San Francisco', 'Summer', 31),
    (5, 'Amanda Davis', 'Dresses', 159.99, '2023-07-28', 'Portland', 'Summer', 29),
    (6, 'Robert Wilson', 'Jackets', 199.99, '2023-09-15', 'Austin', 'Fall', 38),
    (7, 'Lisa Thompson', 'Shoes', 89.99, '2023-08-20', 'Seattle', 'Summer', 45),
    (8, 'James Brown', 'Shirts', 35.99, '2023-06-30', 'Portland', 'Summer', 52);
    

    Now try these queries:

    1. Find all summer sales over $75:
    SELECT customer_name, item_category, sale_amount, store_location
    FROM clothing_sales
    WHERE season = 'Summer' AND sale_amount > 75
    ORDER BY sale_amount DESC;
    
    1. Find customers aged 30-45 from West Coast stores:
    SELECT customer_name, customer_age, store_location, sale_amount
    FROM clothing_sales
    WHERE customer_age BETWEEN 30 AND 45
      AND store_location IN ('San Francisco', 'Seattle', 'Portland')
    ORDER BY customer_age, sale_amount DESC;
    
    1. Find high-value items or jacket sales from any location:
    SELECT customer_name, item_category, sale_amount, store_location, sale_date
    FROM clothing_sales
    WHERE sale_amount > 100 OR item_category = 'Jackets'
    ORDER BY sale_date DESC;
    

    Common Mistakes & Troubleshooting

    Mistake 1: Forgetting quotes around text values

    -- Wrong
    WHERE shipping_state = California
    
    -- Right
    WHERE shipping_state = 'California'
    

    Mistake 2: Misunderstanding AND/OR precedence

    -- This doesn't work as expected
    WHERE state = 'CA' OR state = 'NY' AND amount > 100
    
    -- Use parentheses for clarity
    WHERE (state = 'CA' OR state = 'NY') AND amount > 100
    

    Mistake 3: Using = instead of IN for multiple values

    -- Wrong - this will never find anything
    WHERE shipping_state = ('CA', 'NY', 'TX')
    
    -- Right
    WHERE shipping_state IN ('CA', 'NY', 'TX')
    

    Mistake 4: Forgetting that BETWEEN is inclusive

    -- This includes both June 1 and June 30
    WHERE order_date BETWEEN '2023-06-01' AND '2023-06-30'
    
    -- If you want to exclude June 30, use:
    WHERE order_date >= '2023-06-01' AND order_date < '2023-06-30'
    

    Mistake 5: Wrong ORDER BY placement

    -- Wrong - ORDER BY must come last
    SELECT * FROM orders ORDER BY amount WHERE state = 'CA'
    
    -- Right
    SELECT * FROM orders WHERE state = 'CA' ORDER BY amount
    

    Debugging tip

    When your query returns unexpected results, test each condition separately. Start with a simple SELECT * FROM table_name, then add one WHERE condition at a time until you identify the problem.

    Summary & Next Steps

    You now have the core tools for asking specific questions of your data. The WHERE clause filters rows based on conditions, AND requires all conditions to be true, OR accepts rows meeting any condition, IN simplifies checking against lists of values, BETWEEN handles ranges elegantly, and ORDER BY presents results in meaningful sequences.

    These aren't just technical tools—they're the foundation of data analysis. Every business question you'll ever answer with data starts with filtering and sorting. "Show me our best customers," "Find struggling product lines," "Identify seasonal trends"—all of these begin with the techniques you've just learned.

    Key takeaways:

    • WHERE filters data; only matching rows appear in results
    • Use AND when all conditions must be true; use OR when any condition can be true
    • Parentheses control the order of evaluation in complex conditions
    • IN is cleaner than multiple OR conditions for list matching
    • BETWEEN includes both boundary values in ranges
    • ORDER BY always comes last and can sort by multiple columns

    Next steps: Practice these concepts with your own datasets. Start combining them with aggregate functions like COUNT(), SUM(), and AVG() to create powerful analytical queries. The more you use these filtering and sorting techniques, the more natural they'll become, and the more sophisticated questions you'll be able to answer with your data.

    Work With Us

    From insight to implementation

    Reading is the start. When you're ready to build the data, automation, or AI systems behind it, our team turns strategy into shipped results.

    Let's Build

    SQL Fundamentals

    Previous

    Advanced SQL Filtering and Sorting: WHERE, AND, OR, IN, BETWEEN, ORDER BY for Data Professionals

    Next

    Mastering SQL Filtering and Sorting: WHERE, AND, OR, IN, BETWEEN, ORDER BY

    Related Insights

    SQLExpert

    Deterministic and Nondeterministic Functions in SQL: Understanding Volatility Categories and Their Impact on Query Planning, Caching, and Index Usage

    30 min
    SQLPractitioner

    Multitenancy Query Patterns in SQL: Schema-Per-Tenant, Shared Tables, and Efficient Cross-Tenant Reporting Strategies

    21 min
    SQLFoundation

    Mastering SQL Joins with Aggregates: Combining GROUP BY, COUNT, and SUM Across Related Tables

    16 min

    On this page

    • Prerequisites
    • Understanding the WHERE Clause: Your Data Filter
    • Combining Conditions with AND: When All Criteria Must Be True
    • Expanding Possibilities with OR: When Any Condition Can Be True
    • Mixing AND and OR: The Power of Parentheses
    • Streamlining Lists with IN: A Cleaner Alternative to Multiple ORs
    • Finding Ranges with BETWEEN: Inclusive Boundary Checking
    • Organizing Results with ORDER BY: Making Data Meaningful
    • Combining Everything: Complex Real-World Queries
    • Hands-On Exercise
    • Common Mistakes & Troubleshooting
    • Summary & Next Steps