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.