Query Tips hữu ích
Tránh Division by Zero
SELECT visitors_today / NULLIF(visitors_yesterday, 0) FROM stats;
-- NULLIF trả về NULL nếu visitors_yesterday = 0 → kết quả NULL thay vì errorGap-filling cho Statistical Queries
Chuỗi ngày có ngày không có data → tạo chuỗi ngày liên tục rồi LEFT JOIN:
-- PostgreSQL:
SELECT dates.day, COALESCE(SUM(stats.count), 0)
FROM generate_series(
CURRENT_DATE - INTERVAL '14 days', CURRENT_DATE, '1 day'
) AS dates(day)
LEFT JOIN statistics stats ON stats.day = dates.day
GROUP BY dates.day;Multiple Aggregates trong một query
-- PostgreSQL:
SELECT
COUNT(*) FILTER (WHERE released_at = 2024) AS released_2024,
COUNT(*) FILTER (WHERE director = 'Nolan') AS nolan_movies
FROM movies;
-- MySQL (SUM trên biểu thức boolean):
SELECT
SUM(released_at = 2024) AS released_2024,
SUM(director = 'Nolan') AS nolan_movies
FROM movies;Fast Row Count Estimate
Không cần COUNT(*) chính xác? Dùng EXPLAIN:
-- PostgreSQL: EXPLAIN SELECT * FROM movies WHERE rating = 'R';
-- Đọc "rows" estimate từ output - tức thì thay vì scanDISTINCT ON (chỉ PostgreSQL)
-- Lấy đơn hàng đắt nhất của mỗi customer trong 2024
SELECT DISTINCT ON (customer_id) *
FROM orders
WHERE EXTRACT(YEAR FROM created_at) = 2024
ORDER BY customer_id ASC, price DESC;Liên quan
- Kỹ thuật thao tác dữ liệu hiệu quả - các kỹ thuật ghi
- Lateral Join - giải pháp tổng quát hơn cho “1 row per group”
- NULL và Index - hiểu NULL để dùng NULLIF/COALESCE đúng