FROM
SELECT *
FROM employees;
JOIN (and ON)
SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
WHERE
SELECT name, salary
FROM employees
WHERE salary > 50000;
GROUP BY
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id;
ROLLUP, CUBE, GROUPING SETS
// ROLLUP: Adds subtotal rows.
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY ROLLUP(department_id, job_id);
// CUBE: Adds subtotal rows for all combinations.
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY CUBE(department_id, job_id);
// GROUPING SETS: Allows custom grouping combinations.
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY GROUPING SETS ((department_id), (job_id), ());
HAVING
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 60000;
OVER (e.g., Window Functions)
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;
SELECT DISTINCT
SELECT DISTINCT job_id
FROM employees;
UNION, INTERSECT, EXCEPT
// UNION
SELECT name FROM employees
UNION
SELECT name FROM contractors;
// INTERSECT
SELECT name FROM employees
INTERSECT
SELECT name FROM contractors;
// EXCEPT
SELECT name FROM employees
EXCEPT
SELECT name FROM contractors;
ORDER BY
SELECT name, salary
FROM employees
ORDER BY salary DESC;
OFFSET, FETCH FIRST/NEXT ROWS ONLY
SELECT name, salary
FROM employees
ORDER BY salary DESC
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;
LIMIT, TOP
// LIMIT
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
// TOP
SELECT TOP 5 name, salary
FROM employees
ORDER BY salary DESC;