<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thushitha </title>
    <description>The latest articles on DEV Community by Thushitha  (@thushitha_tk_ffd2acfb6067).</description>
    <link>https://dev.to/thushitha_tk_ffd2acfb6067</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3448110%2Ff1710950-a086-48fe-b4e5-0df5be25bb4c.png</url>
      <title>DEV Community: Thushitha </title>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thushitha_tk_ffd2acfb6067"/>
    <language>en</language>
    <item>
      <title>MongoDB in Action: Building a Smart Student Database with CRUD Operations</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Sun, 05 Oct 2025 14:18:46 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/mongodb-in-action-building-a-smart-student-database-with-crud-operations-2n9j</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/mongodb-in-action-building-a-smart-student-database-with-crud-operations-2n9j</guid>
      <description>&lt;p&gt;MongoDB is a leading NoSQL database widely used for cloud-native and scalable applications. Unlike relational databases with rigid schemas, it stores data in flexible JSON-like documents, making it easy to model real-world entities such as students in a college database.&lt;/p&gt;

&lt;p&gt;At its core, MongoDB supports CRUD operations — Create, Read, Update, and Delete — to add, retrieve, modify, and remove data.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll perform CRUD operations on a student database schema by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inserting multiple student records&lt;/li&gt;
&lt;li&gt;Querying and filtering data&lt;/li&gt;
&lt;li&gt;Updating details like CGPA and year&lt;/li&gt;
&lt;li&gt;Deleting records with conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll use MongoDB Atlas, the cloud-hosted service, for hands-on practice. By the end, you’ll have practical experience managing data in MongoDB — an essential skill for modern development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧱 Schema – Collection: students&lt;/strong&gt;&lt;br&gt;
Each student record (document) follows this structure:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "student_id": "ST001",&lt;br&gt;
  "name": "Aarav",&lt;br&gt;
  "age": 20,&lt;br&gt;
  "department": "AI &amp;amp; DS",&lt;br&gt;
  "year": 2,&lt;br&gt;
  "cgpa": 8.9&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ 1️⃣ CREATE (INSERT)&lt;/strong&gt;&lt;br&gt;
In MongoDB Atlas → Collections → Insert Document&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
    "student_id": "ST001",&lt;br&gt;
    "name": "Aarav",&lt;br&gt;
    "age": 20,&lt;br&gt;
    "department": "AI &amp;amp; DS",&lt;br&gt;
    "year": 2,&lt;br&gt;
    "cgpa": 8.9&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "ST002",&lt;br&gt;
    "name": "Diya",&lt;br&gt;
    "age": 19,&lt;br&gt;
    "department": "CSE",&lt;br&gt;
    "year": 1,&lt;br&gt;
    "cgpa": 9.2&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "ST003",&lt;br&gt;
    "name": "Rahul",&lt;br&gt;
    "age": 21,&lt;br&gt;
    "department": "ECE",&lt;br&gt;
    "year": 3,&lt;br&gt;
    "cgpa": 7.8&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "ST004",&lt;br&gt;
    "name": "Meera",&lt;br&gt;
    "age": 20,&lt;br&gt;
    "department": "IT",&lt;br&gt;
    "year": 2,&lt;br&gt;
    "cgpa": 9.5&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "ST005",&lt;br&gt;
    "name": "Vikram",&lt;br&gt;
    "age": 22,&lt;br&gt;
    "department": "MECH",&lt;br&gt;
    "year": 3,&lt;br&gt;
    "cgpa": 6.9&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyfi9frbw5cyyxrkfkug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyfi9frbw5cyyxrkfkug.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcv65y4enfqou1kwm1sh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcv65y4enfqou1kwm1sh.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexem0yzivgmfybnoclbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexem0yzivgmfybnoclbl.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Result in Atlas:&lt;/strong&gt;&lt;br&gt;
Inserted 5 documents successfully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔍 2️⃣ READ (QUERY)&lt;/strong&gt;&lt;br&gt;
Run the following queries &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(a) Display all student records&lt;/strong&gt;&lt;br&gt;
find()&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(b) Find all students with CGPA &amp;gt; 8&lt;/strong&gt;&lt;br&gt;
({ cgpa: { $gt: 8 } })&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(c) Find students belonging to Computer Science departments&lt;/strong&gt;&lt;br&gt;
({ department: { $in: ["CSE", "AI &amp;amp; DS"] } })&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhqvef0e0zs2904x2eqg8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhqvef0e0zs2904x2eqg8.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📊 This helps identify top performers or department-based groups easily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✏️ 3️⃣ UPDATE (MODIFY RECORDS)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(a) Update CGPA of a specific student&lt;/strong&gt;&lt;br&gt;
  { student_id: "ST002" },&lt;br&gt;
  { $set: { cgpa: 9.6 } }&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4upvi3vrzrqlq46fkm0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4upvi3vrzrqlq46fkm0.png" alt=" " width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Matched 1 document, modified 1 document.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(b) Increase the year of study for all 3rd-year students by 1&lt;/strong&gt;&lt;br&gt;
  { year: 3 },&lt;br&gt;
  { $inc: { year: 1 } }&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdnbz7qzeqz7dwarvezw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdnbz7qzeqz7dwarvezw.png" alt=" " width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 $inc automatically increments numerical fields — perfect for promotions or increments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🗑️ 4️⃣ DELETE (REMOVE RECORDS)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(a) Delete one student by ID&lt;/strong&gt;&lt;br&gt;
({ student_id: "ST005" })&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8no6nh4jyee5ro4yp3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8no6nh4jyee5ro4yp3o.png" alt=" " width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfl9u2depjzdq4myikr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfl9u2depjzdq4myikr0.png" alt=" " width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(b) Delete all students with CGPA &amp;lt; 7.5&lt;/strong&gt;&lt;br&gt;
({ cgpa: { $lt: 7.5 } })&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprh4rt3g4g1pt3m8xmpj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprh4rt3g4g1pt3m8xmpj.png" alt=" " width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc2ijw7raifbh3j7r3xu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc2ijw7raifbh3j7r3xu.png" alt=" " width="800" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧹 Removes low-performing or outdated records, keeping your data clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎓 Learning Outcomes&lt;/strong&gt;&lt;br&gt;
By performing these CRUD operations, you’ll learn to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work with MongoDB Atlas Cloud Interface&lt;/li&gt;
&lt;li&gt;Write and execute basic MongoDB queries&lt;/li&gt;
&lt;li&gt;Update and delete data safely&lt;/li&gt;
&lt;li&gt;Export and visualize your collections&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>tutorial</category>
      <category>mongodb</category>
      <category>beginners</category>
    </item>
    <item>
      <title>🏦 Database Magic: Automating Tasks with Cursor and Trigger ✨</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Sun, 05 Oct 2025 08:12:26 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/database-magic-automating-tasks-with-cursor-and-trigger-f8m</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/database-magic-automating-tasks-with-cursor-and-trigger-f8m</guid>
      <description>&lt;p&gt;Working with databases isn’t just about storing data — it’s about automating how that data behaves.&lt;br&gt;
In this blog, we’ll explore two key SQL features:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Cursor&lt;/strong&gt; – to process query results row by row&lt;br&gt;
&lt;strong&gt;⚙️ Trigger&lt;/strong&gt; – to automatically perform actions after data changes&lt;/p&gt;

&lt;p&gt;Let’s dive in! 🔍&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💼 Part 1: Cursor – Display Employees with Salary &amp;gt; 50,000&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A cursor helps you loop through query results one row at a time, perfect for selective data processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 Step 1: Create Employee Table &amp;amp; Insert Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Employee (&lt;br&gt;
    EmployeeID INT PRIMARY KEY,&lt;br&gt;
    EmployeeName VARCHAR(50),&lt;br&gt;
    Salary DECIMAL(10,2)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;INSERT INTO Employee VALUES (1, 'Sophia', 72000.00);&lt;br&gt;
INSERT INTO Employee VALUES (2, 'Ryan', 48000.00);&lt;br&gt;
INSERT INTO Employee VALUES (3, 'Olivia', 83000.00);&lt;br&gt;
INSERT INTO Employee VALUES (4, 'Liam', 39000.00);&lt;br&gt;
INSERT INTO Employee VALUES (5, 'Emma', 65000.00);&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr63yfzdqmxkfzy4slj01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr63yfzdqmxkfzy4slj01.png" alt=" " width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpo66dj645ob0dx6kcdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpo66dj645ob0dx6kcdi.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ This creates an Employee table and fills it with some data.&lt;br&gt;
Notice that some employees have salaries above 50,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ Step 2: Declare and Process the Cursor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ll use a cursor to fetch and display names of employees whose salary is greater than 50,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DELIMITER $$&lt;/p&gt;

&lt;p&gt;CREATE PROCEDURE DisplayHighSalaryEmployees()&lt;br&gt;
BEGIN&lt;br&gt;
    DECLARE done INT DEFAULT 0;&lt;br&gt;
    DECLARE empName VARCHAR(50);&lt;br&gt;
    DECLARE emp_cursor CURSOR FOR &lt;br&gt;
        SELECT EmployeeName FROM Employee WHERE Salary &amp;gt; 50000;&lt;br&gt;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;&lt;br&gt;
    OPEN emp_cursor;&lt;br&gt;
    read_loop: LOOP&lt;br&gt;
        FETCH emp_cursor INTO empName;&lt;br&gt;
        IF done THEN&lt;br&gt;
            LEAVE read_loop;&lt;br&gt;
        END IF;&lt;br&gt;
        SELECT CONCAT('Employee: ', empName) AS Employee_Name;&lt;br&gt;
    END LOOP;&lt;br&gt;
    CLOSE emp_cursor;&lt;br&gt;
END $$&lt;/p&gt;

&lt;p&gt;DELIMITER ;&lt;/p&gt;

&lt;p&gt;CALL DisplayHighSalaryEmployees();&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjykne168hvcc8y00x2q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjykne168hvcc8y00x2q7.png" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧾 Output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb8xy9hs7mngm28iejsj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb8xy9hs7mngm28iejsj.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✨ Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DECLARE emp_cursor defines a cursor to select employees with 
salary &amp;gt; 50,000.&lt;/li&gt;
&lt;li&gt;The handler ensures the loop stops when all rows are fetched.&lt;/li&gt;
&lt;li&gt;OPEN, FETCH, and CLOSE control the cursor’s lifecycle.
Each employee’s name is displayed using a SELECT statement.&lt;/li&gt;
&lt;li&gt;When you run the procedure, the cursor loops through all eligible records and prints employee names who earn more than ₹50,000.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⚡ 2️⃣ AFTER INSERT Trigger: Logging Student Registrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A trigger automatically executes code when a certain event occurs in the database.&lt;br&gt;
Here, we’ll create a trigger that logs every new student registration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 Step 1: Create Students and Audit Tables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
    StudentID INT PRIMARY KEY,&lt;br&gt;
    StudentName VARCHAR2(50),&lt;br&gt;
    Department VARCHAR2(50) );&lt;/p&gt;

&lt;p&gt;CREATE TABLE Student_Audit (&lt;br&gt;
    AuditID INT GENERATED ALWAYS AS IDENTITY,&lt;br&gt;
    StudentID INT,&lt;br&gt;
    Action VARCHAR2(50),&lt;br&gt;
    ActionTime TIMESTAMP );&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fac1bwwwzpea1qg2vbiwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fac1bwwwzpea1qg2vbiwo.png" alt=" " width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ Step 2: Create the AFTER INSERT Trigger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This trigger runs automatically after a new student record is inserted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DELIMITER $$&lt;/p&gt;

&lt;p&gt;CREATE TRIGGER trg_AfterStudentInsert&lt;br&gt;
AFTER INSERT ON Students&lt;br&gt;
FOR EACH ROW&lt;br&gt;
BEGIN&lt;br&gt;
    INSERT INTO Student_Audit (StudentID, Action, ActionTime)&lt;br&gt;
    VALUES (NEW.StudentID, 'Registered', NOW());&lt;br&gt;
END $$&lt;/p&gt;

