-- Wildcards: % = any sequence, _ = single characterWHERE name LIKE'A%'-- starts with AWHERE name LIKE'%son'-- ends with sonWHERE name LIKE'%ann%'-- contains annWHERE name LIKE'_ohn'-- 4-char ending in ohn (John, Bohn...)WHERE email LIKE'%@gmail.%'-- gmail addresses-- ILIKE = case insensitive (PostgreSQL)WHERE name ILIKE 'alice%'-- SIMILAR TO = SQL regex-liteWHERE name SIMILARTO'(Alice|Bob)%'-- Regular expressions (PostgreSQL)WHERE name ~'^[A-Z]'-- starts with uppercase (case-sensitive)WHERE name ~*'^alice'-- case-insensitive regex
Date & Time Functions
-- Current date/timeSELECT NOW(); -- current timestamp with timezoneSELECTCURRENT_TIMESTAMP; -- sameSELECTCURRENT_DATE; -- date only: 2026-05-03SELECTCURRENT_TIME; -- time only-- Extract componentsSELECTEXTRACT(YEARFROM NOW()); -- 2026SELECTEXTRACT(MONTHFROM NOW()); -- 5SELECTEXTRACT(DAYFROM NOW()); -- 3SELECTEXTRACT(DOW FROM NOW()); -- 0=Sunday, 6=SaturdaySELECTEXTRACT(HOURFROM NOW());
-- Date truncationSELECT DATE_TRUNC('month', NOW()); -- 2026-05-01 00:00:00SELECT DATE_TRUNC('year', NOW()); -- 2026-01-01 00:00:00SELECT DATE_TRUNC('week', NOW()); -- Monday of current week-- ArithmeticSELECT NOW() +INTERVAL'7 days';
SELECT NOW() -INTERVAL'1 month';
SELECT'2026-05-03'::DATE-'2026-01-01'::DATE; -- 122 (days between)-- AGESELECT AGE('2026-05-03', '1998-01-15'); -- 28 years 3 mons 18 daysSELECTEXTRACT(YEARFROM AGE(birthdate)) AS age_years FROM users;
-- FormatSELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS'); -- '2026-05-03 14:30:00'SELECT TO_CHAR(NOW(), 'Month DD, YYYY'); -- 'May 03, 2026'-- ParseSELECT TO_DATE('03/05/2026', 'DD/MM/YYYY'); -- 2026-05-03SELECT TO_TIMESTAMP('2026-05-03 14:30', 'YYYY-MM-DD HH24:MI');
Common Date Filters
-- Last 30 daysWHERE created_at >= NOW() -INTERVAL'30 days'-- Current monthWHERE DATE_TRUNC('month', created_at) = DATE_TRUNC('month', NOW())
-- Specific yearWHEREEXTRACT(YEARFROM created_at) =2026-- Better (uses index):WHERE created_at >='2026-01-01'AND created_at <'2027-01-01'-- YesterdayWHERE created_at::DATE=CURRENT_DATE-1-- Last 7 complete days (excluding today)WHERE created_at >=CURRENT_DATE-7AND created_at <CURRENT_DATE
NULL-Handling Functions
-- COALESCE — return first non-NULLSELECTCOALESCE(phone, mobile, email, 'no contact') FROM users;
-- NULLIF — return NULL if two args are equal (avoid divide-by-zero)SELECT revenue /NULLIF(orders, 0) AS avg_order_value FROM summary;
-- NULLIF for blank string handlingSELECTNULLIF(TRIM(name), '') FROM users; -- blank string → NULL-- IS NULL / IS NOT NULLSELECT*FROM orders WHERE completed_at ISNULL;
-- NVL (Oracle) / IFNULL (MySQL) — 2-arg COALESCESELECT IFNULL(phone, 'N/A') FROM users; -- MySQLSELECT NVL(phone, 'N/A') FROM users; -- Oracle
-- IIF (SQL Server / some DBs) — inline ifSELECT IIF(salary >100000, 'High', 'Normal') FROM employees;
-- CASE in aggregateSELECTSUM(CASEWHEN status ='delivered'THEN amount ELSE0END) AS delivered_revenue,
SUM(CASEWHEN status ='cancelled'THEN amount ELSE0END) AS cancelled_revenue
FROM orders;
-- CASE as pivotSELECT
user_id,
MAX(CASEWHEN metric ='clicks'THENvalueEND) AS clicks,
MAX(CASEWHEN metric ='impressions'THENvalueEND) AS impressions,
MAX(CASEWHEN metric ='conversions'THENvalueEND) AS conversions
FROM metrics
GROUPBY user_id;
JSON Functions (PostgreSQL)
-- Access JSON fieldSELECT data->>'name'FROM users; -- text valueSELECT data->'address'->>'city'FROM users; -- nested-- Filter on JSON fieldSELECT*FROM events WHERE data->>'type'='click';
-- JSONB containsSELECT*FROM products WHERE tags @>'["sale"]';
-- Extract array elementSELECT data->'items'->0->>'sku'FROM orders; -- first item's SKU
Related
[[Basics]] — WHERE, CASE WHEN, LIKE
[[Aggregates]] — aggregate functions, GROUP BY
[[Window Functions]] — date-based partitions and frames