20+ SQL Concepts with MS SQL Server Code

Introduction

In this blog, we will explore some important SQL concepts along with SQL Server code examples for each. These concepts range from index types to common operations like creating and altering tables, writing joins, using ranking functions, and working with views and triggers.

Clustered Index

A clustered index sorts and stores the data rows in the table based on the key values. Each table can have only one clustered index.

-- Create a clustered index on the 'Id' column of the 'Employee' table
CREATE CLUSTERED INDEX IX_Employee_Id
ON Employee(Id);

Non-Clustered Index

A non-clustered index stores the index structure separately from the actual table data, creating pointers to the rows.

-- Create a non-clustered index on the 'Name' column of the 'Employee' table
CREATE NONCLUSTERED INDEX IX_Employee_Name
ON Employee(Name);

Create Table

Creating a table involves defining the columns and their data types.

-- Create an 'Employee' table
CREATE TABLE Employee (
    Id INT PRIMARY KEY,
    Name NVARCHAR(50),
    DepartmentId INT,
    HireDate DATE
);

Insert Multiple Rows

Insert multiple rows into a table in one query.

-- Insert multiple rows into the 'Employee' table
INSERT INTO Employee (Id, Name, DepartmentId, HireDate)
VALUES 
(1, 'Alice', 1, '2021-01-01'),
(2, 'Bob', 2, '2021-02-01'),
(3, 'Charlie', 1, '2021-03-01');

Alter Table

Modify an existing table by adding or modifying columns.

-- Add a new 'Salary' column to the 'Employee' table
ALTER TABLE Employee
ADD Salary DECIMAL(10, 2);

Update Row

Updating the data of a row in a table.

-- Update the salary of the employee with Id 1
UPDATE Employee
SET Salary = 70000
WHERE Id = 1;

Rename Table

Renaming an existing table.

-- Rename 'Employee' table to 'Staff'
EXEC sp_rename 'Employee', 'Staff';

Delete Rows

Delete specific rows from a table based on a condition.

-- Delete an employee with Id 2
DELETE FROM Employee
WHERE Id = 2;

Drop Table

Delete the entire table and all of its data.

-- Drop the 'Employee' table
DROP TABLE Employee;

Truncate Table

Remove all rows from a table without logging each row deletion.

-- Truncate the 'Employee' table
TRUNCATE TABLE Employee;

Cursor

A cursor is used to retrieve rows from a result set one at a time.

DECLARE @EmployeeId INT;
DECLARE employee_cursor CURSOR FOR 
SELECT Id FROM Employee;

OPEN employee_cursor;
FETCH NEXT FROM employee_cursor INTO @EmployeeId;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Do something with each row
    PRINT @EmployeeId;
    FETCH NEXT FROM employee_cursor INTO @EmployeeId;
END;

CLOSE employee_cursor;
DEALLOCATE employee_cursor;

View

A view is a virtual table based on a query.

-- Create a view to show employee names and hire dates
CREATE VIEW EmployeeView AS
SELECT Name, HireDate
FROM Employee
WHERE HireDate > '2021-01-01';

Trigger

A trigger is a special kind of stored procedure that automatically runs when an event occurs in the database.

-- Create a trigger that prints a message after inserting into the Employee table
CREATE TRIGGER trg_AfterInsertEmployee
ON Employee
AFTER INSERT
AS
BEGIN
    PRINT 'New employee inserted!';
END;

WITH CTE (Common Table Expression)

CTEs are used to create a temporary result set that can be referenced in a SELECT, INSERT, UPDATE, or DELETE statement.

WITH EmployeeCTE AS (
    SELECT Name, Salary
    FROM Employee
    WHERE Salary > 60000
)
SELECT * 
FROM EmployeeCTE;

Inner Join

An inner join returns rows when there is at least one match in both tables.

-- Inner join between Employee and Department
SELECT e.Name, d.DepartmentName
FROM Employee e
INNER JOIN Department d
ON e.DepartmentId = d.Id;

Left Join

A left join returns all rows from the left table and the matched rows from the right table. Unmatched rows will return NULL for columns from the right table.

-- Left join between Employee and Department
SELECT e.Name, d.DepartmentName
FROM Employee e
LEFT JOIN Department d
ON e.DepartmentId = d.Id;

Right Join

A right join returns all rows from the right table and the matched rows from the left table. Unmatched rows will return NULL for columns from the left table.

-- Right join between Employee and Department
SELECT e.Name, d.DepartmentName
FROM Employee e
RIGHT JOIN Department d
ON e.DepartmentId = d.Id;

Self Join

A self-join is a regular join but joins the table with itself.

-- Self join on Employee table to find employees and their managers
SELECT e1.Name AS Employee, e2.Name AS Manager
FROM Employee e1
LEFT JOIN Employee e2
ON e1.ManagerId = e2.Id;

Cross Join

A cross join returns the Cartesian product of two tables, meaning every row in the left table is combined with every row in the right table.

-- Cross join between Employee and Department
SELECT e.Name, d.DepartmentName
FROM Employee e
CROSS JOIN Department d;

Cross Apply

Cross Apply works like an inner join but is used to join a table with a table-valued function.

-- Cross apply example
SELECT e.Name, sub.TopDepartment
FROM Employee e
CROSS APPLY (
    SELECT TOP 1 d.DepartmentName AS TopDepartment 
    FROM Department d 
    WHERE d.Id = e.DepartmentId
) sub;

ROW_NUMBER()

The ROW_NUMBER() function assigns a unique sequential integer to rows within a partition of a result set.

-- Assign row numbers to employees based on salary
SELECT 
    Name, 
    Salary, 
    ROW_NUMBER() OVER (ORDER BY Salary DESC) AS RowNumber
FROM 
    Employee;

RANK()

The RANK() function assigns a rank to each row within a partition, with gaps in rank when there are ties.

-- Assign ranks to employees based on salary
SELECT Name,
       Salary,
       RANK() OVER (ORDER BY Salary DESC) AS Rank
FROM Employee;

DENSE_RANK()

The DENSE_RANK() function assigns ranks to rows without gaps between ranks when there are ties.

-- Assign dense ranks to employees based on salary
SELECT 
    Name, 
    Salary, 
    DENSE_RANK() OVER (ORDER BY Salary DESC) AS DenseRank
FROM 
    Employee;

This concludes our overview of some essential SQL concepts and SQL Server code examples. These queries and operations form the foundation of working with relational databases, making them crucial for both beginners and advanced users alike.