&lt;p&gt;DELIMITER ;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fil7ayzob82ndpv7r7b7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fil7ayzob82ndpv7r7b7s.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ The :NEW keyword refers to the newly inserted row in the Students table.&lt;br&gt;
✅ SYSTIMESTAMP records the exact time of registration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Step 3: Test the Trigger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Students VALUES (201, 'Aarav', 'Computer Science');&lt;br&gt;
INSERT INTO Students VALUES (202, 'Priya', 'Mechanical Engineering');&lt;br&gt;
INSERT INTO Students VALUES (203, 'Karan', 'Electronics');&lt;br&gt;
SELECT * FROM Student_Audit;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtgrh2qadfs5bm7eaugs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtgrh2qadfs5bm7eaugs.png" alt=" " width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧾 Output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1eal96v2jheygvayq6bg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1eal96v2jheygvayq6bg.png" alt=" " width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursors and Triggers are powerful features that help automate and control database workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use cursors for row-level processing.&lt;/li&gt;
&lt;li&gt;Use triggers for event-based automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Experiment with these and watch your database become smarter and more interactive!&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>💾Database Reliability Explained: Transactions, Deadlocks &amp; Log-Based Recovery</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Sat, 04 Oct 2025 10:16:23 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/database-reliability-explained-transactions-deadlocks-log-based-recovery-3kle</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/database-reliability-explained-transactions-deadlocks-log-based-recovery-3kle</guid>
      <description>&lt;p&gt;Modern databases are designed to be reliable, consistent, and fault-tolerant — even during crashes or concurrent access.&lt;br&gt;
Three critical concepts that make this possible are:&lt;br&gt;
&lt;strong&gt;Transactions, Deadlocks, and Log-Based Recovery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This blog demonstrates how they work using a simple Accounts table example in SQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧱 Step 1: Create the Accounts Table&lt;/strong&gt;&lt;br&gt;
We’ll begin by creating a basic table to simulate real-world banking operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyu92fxtnubq9qsavcjff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyu92fxtnubq9qsavcjff.png" alt=" " width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To verify the data:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nnw6be89w2nieilzzxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nnw6be89w2nieilzzxd.png" alt=" " width="800" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgptirosus9na29us5zul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgptirosus9na29us5zul.png" alt=" " width="800" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This table will be used to understand how transactions and recovery work internally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 1️⃣ Transaction – Atomicity &amp;amp; Rollback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A transaction is a sequence of SQL operations executed as a single logical unit.&lt;br&gt;
It follows the ACID properties — Atomicity, Consistency, Isolation, and Durability.&lt;/p&gt;

&lt;p&gt;Let’s focus on Atomicity, which ensures that either all operations in a transaction succeed or none do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Money Transfer&lt;/strong&gt;&lt;br&gt;
Suppose Alice sends ₹500 to Bob.&lt;br&gt;
We’ll perform the transfer and then roll it back before committing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq258jnny38sme62aphw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq258jnny38sme62aphw6.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Result:&lt;/strong&gt;&lt;br&gt;
Balances remain unchanged after rollback.&lt;br&gt;
This confirms no partial update took place — a real demonstration of atomicity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Why It Matters:&lt;/strong&gt;&lt;br&gt;
If a power failure or crash occurs mid-transfer, rollback ensures that incomplete operations are undone automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 2️⃣ Deadlock Simulation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A deadlock occurs when two transactions are waiting for each other’s locked resources.&lt;br&gt;
This often happens in multi-user environments where concurrent access is common.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Analogy:&lt;/strong&gt;&lt;br&gt;
Imagine two people trying to withdraw money from two linked accounts at the same time — each holding a lock on one account and waiting for the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfaqdxdknnwkfdjrkbpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfaqdxdknnwkfdjrkbpi.png" alt=" " width="800" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1uje1vwr6niuqn33spc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1uje1vwr6niuqn33spc.png" alt=" " width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⏳ Both sessions wait indefinitely — creating a deadlock.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Databases Handle It:&lt;/strong&gt;&lt;br&gt;
Most DBMSs (like MySQL, Oracle, and PostgreSQL) use deadlock detection algorithms to automatically abort one of the conflicting transactions.&lt;br&gt;
This allows the other transaction to continue and keeps the database consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Tip to Avoid Deadlocks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access tables in a consistent order across transactions.&lt;/li&gt;
&lt;li&gt;Keep transactions short and simple.&lt;/li&gt;
&lt;li&gt;Avoid unnecessary locks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔹 3️⃣ Log-Based Recovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even with transactions and deadlock control, system failures can still occur.&lt;br&gt;
That’s where log-based recovery ensures Durability — the “D” in ACID.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What It Means:&lt;/strong&gt;&lt;br&gt;
Databases maintain transaction logs (Binary Logs in MySQL, WAL in PostgreSQL) that record every change.&lt;br&gt;
If a crash occurs, the DBMS uses these logs to redo committed transactions and undo uncommitted ones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmaw6bk5x61pqukhc0hz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmaw6bk5x61pqukhc0hz5.png" alt=" " width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxc85t2makwydz0jqhak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxc85t2makwydz0jqhak.png" alt=" " width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Result:&lt;/strong&gt;&lt;br&gt;
The rollback operation is written to the log.&lt;br&gt;
If a failure occurred, the system would automatically restore the database to the last consistent state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Insight:&lt;/strong&gt;&lt;br&gt;
Without logging, recovering from crashes or incomplete updates would be nearly impossible.&lt;br&gt;
That’s why log-based recovery is essential for mission-critical systems like banking or e-commerce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Database reliability depends on how well it handles failures, concurrency, and recovery.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transactions guarantee atomic and consistent operations.&lt;/li&gt;
&lt;li&gt;Deadlocks teach us to manage concurrency wisely.&lt;/li&gt;
&lt;li&gt;Log-Based Recovery ensures no data is lost, even after system crashes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By experimenting with these SQL commands, you gain a real understanding of how databases ensure data integrity and fault tolerance in the real world. ⚡&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>database</category>
      <category>tutorial</category>
      <category>sql</category>
    </item>
    <item>
      <title>The Backbone of Database Reliability: Exploring ACID in Action with SQL Transactions A Step-by-Step Guide</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Sat, 04 Oct 2025 08:39:26 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/understanding-acid-properties-in-sql-transactions-a-step-by-step-guide-4djj</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/understanding-acid-properties-in-sql-transactions-a-step-by-step-guide-4djj</guid>
      <description>&lt;p&gt;When working with relational databases, ACID properties ensure data is handled reliably, consistently, and safely. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACID&lt;/strong&gt; stands for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Atomicity 🧩&lt;/strong&gt; – All-or-nothing transactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency ⚖️&lt;/strong&gt; – Database rules are preserved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolation 🚧&lt;/strong&gt; – Transactions operate independently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durability 💪&lt;/strong&gt; – Committed transactions persist permanently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll use an Accounts table to demonstrate each property step by step, with SQL examples you can try yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐Step 1: Create the Accounts Table and Insert Sample Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍💻CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Accounts (&lt;br&gt;
    acc_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    balance INT CHECK (balance &amp;gt;= 0));&lt;br&gt;
