NOT is evaluated before AND, which is evaluated before OR. Use parentheses for clarity:
-- Without parentheses: AND binds tighter than ORWHERE a = 1 OR b = 2 AND c = 3-- Equivalent to: a = 1 OR (b = 2 AND c = 3)-- With parentheses for clarityWHERE (a = 1 OR b = 2) AND c = 3
SELECT user_id, email, status, ageFROM company_data."123"WHERE (status = 'active' OR status = 'pending') AND NOT is_deleted AND (score > 90 OR is_premium = true)
SELECT user_id, email, status, ageFROM company_data."123"WHERE status IN ('active', 'pending', 'review') AND category NOT IN ('test', 'demo', 'internal')
SELECT user_id, email, status, ageFROM company_data."123"WHERE age BETWEEN 25 AND 45 AND event_date BETWEEN '2024-01-01' AND '2024-12-31' AND score BETWEEN 80 AND 100
SELECT user_id, email, status, ageFROM company_data."123"WHERE name LIKE 'John%' -- Starts with "John" AND email LIKE '%@gmail.com' -- Ends with "@gmail.com" AND code LIKE 'A__' -- "A" followed by exactly 2 characters
SELECT user_id, email, status, ageFROM company_data."123"WHERE -- Last 30 days event_timestamp > CURRENT_DATE - INTERVAL '30' DAY -- Last 3 months AND created_at >= CURRENT_DATE - INTERVAL '3' MONTH -- Events in the next 7 days AND scheduled_date <= CURRENT_DATE + INTERVAL '7' DAY
Use parentheses to override default precedence or improve readability:
SELECT -- Arithmetic: multiplication before addition price + quantity * discount, -- = price + (quantity * discount) (price + quantity) * discount, -- Override precedence -- Logical: AND before OR a OR b AND c, -- = a OR (b AND c) (a OR b) AND c -- Override precedenceFROM company_data."123"