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ì error

Gap-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ì scan

DISTINCT 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