INSERT INTO Accounts (acc_no, name, balance) VALUES&lt;br&gt;
(101, 'Calindra', 5800),&lt;br&gt;
(102, 'Thalorin', 4200),&lt;br&gt;
(103, 'Veylith', 6900);&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kv853x3g1ptjx0tm8oo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kv853x3g1ptjx0tm8oo.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbm4t9n59hktd0ovzdha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbm4t9n59hktd0ovzdha.png" alt=" " width="800" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfidg04ze85zd4jzyvxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfidg04ze85zd4jzyvxw.png" alt=" " width="762" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;acc_no is the primary key, ensuring each account is unique 🔑&lt;/li&gt;
&lt;li&gt;balance has a CHECK constraint to prevent negative values ❌&lt;/li&gt;
&lt;li&gt;Sample data gives three accounts to work with for transactions ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⭐Step 2: Atomicity 🧩 – All-or-Nothing Transactions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Ensure that if part of a transaction fails, no partial updates occur.&lt;br&gt;
&lt;strong&gt;Scenario:&lt;/strong&gt; Transfer 1500 from Calindra to Thalorin, but simulate an error midway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍💻CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance - 1500 WHERE acc_no = 101;&lt;br&gt;
UPDATE Accounts SET balance = balance + 1500 WHERE acc_no = 102;&lt;br&gt;
ROLLBACK;&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyvgtzo3oupzt2r9l49o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyvgtzo3oupzt2r9l49o.png" alt=" " width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After ROLLBACK, all balances remain unchanged 🔄&lt;/li&gt;
&lt;li&gt;Prevents incomplete transactions, critical in banking systems 💳&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⭐Step 3: Consistency ⚖️ – Enforcing Data Rules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Ensure the database always remains in a valid state.&lt;br&gt;
&lt;strong&gt;Scenario:&lt;/strong&gt; Try to insert a record with a negative balance:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍💻CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts (acc_no, name, balance) VALUES (104, 'Elarion', -2000);&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywit1nqfctxp4wa6eecs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywit1nqfctxp4wa6eecs.png" alt=" " width="800" height="47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexl2vhs72qacjhocdibh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexl2vhs72qacjhocdibh.png" alt=" " width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database constraints ❌ prevent invalid data&lt;/li&gt;
&lt;li&gt;Consistency ensures all business rules and constraints are preserved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip 💡:&lt;/strong&gt; Use constraints, triggers, and validations to maintain consistent data, especially in critical systems like finance, healthcare, or inventory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐Step 4: Isolation 🚧 – Transactions Don’t Interfere&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Ensure simultaneous transactions don’t cause conflicts.&lt;br&gt;
&lt;strong&gt;Scenario:&lt;/strong&gt; Simulate two sessions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍💻CODE:&lt;/strong&gt;&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance - 700 WHERE acc_no = 101;&lt;br&gt;
SELECT balance FROM Accounts WHERE acc_no = 101;&lt;br&gt;
COMMIT;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 1:&lt;/strong&gt; Update an account but do not commit yet:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcuepehcf09fub5w86m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcuepehcf09fub5w86m2.png" alt=" " width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 2:&lt;/strong&gt; Read the same account’s balance:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftspxck8mxkfcsyjpess5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftspxck8mxkfcsyjpess5.png" alt=" " width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session 2 sees the original balance until Session 1 commits 🔒&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Session 1 Commit:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7s4j7u5euvrn14i4t4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7s4j7u5euvrn14i4t4d.png" alt=" " width="667" height="76"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After commit, Session 2 sees the updated balance ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip 💡:&lt;/strong&gt; Different isolation levels (READ COMMITTED, REPEATABLE READ, SERIALIZABLE) control how strict transaction isolation is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐Step 5: Durability 💪 – Committed Transactions Persist&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Ensure committed transactions are permanent, even after a crash or restart.&lt;br&gt;
&lt;strong&gt;Scenario:&lt;/strong&gt; Update Veylith’s balance and commit:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍💻CODE:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 2500 WHERE acc_no = 103;&lt;br&gt;
COMMIT;&lt;br&gt;
SELECT acc_no, name, balance FROM Accounts WHERE acc_no = 103;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s1ecr0wyboyxfnp7q3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6s1ecr0wyboyxfnp7q3o.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After restart, Veylith’s balance retains the updated value 💾&lt;/li&gt;
&lt;li&gt;Durability is typically ensured using write-ahead logs (WAL) and disk storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;💡 Closing Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this guide, we explored ACID properties — Atomicity 🧩, Consistency ⚖️, Isolation 🚧, and Durability 💪 — using a simple Accounts table to illustrate real-world scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atomicity: Transactions are all-or-nothing — rollback ensures no partial updates.&lt;/li&gt;
&lt;li&gt;Consistency: Constraints like balance &amp;gt;= 0 keep data valid at all times.&lt;/li&gt;
&lt;li&gt;Isolation: Concurrent transactions operate independently, preventing conflicts.&lt;/li&gt;
&lt;li&gt;Durability: Committed changes survive database crashes and restarts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By understanding and applying ACID principles, you can build robust, reliable, and secure database applications — whether in banking 💳, e-commerce 🛒, healthcare 🏥, or enterprise systems 🏢.&lt;/p&gt;

