Filtering Data
## Learning Objectives
- Master WHERE clauses
- Use comparison operators
- Work with logical operators
- Handle NULL in filtering
## WHERE Clause
### Basic Comparison
```sql
SELECT first_name, last_name, salary
FROM employees
WHERE salary > 60000;
```
### Multiple Conditions
```sql
SELECT first_name, last_name, department
FROM employees
WHERE department = 'Sales';
```
## Comparison Operators
| Operator | Description |
|----------|-------------|
| = | Equal |
| <> or != | Not equal |
| > | Greater than |
| < | Less than |
| >= | Greater than or equal |
| <= | Less than or equal |
### Examples
```sql
-- Salary equals 75000
WHERE salary = 75000
-- Salary not equal to 50000
WHERE salary <> 50000
-- Salary greater than 50000
WHERE salary > 50000
-- Salary between (inclusive)
WHERE salary >= 50000 AND salary <= 80000
```
## Logical Operators
### AND
```sql
SELECT *
FROM employees
WHERE department = 'Sales' AND salary > 50000;
```
### OR
```sql
SELECT *
FROM employees
WHERE department = 'Sales' OR department = 'Marketing';
```
### NOT
```sql
SELECT *
FROM employees
WHERE NOT department = 'Sales';
-- Same as
WHERE department <> 'Sales';
```
### Operator Precedence
```sql
-- AND has higher precedence than OR
WHERE (department = 'Sales' OR department = 'Marketing') AND salary > 60000
```
## IN Operator
### Single Column IN
```sql
SELECT *
FROM employees
WHERE department IN ('Sales', 'Marketing', 'HR');
```
### NOT IN
```sql
SELECT *
FROM employees
WHERE department NOT IN ('Sales', 'Marketing');
```
## BETWEEN Operator
### Range Check
```sql
SELECT *
FROM employees
WHERE salary BETWEEN 50000 AND 80000;
-- Equivalent to
WHERE salary >= 50000 AND salary <= 80000;
```
### NOT BETWEEN
```sql
SELECT *
FROM employees
WHERE salary NOT BETWEEN 50000 AND 80000;
```
## LIKE Operator
### Pattern Matching
```sql
-- Names starting with 'A'
WHERE first_name LIKE 'A%'
-- Names containing 'on'
WHERE first_name LIKE '%on%'
-- Names ending with 's'
WHERE last_name LIKE '%s'
```
### Wildcards
| Wildcard | Description |
|----------|-------------|
| % | Any sequence of characters |
| _ | Single character |
### LIKE Examples
```sql
-- Starts with A, second char any, rest 'hn'
WHERE first_name LIKE 'A_n%'
-- Contains 'o' second character
WHERE first_name LIKE '_o%'
-- Email ending with .com
WHERE email LIKE '%.com'
```
### NOT LIKE
```sql
SELECT *
FROM employees
WHERE first_name NOT LIKE 'A%';
```
## ILIKE (PostgreSQL)
Case-insensitive pattern matching:
```sql
-- Case insensitive
WHERE first_name ILIKE 'alice'
WHERE first_name ILIKE '%ALICE%'
```
## Handling NULL in WHERE
### IS NULL
```sql
SELECT *
FROM employees
WHERE email IS NULL;
```
### IS NOT NULL
```sql
SELECT *
FROM employees
WHERE email IS NOT NULL;
```
### Common Mistake
```sql
-- WRONG - returns nothing
WHERE email = NULL
-- CORRECT
WHERE email IS NULL
```
## Pattern Examples
### Phone Numbers
```sql
-- (555) format
WHERE phone LIKE '(___) ___-____'
-- Starts with 555
WHERE phone LIKE '555%'
```
### Dates
```sql
-- Hired in 2020
WHERE hire_date LIKE '2020%'
-- Or for proper date handling:
WHERE hire_date >= '2020-01-01' AND hire_date <= '2020-12-31'
```
## Combining Filters
### Complex WHERE
```sql
SELECT
first_name,
last_name,
salary,
department
FROM employees
WHERE (department IN ('Sales', 'Marketing', 'Engineering'))
AND salary BETWEEN 50000 AND 100000
AND (first_name LIKE 'A%' OR last_name LIKE 'S%')
AND email IS NOT NULL;
```
## Summary
- WHERE filters rows based on conditions
- Comparison operators: =, <>, <, >, <=, >=
- Combine with AND, OR, NOT
- IN checks membership in a list
- BETWEEN checks ranges (inclusive)
- LIKE does pattern matching with % and _
- IS NULL / IS NOT NULL for NULL values
- Always use parentheses for complex conditions
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →