← Back to Index

SQL Server (MSSQL)

0. Connection & Basics

0.1 Client Connect

Connecting to SQL Server using sqlcmd.

# Connect using Windows Authentication
sqlcmd -S localhost -E

# Connect with SQL Authentication
sqlcmd -S 127.0.0.1 -U sa -P 'StrongPassword123' -d master
TERMINAL OUTPUT
1>

0.2 CLI Meta-commands

Internal sqlcmd and batch commands.

SELECT @@VERSION;
GO                  -- Execute the current batch
:r filename.sql     -- Include and execute external file
QUIT                -- Exit sqlcmd
!! dir              -- Execute shell command
TERMINAL OUTPUT
Microsoft SQL Server 2022 (RTM)...

0.3 Comments

Annotating SQL code.

-- Single-line comment
/* Multi-line
   comment block */
SELECT 1; -- Trailing comment
TERMINAL OUTPUT
-----------
          1

1. Data Types

1.1 Numerics

Integer and exact decimal types.

SELECT 
    CAST(255 AS TINYINT) AS t_int,    -- 1 byte (0-255)
    CAST(2147483647 AS INT) AS i_int, -- 4 bytes
    CAST(9.22E18 AS BIGINT) AS b_int, -- 8 bytes
    123.45 AS d_decimal,              -- DECIMAL(5,2)
    $12.34 AS m_money;                -- 8-byte currency
TERMINAL OUTPUT
t_int | i_int      | b_int               | d_decimal | m_money
------+------------+---------------------+-----------+--------
255   | 2147483647 | 9223372036854775807 | 123.45    | 12.34  

1.2 Strings & Binaries

Handling characters and raw bytes.

SELECT 
    CAST('fixed' AS CHAR(5)),         -- Non-Unicode fixed
    CAST('var' AS VARCHAR(10)),       -- Non-Unicode variable
    N'Unicode' AS n_text,             -- Unicode (UCS-2/UTF-16)
    0xDEADBEEF AS b_bytes;            -- VARBINARY
TERMINAL OUTPUT
(Column1) | (Column2) | n_text  | b_bytes   
----------+-----------+---------+-----------
fixed     | var       | Unicode | 0xDEADBEEF

1.3 Date & Time

Modern temporal types.

SELECT 
    GETDATE() AS dt,                  -- Legacy DATETIME
    SYSDATETIMEOFFSET() AS dto,       -- DATETIMEOFFSET (with TZ)
    CAST(GETDATE() AS DATE) AS d,     -- Date only
    DATEADD(day, 1, GETDATE()) AS tmw;-- Date math
TERMINAL OUTPUT
dt                      | dto                           | d          | tmw
------------------------+-------------------------------+------------+-----------------------
2024-05-16 10:00:00.000 | 2024-05-16 10:00:00.000 +00:00| 2024-05-16 | 2024-05-17 10:00:00.000

1.4 Booleans & Enums

Logic and sets.

SELECT 
    CAST(1 AS BIT) AS is_true,        -- 0, 1, or NULL
    CASE WHEN 1=1 THEN 'Y' ELSE 'N' END AS flag; -- No ENUM type
TERMINAL OUTPUT
is_true | flag
--------+-----
1       | Y   

2. Basic Querying (DQL)

2.1 SELECT & Aliases

Projection and naming.

SELECT 
    FirstName + ' ' + LastName AS FullName,
    Total / 1024.0 AS SizeMB
FROM Users;
TERMINAL OUTPUT
FullName      | SizeMB
--------------+--------
Admin User    | 0.45   

2.2 WHERE Filtering

Conditions and patterns.

SELECT * FROM Nodes
WHERE IPAddress LIKE '192.168.%'
  AND Status IN (1, 2)
  AND LastSeen > DATEADD(hour, -1, GETDATE());
TERMINAL OUTPUT
(Filtered nodes)

2.3 ORDER BY

Sorting.

SELECT Name, Priority FROM Queue
ORDER BY Priority DESC, CreatedAt ASC;
TERMINAL OUTPUT
(Sorted queue)

2.4 TOP / OFFSET-FETCH

Pagination.

-- Take top 5
SELECT TOP 5 * FROM Logs ORDER BY Id DESC;

-- Paginate: Skip 10, take 5 (SQL 2012+)
SELECT * FROM Logs 
ORDER BY Id 
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;
TERMINAL OUTPUT
(5 rows)

3. Joins & Set Operations

3.1 Inner & Outer Joins

Merging tables.

SELECT u.UserName, r.RoleName
FROM Users u
INNER JOIN UserRoles ur ON u.Id = ur.UserId
LEFT JOIN Roles r ON ur.RoleId = r.Id;
TERMINAL OUTPUT
(User roles)

3.2 Cross & Self Joins

Cartesian products and specialized applies.

-- Cross Apply (Join to table-valued function or subquery)
SELECT u.Name, p.Item
FROM Users u
CROSS APPLY (SELECT TOP 1 Item FROM Orders WHERE UserId = u.Id) p;
TERMINAL OUTPUT
(Users with their latest item)

3.3 UNION, INTERSECT, EXCEPT

Set operations.

SELECT Email FROM Leads
UNION -- Removes duplicates
SELECT Email FROM Customers
EXCEPT
SELECT Email FROM OptOut;
TERMINAL OUTPUT
(Distinct active emails)

3.4 JOIN with Subqueries

Derived tables.

SELECT t.Name, s.Total
FROM Teams t
JOIN (SELECT TeamId, SUM(Points) AS Total FROM Stats GROUP BY TeamId) s
  ON t.Id = s.TeamId;
TERMINAL OUTPUT
(Teams with aggregate points)

4. Aggregation & Grouping

4.1 GROUP BY

Bucket summarization.

SELECT Category, COUNT(*) AS Qty
FROM Inventory
GROUP BY Category;
TERMINAL OUTPUT
Category | Qty
---------+----
Service  | 15 
Asset    | 124

4.2 HAVING

Aggregate filtering.

SELECT UserId, COUNT(*)
FROM Logins
GROUP BY UserId
HAVING COUNT(*) > 100;
TERMINAL OUTPUT
(High-frequency users)

4.3 Aggregate Functions

Common reductions.

SELECT 
    COUNT(DISTINCT ClientIP) AS UniqueIPs,
    STRING_AGG(Tags, ';') AS AllTags -- SQL 2017+
FROM Connections;
TERMINAL OUTPUT
UniqueIPs | AllTags
----------+-------------
42        | app;db;web

5. Advanced Querying

5.1 Subqueries (IN, EXISTS)

Nested query logic.

SELECT Name FROM Products p
WHERE EXISTS (SELECT 1 FROM Sales s WHERE s.ProductId = p.Id);
TERMINAL OUTPUT
(Products with sales)

5.2 Common Table Expressions (WITH)

Readable subqueries.

WITH MonthlySales AS (
    SELECT Month, SUM(Amount) AS Total FROM Sales GROUP BY Month
)
SELECT * FROM MonthlySales WHERE Total > 5000;
TERMINAL OUTPUT
(Successful months)

5.3 Recursive CTEs

Graph traversal.

WITH OrgChart AS (
    SELECT Id, Name, ManagerId FROM Emp WHERE Id = 1
    UNION ALL
    SELECT e.Id, e.Name, e.ManagerId 
    FROM Emp e JOIN OrgChart o ON e.ManagerId = o.Id
)
SELECT * FROM OrgChart;
TERMINAL OUTPUT
(Employee hierarchy)

6. Window Functions

6.1 OVER & PARTITION BY

Windowing.

SELECT 
    Name, 
    Category,
    Salary,
    AVG(Salary) OVER(PARTITION BY Category) AS CatAvg
FROM Employees;
TERMINAL OUTPUT
(Employees with category average)

6.2 Ranking

Positioning.

SELECT 
    Name, 
    ROW_NUMBER() OVER(ORDER BY Score DESC) AS Pos
FROM Players;
TERMINAL OUTPUT
(Leaderboard positions)

6.3 Analytics

Positional access.

SELECT 
    Val,
    LAG(Val) OVER(ORDER BY Time) AS PrevVal
FROM Telemetry;
TERMINAL OUTPUT
(Telemetry with previous values)

7. Data Modification (DML)

7.1 INSERT

Adding records.

INSERT INTO Settings (Key, Value)
OUTPUT Inserted.Id -- Get generated ID back
VALUES ('Timeout', '30');
TERMINAL OUTPUT
Id
--
42

7.2 UPDATE & DELETE

Modification.

UPDATE p SET p.Price = p.Price * 1.1
FROM Products p
JOIN Categories c ON p.CatId = c.Id
WHERE c.Name = 'Premium';

DELETE FROM Logs WHERE Timestamp < DATEADD(day, -30, GETDATE());
TERMINAL OUTPUT
(Rows affected)

7.3 Upsert (MERGE)

Atomic insert-or-update.

MERGE TargetTable AS T
USING SourceTable AS S ON T.Id = S.Id
WHEN MATCHED THEN 
    UPDATE SET T.Val = S.Val
WHEN NOT MATCHED THEN 
    INSERT (Id, Val) VALUES (S.Id, S.Val);
TERMINAL OUTPUT
(MERGE result)

8. Schema Definition (DDL)

8.1 CREATE & ALTER Table

Structure management.

CREATE TABLE Devices (
    Id INT IDENTITY(1,1) PRIMARY KEY, -- Auto-increment
    UUID UNIQUEIDENTIFIER DEFAULT NEWID(),
    Payload NVARCHAR(MAX) -- Large text
);

ALTER TABLE Devices ADD Status TINYINT DEFAULT 0;
TERMINAL OUTPUT
Commands completed successfully.

8.2 Constraints

Integrity logic.

CREATE TABLE Sensors (
    Id INT PRIMARY KEY,
    Value FLOAT CHECK (Value >= 0),
    DeviceId INT FOREIGN KEY REFERENCES Devices(Id) ON DELETE CASCADE
);
TERMINAL OUTPUT
Commands completed successfully.

8.3 Indexes & Performance

Search optimization.

CREATE INDEX IX_Device_Status ON Devices(Status);
-- Show execution plan
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM Devices WHERE Status = 1;
GO
SET SHOWPLAN_TEXT OFF;
TERMINAL OUTPUT
  |--Index Seek(OBJECT:([IX_Device_Status]), SEEK:([Status]=(1))...

8.4 Views

Stored queries.

CREATE VIEW ActiveDevices AS 
SELECT * FROM Devices WHERE Status = 1;
TERMINAL OUTPUT
Commands completed successfully.

9. Logic & Administration

9.1 Transactions (ACID)

Atomic control.

BEGIN TRANSACTION;
UPDATE Accounts SET Bal -= 100 WHERE Id = 1;
UPDATE Accounts SET Bal += 100 WHERE Id = 2;
IF @@ERROR <> 0 ROLLBACK ELSE COMMIT;
TERMINAL OUTPUT
(Transaction status)

9.2 Triggers & Functions

Server-side logic.

CREATE PROCEDURE GetDeviceStatus @Id INT
AS
BEGIN
    SELECT Status FROM Devices WHERE Id = @Id;
END;
GO
EXEC GetDeviceStatus @Id = 5;
TERMINAL OUTPUT
Status
------
1

9.3 Explain Plan

Resource analysis.

SET STATISTICS IO ON;
SET STATISTICS TIME ON;
GO
SELECT COUNT(*) FROM LargeTable;
GO
SET STATISTICS IO OFF;
TERMINAL OUTPUT
Table 'LargeTable'. Scan count 1, logical reads 4520...
CPU time = 15 ms,  elapsed time = 14 ms.

9.4 Roles, Permissions & Schemas

Access control.

CREATE SCHEMA archive;
CREATE USER AppUser FOR LOGIN AppLogin;
GRANT SELECT ON SCHEMA::dbo TO AppUser;
TERMINAL OUTPUT
Commands completed successfully.