&lt;p&gt;Mastering ACID not only ensures data integrity and safety but also gives you the confidence to handle real-world transactional challenges with SQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Remember:&lt;/strong&gt; ACID isn’t just a theory — it’s the backbone of trustworthy, dependable database systems.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>database</category>
      <category>tutorial</category>
      <category>sql</category>
    </item>
    <item>
      <title>Database Normalization in SQL — 1NF, 2NF, and 3NF Explained (Student–Course Case Study)</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Sat, 04 Oct 2025 04:23:32 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/database-normalization-in-sql-1nf-2nf-and-3nf-explained-student-course-4oee</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/database-normalization-in-sql-1nf-2nf-and-3nf-explained-student-course-4oee</guid>
      <description>&lt;p&gt;🎯 &lt;strong&gt;Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database normalization&lt;/strong&gt; is one of the most important concepts in database design. It ensures that data is stored efficiently, redundancy is minimized, and data integrity is maintained.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll walk through &lt;strong&gt;First Normal Form (1NF), Second Normal Form (2NF), and Third Normal Form (3NF)&lt;/strong&gt; — step by step — with clear SQL examples using a Student–Course–Instructor scenario.&lt;/p&gt;

&lt;p&gt;By the end, you’ll understand not only how to normalize a table, but why it matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧱 Base Table — The Starting Point&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s begin with a simple (but flawed) table design that stores students, their enrolled courses, and instructor details:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc44jgfgtcq1a71vk3i08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc44jgfgtcq1a71vk3i08.png" alt=" " width="778" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance, this table might look fine — it gives us all the details in one place. But let’s look deeper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Data Anomalies in the Base Table&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Insertion anomaly:&lt;/strong&gt; You can’t add a new course unless a student enrolls in it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update anomaly:&lt;/strong&gt; If Dr. Kumar changes his phone number, you must update it in every row where he appears.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deletion anomaly:&lt;/strong&gt; If Priya withdraws from DBMS, all information about the course “DBMS” and Dr. Kumar may be lost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To overcome these issues, we apply &lt;strong&gt;Normalization&lt;/strong&gt; — a step-by-step process of structuring the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 Step 1: Convert to 1NF (First Normal Form)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Rule:&lt;/strong&gt; Every attribute (column) must contain atomic values — no repeating groups or arrays.&lt;/p&gt;

&lt;p&gt;Our table already follows 1NF since each field holds only a single value (no lists or sets).&lt;br&gt;
However, we’ll still define it formally in SQL to set a proper structure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t8tumtbg4t79t7jyb71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t8tumtbg4t79t7jyb71.png" alt=" " width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;➕ Insert Sample Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwxyeriiz73qe1ylxefg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwxyeriiz73qe1ylxefg.png" alt=" " width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Note:&lt;/strong&gt; Even though this satisfies 1NF, redundancy still exists — course and instructor details are repeated multiple times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 Step 2: Convert to 2NF (Second Normal Form)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Rule:&lt;/strong&gt; Remove partial dependencies — every non-key attribute should depend on the entire primary key, not just part of it.&lt;/p&gt;

&lt;p&gt;In the current table, the composite key could be (StudentID, CourseID), but columns like CourseName, Instructor, and InstructorPhone depend only on CourseID.&lt;br&gt;
&lt;strong&gt;This violates 2NF.&lt;/strong&gt;&lt;br&gt;
So, we’ll split the data into separate tables: Student, Course, and Enrollment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧮 Student Table&lt;/strong&gt;&lt;br&gt;
Stores only student-related details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybqx93oh6bwn2fmplozd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybqx93oh6bwn2fmplozd.png" alt=" " width="585" height="119"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📘 Course Table&lt;/strong&gt;&lt;br&gt;
Stores course information and the instructor details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hm65gg01hf5c8cv3yw0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hm65gg01hf5c8cv3yw0.png" alt=" " width="592" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧾 Enrollment Table&lt;/strong&gt;&lt;br&gt;
Connects students and courses, forming a many-to-many relationship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvx21m4c1zg9lnq123shk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvx21m4c1zg9lnq123shk.png" alt=" " width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;➕ Insert Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frisuv5nz53y410pqram7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frisuv5nz53y410pqram7.png" alt=" " width="723" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ovb2fmypk1atbjhn9fh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ovb2fmypk1atbjhn9fh.png" alt=" " width="783" height="708"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Now: Each table has data that depends entirely on its key.&lt;br&gt;
We’ve removed redundancy between students and courses, but one more dependency remains — between instructors and phone numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩 Step 3: Convert to 3NF (Third Normal Form)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Rule:&lt;/strong&gt; Remove transitive dependencies — non-key attributes should not depend on other non-key attributes.&lt;br&gt;
In our case, InstructorPhone depends on Instructor, not directly on CourseID.&lt;br&gt;
&lt;strong&gt;That’s a transitive dependency.&lt;/strong&gt;&lt;br&gt;
To fix it, we’ll create a separate Instructor table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👨‍🏫 Instructor Table&lt;/strong&gt;&lt;br&gt;
Stores instructor names and phone numbers independently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04ap7aqv5i4p6xkm67jd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04ap7aqv5i4p6xkm67jd.png" alt=" " width="558" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📘 Course Table (Revised)&lt;/strong&gt;&lt;br&gt;
Now, instead of storing instructor details directly, we’ll link each course to its instructor via InstructorID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o20ozpkbbhms4k643nx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o20ozpkbbhms4k643nx.png" alt=" " width="800" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;➕ Insert Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68m0b4c4q6rfvvyfo0ns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68m0b4c4q6rfvvyfo0ns.png" alt=" " width="682" height="843"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Now: Each column depends only on the key — there’s no transitive dependency, and data updates are easier, safer, and cleaner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧮 Step 4: Query — Combining All Tables Using JOINs&lt;/strong&gt;&lt;br&gt;
Finally, let’s bring everything together and view the full data using JOIN statements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07gnkvivpqyqn2q4zcgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07gnkvivpqyqn2q4zcgw.png" alt=" " width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq1fln17f7b4t2ylqo0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq1fln17f7b4t2ylqo0s.png" alt=" " width="799" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ The query clearly shows the relationship between students, courses, and instructors — all retrieved efficiently from the normalized schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Normalization is more than a theoretical rule — it’s a practical design principle that helps you build efficient, scalable, and error-free databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By applying 1NF → 2NF → 3NF:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We eliminated redundant data&lt;/li&gt;
&lt;li&gt;Prevented update, insertion, and deletion anomalies&lt;/li&gt;
&lt;li&gt;Created a clean, modular design for easier maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Through this example, we’ve seen how a complex, redundant table can be systematically broken down into clean, well-structured tables following 1NF, 2NF, and 3NF.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>database</category>
    </item>
    <item>
      <title>🚀 Indexing, Hashing &amp; Query Optimization in SQL (Tutorial Example on Students Table)</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Fri, 03 Oct 2025 10:50:46 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/indexing-hashing-query-optimization-in-sql-tutorial-example-on-students-table-3kd2</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/indexing-hashing-query-optimization-in-sql-tutorial-example-on-students-table-3kd2</guid>
      <description>&lt;p&gt;In database systems, query performance is critical. If a table has thousands (or millions) of rows, scanning the entire table for every query is slow. Indexes and hashing solve this problem by allowing faster data retrieval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indexing&lt;/strong&gt; works like a textbook index — instead of scanning every row, the database can jump directly to the required data.&lt;br&gt;
