πŸŽ‰ 75% of content is free forever β€” Unlock Premium from $10/mo β†’
CW
Search courses…
πŸ’Ό Servicesℹ️ Aboutβœ‰οΈ ContactView Pricing Plansfrom $10

AND, OR, NOT Operators

SQL FundamentalsDML🟒 Free Lesson

Advertisement

SQL Fundamentals

AND, OR, NOT Operators

Combine multiple conditions in your WHERE clause with AND, OR, and NOT.

  • AND β€” All conditions must be true
  • OR β€” At least one condition must be true
  • NOT β€” Negates a condition Master Boolean logic to build precise filters.

What Are Logical Operators?

AND (Intersection)ABA∩BBoth must be TRUEOR (Union)ABAβˆͺBAt least one TRUENOT (Complement)NOT ANegates condition
SELECT * FROM employees
WHERE department = 'Engineering' AND salary > 70000;

AND Operator

AND returns TRUE only when all conditions are TRUE. Use it to narrow results.

-- Find active products under $500
SELECT * FROM products
WHERE category = 'Electronics'
AND price < 500
AND stock_quantity > 0;
-- Date range with AND
SELECT * FROM orders
WHERE order_date >= '2024-01-01'
AND order_date <= '2024-12-31'
AND status != 'Cancelled';
Condition ACondition BA AND B
TRUETRUETRUE
TRUEFALSEFALSE
FALSETRUEFALSE
FALSEFALSEFALSE

OR Operator

OR returns TRUE when any condition is TRUE. Use it to broaden results.

-- Find employees in Engineering or Sales
SELECT * FROM employees
WHERE department = 'Engineering'
OR department = 'Sales';
-- Multiple OR conditions
SELECT * FROM customers
WHERE city = 'New York'
OR city = 'Los Angeles'
OR city = 'Chicago';
Condition ACondition BA OR B
TRUETRUETRUE
TRUEFALSETRUE
FALSETRUETRUE
FALSEFALSEFALSE

NOT Operator

NOT negates a condition, reversing its Boolean value.

-- Exclude Engineering department
SELECT * FROM employees
WHERE NOT department = 'Engineering';
-- NOT with IN
SELECT * FROM products
WHERE NOT category_id IN (1, 2, 3);
-- NOT with EXISTS
SELECT * FROM customers c
WHERE NOT EXISTS (
    SELECT 1 FROM orders o
    WHERE o.customer_id = c.customer_id
);
ConditionNOT Condition
TRUEFALSE
FALSETRUE
UNKNOWNUNKNOWN

Operator Precedence

SQL evaluates operators in a specific order. Understanding precedence prevents unexpected results.

-- Precedence: NOT > AND > OR
-- Without parentheses (AND binds first)
SELECT * FROM employees
WHERE department = 'Engineering'
OR department = 'Sales'
AND salary > 80000;
-- Interpreted as: Engineering OR (Sales AND salary > 80000)

-- With parentheses (clear intent)
SELECT * FROM employees
WHERE (department = 'Engineering' OR department = 'Sales')
AND salary > 80000;
-- Interpreted as: (Engineering OR Sales) AND salary > 80000
-- Complex expression with clear precedence
SELECT * FROM products
WHERE (category = 'Electronics' OR category = 'Computers')
AND (price < 500 OR price > 2000)
AND NOT status = 'Discontinued';

Combining All Three

Real-world queries often mix AND, OR, and NOT for precise filtering.

-- Find active customers in specific cities who have not placed orders
SELECT * FROM customers
WHERE (city = 'New York' OR city = 'Los Angeles')
AND status = 'Active'
AND NOT customer_id IN (
    SELECT DISTINCT customer_id FROM orders
);
-- Find products that are in stock but not in clearance
SELECT * FROM products
WHERE stock_quantity > 0
AND NOT status = 'Discontinued'
AND (category = 'Electronics' OR category = 'Clothing');

Performance Considerations

-- Slow: OR may bypass index
SELECT * FROM employees
WHERE department = 'Engineering'
OR department = 'Sales';

-- Faster: UNION with indexed columns
SELECT * FROM employees WHERE department = 'Engineering'
UNION
SELECT * FROM employees WHERE department = 'Sales';
OperatorIndex FriendlyAlternative
ANDYesβ€”
ORSometimesUNION
NOT INSometimesNOT EXISTS, LEFT JOIN
NOT EXISTSYesβ€”

Practice Exercises

Exercise 1: Find all active Electronics products under $500 with stock.

-- Solution
SELECT * FROM products
WHERE category = 'Electronics'
AND price < 500
AND stock_quantity > 0
AND status = 'Active';

Exercise 2: Find employees who are managers or earn more than $100,000.

-- Solution
SELECT * FROM employees
WHERE job_title = 'Manager'
OR salary > 100000;

Exercise 3: Find customers not from New York who have placed at least one order.

-- Solution
SELECT * FROM customers c
WHERE NOT city = 'New York'
AND EXISTS (
    SELECT 1 FROM orders o
    WHERE o.customer_id = c.customer_id
);

Summary

OperatorLogicUse Case
ANDAll TRUENarrow results
ORAny TRUEBroaden results
NOTNegateExclude rows
INValue in listMultiple OR conditions
BETWEENRange checkInclusive range

Need Expert SQL Help?

Get personalized tutoring, project support, or professional consulting.

Advertisement