Commands
3 min
SQL Queries for Testing
Essential SQL queries for test data validation
...
sqldatabasetestingdata-validation
Essential SQL Queries for Testing
1. Data Validation Queries
-- Count records matching criteria
SELECT COUNT(*) FROM users
WHERE status = 'active' AND created_date >= '2024-01-01';
-- Verify data exists
SELECT * FROM orders
WHERE order_id = 'ORD-12345' AND status = 'completed';
-- Check for duplicates
SELECT email, COUNT(*) as count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;2. Test Data Setup
-- Insert test user
INSERT INTO users (username, email, status, created_date)
VALUES ('testuser', 'test@example.com', 'active', NOW());
-- Bulk insert test data
INSERT INTO orders (user_id, product_id, amount, status)
VALUES
(1, 101, 99.99, 'pending'),
(1, 102, 149.99, 'completed'),
(2, 101, 99.99, 'pending');
-- Create test data from existing
INSERT INTO test_users SELECT * FROM users WHERE id <= 10;3. Test Data Cleanup
-- Delete test data by pattern
DELETE FROM users WHERE email LIKE '%test.com';
-- Delete by date range
DELETE FROM orders
WHERE created_date < NOW() - INTERVAL 30 DAY
AND status = 'test';
-- Clear test table
TRUNCATE TABLE test_orders;4. Verification Queries
-- Verify foreign key relationships
SELECT o.order_id, o.user_id, u.username
FROM orders o
LEFT JOIN users u ON o.user_id = u.id
WHERE u.id IS NULL;
-- Check data integrity
SELECT * FROM payments
WHERE amount < 0 OR amount IS NULL;
-- Validate status transitions
SELECT order_id, status, previous_status, updated_date
FROM order_audit
WHERE (previous_status = 'completed' AND status = 'pending')
ORDER BY updated_date DESC;5. Performance Testing Queries
-- Find slow queries (with indexes)
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 123 AND status = 'pending';
-- Count records by status
SELECT status, COUNT(*) as count
FROM orders
GROUP BY status
ORDER BY count DESC;
-- Get sample data
SELECT * FROM products
ORDER BY RANDOM()
LIMIT 10;Quick Reference
Common Patterns
-- Safe update with WHERE clause
UPDATE users SET status = 'inactive'
WHERE last_login < NOW() - INTERVAL 90 DAY
AND status = 'active';
-- Conditional insert (if not exists)
INSERT INTO users (email, username)
SELECT 'new@test.com', 'newuser'
WHERE NOT EXISTS (
SELECT 1 FROM users WHERE email = 'new@test.com'
);
-- Get recent records
SELECT * FROM error_logs
WHERE created_date >= NOW() - INTERVAL 1 HOUR
ORDER BY created_date DESC
LIMIT 100;Testing Best Practices
- Always use WHERE clause in UPDATE/DELETE
- Use transactions for multi-step test data setup
- Verify before and after running data modifications
- Use separate test database for destructive operations
- Clean up test data after each test run
Key Takeaways
- Start with SELECT to verify before UPDATE/DELETE
- Use COUNT(*) to validate expected results
- Leverage transactions for atomic test data setup
- Always include WHERE clauses to avoid accidents
- Keep test queries simple and readable
Comments (0)
Loading comments...