&lt;strong&gt;Hashing&lt;/strong&gt; uses a hash function to quickly locate records based on a search key.&lt;/p&gt;

&lt;p&gt;Types of Indexing We’ll Explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;B-Tree Index&lt;/strong&gt; → Best for equality and range queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B+ Tree Index&lt;/strong&gt; → Optimized for sequential and range queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hash Index&lt;/strong&gt; → Very fast for equality searches but not for ranges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this tutorial, we’ll create a Students table and see how different indexes improve query performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 Step 1: Create the Students Table:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88l0pfa2yusmshu4kfco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88l0pfa2yusmshu4kfco.png" alt=" " width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We created a database named College to store our tables. Using a separate database helps keep data organized and isolated from other projects.&lt;/p&gt;

&lt;p&gt;The table consists of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;roll_no → Unique identifier for each student (primary key).&lt;/li&gt;
&lt;li&gt;name → Student’s name.&lt;/li&gt;
&lt;li&gt;dept → Department (e.g., CSE, CSBS).&lt;/li&gt;
&lt;li&gt;cgpa → Cumulative grade point average (decimal).
This table will be used to demonstrate indexing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📌 Step 2: Insert Sample Records&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf9so6viidmnqacsnhkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf9so6viidmnqacsnhkg.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4z6poxphjks96ckwnxrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4z6poxphjks96ckwnxrb.png" alt=" " width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inserted 20 records covering different departments and CGPA values to demonstrate range and equality queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 Step 3: Create a B-Tree Index on roll_no&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguf84fbomddxdg358qgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguf84fbomddxdg358qgj.png" alt=" " width="800" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;B-Tree indexes are excellent for equality lookups and range searches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 Step 4:Query : Student by Roll Number&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jmsdljz6v9erv4babzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jmsdljz6v9erv4babzg.png" alt=" " width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Searching for a specific roll_no is fast because the database can navigate the tree instead of scanning all rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 Step 5: Create a B+ Tree Index on cgpa&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabeo68hw3oczn5crhrkk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabeo68hw3oczn5crhrkk.png" alt=" " width="800" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;B+ Tree indexes store all records in leaf nodes, making sequential and range queries efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 Step 6:Query : Student by Cgpa&amp;gt;8.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19olweb3ydnatscq8wnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19olweb3ydnatscq8wnz.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Queries like cgpa &amp;gt; 8.0 can quickly access only the relevant CGPA values without scanning the entire table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌Step 7: Create a Hash Index on dept&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtwzzesm6belamdz2stm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtwzzesm6belamdz2stm.png" alt=" " width="800" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hash indexes are extremely fast for equality searches (like dept = 'CSBS').&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌Step 8: Query : By Department&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wasrqy62zwx84djedbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7wasrqy62zwx84djedbs.png" alt=" " width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌Step 9: Test Query Performance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgec5g3dzrq56rrxljl57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgec5g3dzrq56rrxljl57.png" alt=" " width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;EXPLAIN shows the query execution plan.&lt;br&gt;
After creating indexes, the database uses the index instead of scanning all rows, improving speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Indexing and hashing are essential tools for query optimization in database systems. By creating the right type of index:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;B-Tree helps quickly locate individual records and supports range queries.&lt;/li&gt;
&lt;li&gt;B+ Tree is ideal for efficiently retrieving records over a range of values.&lt;/li&gt;
&lt;li&gt;Hash Index provides lightning-fast lookup for equality searches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Proper use of indexes can dramatically reduce query time, improve database performance, and make large datasets manageable. Always choose the index type based on your query patterns for optimal results.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>programming</category>
      <category>beginners</category>
      <category>sql</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Thu, 21 Aug 2025 13:34:15 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/-2kj8</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/-2kj8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/thushitha_tk_ffd2acfb6067/sql-tutorial-building-a-college-student-course-management-system-step-by-step-guide-424e" class="crayons-story__hidden-navigation-link"&gt;SQL Tutorial: Building a College Student &amp;amp; Course Management System (Step-by-Step Guide)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/thushitha_tk_ffd2acfb6067" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3448110%2Ff1710950-a086-48fe-b4e5-0df5be25bb4c.png" alt="thushitha_tk_ffd2acfb6067 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/thushitha_tk_ffd2acfb6067" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Thushitha 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Thushitha 
                
              
              &lt;div id="story-author-preview-content-2787528" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/thushitha_tk_ffd2acfb6067" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3448110%2Ff1710950-a086-48fe-b4e5-0df5be25bb4c.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Thushitha &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/thushitha_tk_ffd2acfb6067/sql-tutorial-building-a-college-student-course-management-system-step-by-step-guide-424e" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 21 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/thushitha_tk_ffd2acfb6067/sql-tutorial-building-a-college-student-course-management-system-step-by-step-guide-424e" id="article-link-2787528"&gt;
          SQL Tutorial: Building a College Student &amp;amp; Course Management System (Step-by-Step Guide)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/learning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;learning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/thushitha_tk_ffd2acfb6067/sql-tutorial-building-a-college-student-course-management-system-step-by-step-guide-424e#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>SQL Tutorial: Building a College Student &amp; Course Management System (Step-by-Step Guide)</title>
      <dc:creator>Thushitha </dc:creator>
      <pubDate>Thu, 21 Aug 2025 13:32:32 +0000</pubDate>
      <link>https://dev.to/thushitha_tk_ffd2acfb6067/sql-tutorial-building-a-college-student-course-management-system-step-by-step-guide-424e</link>
      <guid>https://dev.to/thushitha_tk_ffd2acfb6067/sql-tutorial-building-a-college-student-course-management-system-step-by-step-guide-424e</guid>
      <description>&lt;p&gt;Student, course, and faculty management is a fundamental requirement in academic institutions. In this tutorial, we will design and implement a comprehensive &lt;strong&gt;College Management System using SQL&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The guide will take you step by step through key concepts such as Data Definition Language (DDL), Data Manipulation Language (DML), constraints, functions, joins, views, and stored procedures—providing a practical insight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema Design:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To structure our College Management System effectively, we identify four key entities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Students&lt;/strong&gt; – Represent individuals enrolled in the institution who register for various courses.&lt;br&gt;
