SQL Query Helper

An interactive quick-reference for common SQL query patterns. Search, browse, and copy snippets instantly.

Web Tool Version 1.0 Updated 2026-02-26

Quick Reference

Type in the box below to filter snippets, or browse by category.

SELECT Basics

Select with filtering & sorting
SELECT col1, col2
FROM   Employees
WHERE  Department = 'Engineering'
  AND  Salary > 80000
ORDER BY col1 DESC;
Distinct values
SELECT DISTINCT Department
FROM   Employees;
Top N rows (SQL Server) / LIMIT (MySQL/Postgres)
-- SQL Server
SELECT TOP 10 * FROM Orders ORDER BY OrderDate DESC;
--
-- MySQL / PostgreSQL
SELECT * FROM Orders ORDER BY OrderDate DESC LIMIT 10;

GROUP BY & Aggregates

Group with HAVING filter
SELECT   Department, COUNT(*) AS HeadCount, AVG(Salary) AS AvgSalary
FROM     Employees
GROUP BY Department
HAVING   COUNT(*) > 5
ORDER BY AvgSalary DESC;
Common aggregate functions
SELECT COUNT(*),          -- row count
       COUNT(DISTINCT col), -- unique values
       SUM(Amount),         -- total
       AVG(Amount),         -- average
       MIN(Amount),         -- smallest
       MAX(Amount)          -- largest
FROM   Orders;

JOIN Patterns

INNER JOIN — matching rows only
SELECT o.OrderId, c.CustomerName
FROM   Orders o
INNER JOIN Customers c ON o.CustomerId = c.Id;
LEFT JOIN — all left + matching right
SELECT e.Name, d.DepartmentName
FROM   Employees e
LEFT JOIN Departments d ON e.DeptId = d.Id;
FULL OUTER JOIN — all rows from both tables
SELECT a.Name, b.Name
FROM   TableA a
FULL OUTER JOIN TableB b ON a.Id = b.AId;
CROSS JOIN — cartesian product
SELECT s.Size, c.Color
FROM   Sizes s
CROSS JOIN Colors c;
Self JOIN — table joined to itself
SELECT e.Name AS Employee, m.Name AS Manager
FROM   Employees e
LEFT JOIN Employees m ON e.ManagerId = m.Id;

Subqueries & CTEs

Subquery in WHERE
SELECT Name, Salary
FROM   Employees
WHERE  Salary > (SELECT AVG(Salary) FROM Employees);
EXISTS check
SELECT c.CustomerName
FROM   Customers c
WHERE  EXISTS (
  SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id
);
CTE (Common Table Expression)
WITH TopSellers AS (
  SELECT SellerId, SUM(Amount) AS Total
  FROM   Sales
  GROUP BY SellerId
  HAVING SUM(Amount) > 100000
)
SELECT e.Name, ts.Total
FROM   TopSellers ts
INNER JOIN Employees e ON ts.SellerId = e.Id;

Window Functions

ROW_NUMBER — unique row counter per partition
SELECT Name, Department, Salary,
       ROW_NUMBER() OVER (
         PARTITION BY Department ORDER BY Salary DESC
       ) AS RowNum
FROM   Employees;
RANK vs DENSE_RANK
SELECT Name, Score,
       RANK()       OVER (ORDER BY Score DESC) AS Rnk,      -- gaps after ties
       DENSE_RANK() OVER (ORDER BY Score DESC) AS DenseRnk  -- no gaps
FROM   Students;
LEAD / LAG — peek at next or previous row
SELECT OrderDate, Amount,
       LAG(Amount, 1)  OVER (ORDER BY OrderDate) AS PrevAmount,
       LEAD(Amount, 1) OVER (ORDER BY OrderDate) AS NextAmount
FROM   Orders;

INSERT / UPDATE / DELETE

INSERT — single & multi-row
-- Single row
INSERT INTO Employees (Name, Department, Salary)
VALUES ('Alice', 'Engineering', 95000);
--
-- Multiple rows
INSERT INTO Employees (Name, Department, Salary)
VALUES ('Bob', 'Marketing', 72000),
       ('Carol', 'Sales', 68000);
UPDATE with JOIN (SQL Server)
UPDATE e
SET    e.DeptName = d.Name
FROM   Employees e
INNER JOIN Departments d ON e.DeptId = d.Id
WHERE  d.IsActive = 1;
DELETE with subquery guard
DELETE FROM Logs
WHERE  CreatedAt < DATEADD(MONTH, -6, GETDATE())
  AND  Id NOT IN (SELECT LogId FROM AuditTrail);

Indexes & Performance

Create a nonclustered index with INCLUDE
CREATE NONCLUSTERED INDEX IX_Employees_Dept
ON Employees (Department)
INCLUDE (Name, Salary);
Check existing indexes on a table
SELECT i.name AS IndexName, i.type_desc,
       COL_NAME(ic.object_id, ic.column_id) AS ColumnName
FROM   sys.indexes i
INNER JOIN sys.index_columns ic
  ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE  i.object_id = OBJECT_ID('Employees');

Stored Procedures

Basic stored procedure with TRY/CATCH
CREATE PROCEDURE usp_GetEmployeesByDept
  @DeptName NVARCHAR(100),
  @MinSalary DECIMAL(10,2) = 0
AS
BEGIN
  SET NOCOUNT ON;
  BEGIN TRY
    SELECT Name, Salary
    FROM   Employees
    WHERE  Department = @DeptName
      AND  Salary >= @MinSalary
    ORDER BY Salary DESC;
  END TRY
  BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMsg;
  END CATCH
END;