&lt;strong&gt;Courses&lt;/strong&gt; – Academic subjects or programs offered by different departments.&lt;br&gt;
&lt;strong&gt;Enrollments&lt;/strong&gt; – A bridge table capturing the many-to-many relationship between students and courses.&lt;br&gt;
&lt;strong&gt;Faculty&lt;/strong&gt; – Instructors responsible for teaching courses, each associated with a specific department. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating the Base Tables:&lt;/strong&gt;&lt;br&gt;
We’ll start by creating the Students, Courses and  Enrollments tables.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
    StudentID NUMBER PRIMARY KEY,&lt;br&gt;
    Name VARCHAR2(50) NOT NULL,&lt;br&gt;
    Dept VARCHAR2(30),&lt;br&gt;
    DOB DATE,&lt;br&gt;
    Email VARCHAR2(50) UNIQUE&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses (&lt;br&gt;
    CourseID NUMBER PRIMARY KEY,&lt;br&gt;
    CourseName VARCHAR2(50) NOT NULL,&lt;br&gt;
    Credits NUMBER(2)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments (&lt;br&gt;
    EnrollID NUMBER PRIMARY KEY,&lt;br&gt;
    StudentID NUMBER REFERENCES Students(StudentID),&lt;br&gt;
    CourseID NUMBER REFERENCES Courses(CourseID),&lt;br&gt;
    Grade CHAR(2)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;👨‍🏫 &lt;strong&gt;Adding Faculty Table (DDL):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Faculty (&lt;br&gt;
    FacultyID NUMBER PRIMARY KEY,&lt;br&gt;
    FacultyName VARCHAR2(50) NOT NULL,&lt;br&gt;
    Dept VARCHAR2(30),&lt;br&gt;
    Email VARCHAR2(50) UNIQUE&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;✍️ &lt;strong&gt;Inserting Sample Data (DML):&lt;/strong&gt;&lt;br&gt;
Let’s insert students, courses, faculty, and enrollments.&lt;/p&gt;

&lt;p&gt;Students Table:&lt;br&gt;
INSERT INTO Students VALUES (1, 'thush', 'CSb', DATE '2006-05-15', '&lt;a href="mailto:thush@college.dbms"&gt;thush@college.dbms&lt;/a&gt;');&lt;br&gt;
INSERT INTO Students VALUES (2, 'kesh', 'CIVIL', DATE '2009-11-20', '&lt;a href="mailto:kesh@college.dbms"&gt;kesh@college.dbms&lt;/a&gt;');&lt;br&gt;
INSERT INTO Students VALUES (3, 'Grace', 'IT', DATE '2004-01-10', '&lt;a href="mailto:Grace@college.dbms"&gt;Grace@college.dbms&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;Courses Table:&lt;br&gt;
INSERT INTO Courses VALUES (100, 'Database Systems', 4);&lt;br&gt;
INSERT INTO Courses VALUES (101, 'Digital Electronics', 3);&lt;br&gt;
INSERT INTO Courses VALUES (102, 'EDA, 3);&lt;/p&gt;

&lt;p&gt;Faculty Table:&lt;br&gt;
INSERT INTO Faculty VALUES (201, 'Dr. Richard', 'CSE', '&lt;a href="mailto:richard@college.edu"&gt;richard@college.edu&lt;/a&gt;');&lt;br&gt;
INSERT INTO Faculty VALUES (202, 'Dr. Meena', 'ECE', '&lt;a href="mailto:meena@college.edu"&gt;meena@college.edu&lt;/a&gt;');&lt;br&gt;
INSERT INTO Faculty VALUES (203, 'Dr. Kumar', 'MECH', '&lt;a href="mailto:kumar@college.edu"&gt;kumar@college.edu&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;Enrollments Table:&lt;br&gt;
INSERT INTO Enrollments VALUES (1, 1, 101, 'A');&lt;br&gt;
INSERT INTO Enrollments VALUES (2, 1, 102, 'B');&lt;br&gt;
INSERT INTO Enrollments VALUES (3, 2, 103, 'A');&lt;br&gt;
INSERT INTO Enrollments VALUES (4, 3, 101, 'C');&lt;/p&gt;

&lt;p&gt;The records have now been added to their respective tables.&lt;/p&gt;

&lt;p&gt;🔧&lt;strong&gt;Altering Tables:&lt;/strong&gt;&lt;br&gt;
Let’s add a Phone Number column to Students.&lt;/p&gt;

&lt;p&gt;ALTER TABLE Students&lt;br&gt;
ADD PhoneNo CHAR(10);&lt;/p&gt;

&lt;p&gt;The Phone Number column has now been included in the table.&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Adding Constraints:&lt;/strong&gt;&lt;br&gt;
Ensure Credits in Courses are between 1 and 5.&lt;/p&gt;

&lt;p&gt;ALTER TABLE Courses&lt;br&gt;
ADD CONSTRAINT chk_credits CHECK (Credits BETWEEN 1 AND 5);&lt;/p&gt;

&lt;p&gt;🔍&lt;strong&gt;SELECT with Functions:&lt;/strong&gt;&lt;br&gt;
Display student names in uppercase and the length of their email IDs.&lt;/p&gt;

&lt;p&gt;SELECT UPPER(Name) AS StudentName,&lt;br&gt;
       LENGTH(Email) AS EmailLength&lt;br&gt;
FROM Students;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyj900r5gtigl7myb08hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyj900r5gtigl7myb08hy.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📊&lt;strong&gt;Aggregate Functions:&lt;/strong&gt;&lt;br&gt;
Find average credits and total students.&lt;/p&gt;

&lt;p&gt;SELECT AVG(Credits) AS AvgCredits FROM Courses;&lt;br&gt;
SELECT COUNT(*) AS TotalStudents FROM Students;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbocfxaf19oa9npyzj37i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbocfxaf19oa9npyzj37i.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗&lt;strong&gt;JOIN Operation:&lt;/strong&gt;&lt;br&gt;
List all students with their enrolled courses and grades.&lt;/p&gt;

&lt;p&gt;SELECT s.Name AS StudentName,&lt;br&gt;
       c.CourseName,&lt;br&gt;
       e.Grade&lt;br&gt;
FROM Students s&lt;br&gt;
JOIN Enrollments e ON s.StudentID = e.StudentID&lt;br&gt;
JOIN Courses c ON e.CourseID = c.CourseID;&lt;/p&gt;

&lt;p&gt;📌&lt;strong&gt;GROUP BY with HAVING:&lt;/strong&gt;&lt;br&gt;
Show departments with more than 2 students.&lt;/p&gt;

&lt;p&gt;SELECT Dept, COUNT(&lt;em&gt;) AS StudentCount&lt;br&gt;
FROM Students&lt;br&gt;
GROUP BY Dept&lt;br&gt;
HAVING COUNT(&lt;/em&gt;) &amp;gt; 2;&lt;/p&gt;

&lt;p&gt;👁️&lt;strong&gt;Creating Views:&lt;/strong&gt;&lt;br&gt;
Create a view for student-course-grade info.&lt;/p&gt;

&lt;p&gt;CREATE VIEW StudentCoursesView AS&lt;br&gt;
SELECT s.Name AS StudentName,&lt;br&gt;
       c.CourseName,&lt;br&gt;
       e.Grade&lt;br&gt;
FROM Students s&lt;br&gt;
JOIN Enrollments e ON s.StudentID = e.StudentID&lt;br&gt;
JOIN Courses c ON e.CourseID = c.CourseID;&lt;/p&gt;

&lt;p&gt;⚙️&lt;strong&gt;Stored Procedure:&lt;/strong&gt;&lt;br&gt;
Update a student’s grade dynamically.&lt;/p&gt;

&lt;p&gt;CREATE OR REPLACE PROCEDURE UpdateGrade (&lt;br&gt;
    p_StudentID IN NUMBER,&lt;br&gt;
    p_CourseID IN NUMBER,&lt;br&gt;
    p_NewGrade IN CHAR&lt;br&gt;
)&lt;br&gt;
AS&lt;br&gt;
BEGIN&lt;br&gt;
    UPDATE Enrollments&lt;br&gt;
    SET Grade = p_NewGrade&lt;br&gt;
    WHERE StudentID = p_StudentID&lt;br&gt;
      AND CourseID = p_CourseID;&lt;br&gt;
    COMMIT;&lt;br&gt;
END;&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;SQL Tutorial Summary:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🏗️ Created tables: Students, Courses, Enrollments, and Faculty (with constraints).&lt;br&gt;
✍️ Inserted records into Students table with different departments.&lt;br&gt;
🔧 Altered table to add PhoneNo (10-digit numbers).&lt;br&gt;
📏 Applied constraints: Course credits between 1 and 5.&lt;br&gt;
🔠 SELECT with functions: Displayed names in UPPERCASE &amp;amp; email length.&lt;br&gt;
📊 Aggregate functions: Calculated average credits &amp;amp; total students.&lt;br&gt;
🔗 JOIN operation: Listed Student Name, Course Name, and Grade.&lt;br&gt;
🗂️ GROUP BY + HAVING: Department-wise student count (only &amp;gt;2).&lt;br&gt;
👁️ View (StudentCoursesView): Simplified Student–Course–Grade display.&lt;br&gt;
⚙️ Stored Procedure (UpdateGrade): Dynamically updated student grades.&lt;/p&gt;

&lt;p&gt;✨ This tutorial covers DDL, DML, Constraints, Functions, Joins, Grouping, Views, and Stored Procedures — a complete SQL learning pack!🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzpwck9hm3wx4scxnbwk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzpwck9hm3wx4scxnbwk.jpeg" alt=" " width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mzaho65k9gzr09oh8hq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mzaho65k9gzr09oh8hq.jpeg" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh2zft8p01ozln3licde.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh2zft8p01ozln3licde.jpeg" alt=" " width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rpj18itajtdudg1zhq9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rpj18itajtdudg1zhq9.jpeg" alt=" " width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvx82udj2tafski2o0fwe.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvx82udj2tafski2o0fwe.jpeg" alt=" " width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fueu3a7wrfbj6b3usygkc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fueu3a7wrfbj6b3usygkc.jpeg" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyselqxbng5ru3tgajb4l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyselqxbng5ru3tgajb4l.jpeg" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
