<?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: Prabavathy Balagurusamy</title>
    <description>The latest articles on DEV Community by Prabavathy Balagurusamy (@prabavathy_balagurusamy_2).</description>
    <link>https://dev.to/prabavathy_balagurusamy_2</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%2F3451682%2F88e3d7a7-76c9-41a0-80a2-69b39e9685c0.png</url>
      <title>DEV Community: Prabavathy Balagurusamy</title>
      <link>https://dev.to/prabavathy_balagurusamy_2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prabavathy_balagurusamy_2"/>
    <language>en</language>
    <item>
      <title>🏦 Database Magic: Automating Tasks with Cursor and Trigger ✨</title>
      <dc:creator>Prabavathy Balagurusamy</dc:creator>
      <pubDate>Fri, 10 Oct 2025 03:41:44 +0000</pubDate>
      <link>https://dev.to/prabavathy_balagurusamy_2/database-magic-automating-tasks-with-cursor-and-trigger-4nl8</link>
      <guid>https://dev.to/prabavathy_balagurusamy_2/database-magic-automating-tasks-with-cursor-and-trigger-4nl8</guid>
      <description>&lt;p&gt;Managing a database isn’t just about keeping information — it’s about automating how data behaves and reacts.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore two powerful SQL components that help add automation and intelligence to your database:&lt;/p&gt;

&lt;p&gt;🎯 Cursor – processes query results one row at a time&lt;br&gt;
⚙️ Trigger – executes specific actions automatically after data changes&lt;/p&gt;

&lt;p&gt;Let’s understand how both work! 🔍&lt;/p&gt;

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

&lt;p&gt;A cursor is a database mechanism that allows you to handle query results row by row — ideal when you need to process records individually or apply specific logic.&lt;/p&gt;

&lt;p&gt;🧩 **Step 1: Create the Employee Table &amp;amp; Insert Sample Records&lt;/p&gt;

&lt;p&gt;CODE:**&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;&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%2Fegqirbv0z6ep1paqrper.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%2Fegqirbv0z6ep1paqrper.png" alt=" " width="532" height="241"&gt;&lt;/a&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%2F51t6nctpyaypw3j3gkep.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%2F51t6nctpyaypw3j3gkep.png" alt=" " width="800" height="354"&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%2Fjhgr38y5bsz86e1ab3pm.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%2Fjhgr38y5bsz86e1ab3pm.png" alt=" " width="572" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ This creates an Employee table and inserts some sample data.&lt;br&gt;
A few employees have salaries greater than ₹50,000, which we’ll filter using a cursor.&lt;/p&gt;

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

&lt;p&gt;We’ll now define a stored procedure that uses a cursor to display the names of employees earning more than ₹50,000.&lt;/p&gt;

&lt;p&gt;CODE:&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 BOOLEAN DEFAULT FALSE;&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 = TRUE;&lt;/p&gt;

&lt;p&gt;OPEN emp_cursor;&lt;/p&gt;

&lt;p&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;/p&gt;

&lt;p&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;🧾 Output:&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%2Fee3dr4zevpl9o5lclfzt.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%2Fee3dr4zevpl9o5lclfzt.png" alt=" " width="800" height="642"&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%2F63c0s4ry7xjrdxxipcd0.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%2F63c0s4ry7xjrdxxipcd0.png" alt=" " width="541" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The cursor selects employees whose salary exceeds ₹50,000.&lt;/p&gt;

&lt;p&gt;The handler ensures the loop exits when there are no more rows left to fetch.&lt;/p&gt;

&lt;p&gt;Commands like OPEN, FETCH, and CLOSE control the cursor’s operation.&lt;/p&gt;

&lt;p&gt;For each fetched row, the employee name is displayed using a SELECT statement.&lt;/p&gt;

&lt;p&gt;When executed, this stored procedure loops through all qualifying employees and prints their names one by one.&lt;/p&gt;

&lt;p&gt;⚡ Part 2: AFTER INSERT Trigger – Auto Logging New Student Registrations&lt;/p&gt;

&lt;p&gt;A trigger in SQL is a block of code that executes automatically when a specific event occurs in a table.&lt;br&gt;
Here, we’ll create a trigger that logs every new student registration in a separate audit table.&lt;/p&gt;

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

&lt;p&gt;CODE:&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%2Fuoou9tkxh2oympbi05fm.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%2Fuoou9tkxh2oympbi05fm.png" alt=" " width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ The Students table stores student information, and the Student_Audit table will maintain a log of each registration.&lt;/p&gt;

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

&lt;p&gt;This trigger fires automatically right after a new record is inserted into the Students table.&lt;/p&gt;

&lt;p&gt;CODE:&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%2Feno63uzbp1ave6f2jxlj.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%2Feno63uzbp1ave6f2jxlj.png" alt=" " width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ The NEW keyword refers to the recently inserted record.&lt;br&gt;
✅ NOW() stores the exact timestamp when the student was added.&lt;/p&gt;

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

&lt;p&gt;CODE:&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%2Fc1l9nryf3z5yqrral2fx.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%2Fc1l9nryf3z5yqrral2fx.png" alt=" " width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧾** Output:**&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%2Fdle5ryntrpb6qv9mec3x.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%2Fdle5ryntrpb6qv9mec3x.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;Both Cursors and Triggers help bring automation and logic directly into your SQL environment.&lt;/p&gt;

&lt;p&gt;💡 Use Cursors when you need to process rows one at a time with specific conditions.&lt;br&gt;
⚙️ Use Triggers when you want automatic actions to occur after table modifications.&lt;/p&gt;

&lt;p&gt;🚀 Apply these concepts to your projects and make your databases more dynamic and responsive!&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>data</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>CRUD Operations in MongoDB — Student Management System</title>
      <dc:creator>Prabavathy Balagurusamy</dc:creator>
      <pubDate>Thu, 09 Oct 2025 10:20:47 +0000</pubDate>
      <link>https://dev.to/prabavathy_balagurusamy_2/crud-operations-in-mongodb-student-management-system-3m85</link>
      <guid>https://dev.to/prabavathy_balagurusamy_2/crud-operations-in-mongodb-student-management-system-3m85</guid>
      <description>&lt;p&gt;&lt;strong&gt;🎯 Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To gain hands-on experience performing CRUD (Create, Read, Update, Delete) operations in MongoDB Atlas using a simple college student schema.&lt;/p&gt;

&lt;p&gt;MongoDB is a NoSQL document database that stores data in a flexible, JSON-like format — making it ideal for dynamic and structured data such as student records.&lt;/p&gt;

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

&lt;p&gt;We’ll use a collection called students.&lt;br&gt;
Each student document follows this structure:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "student_id": "S001",&lt;br&gt;
  "name": "Santhosh",&lt;br&gt;
  "age": 20,&lt;br&gt;
  "department": "CSBS",&lt;br&gt;
  "year": 2,&lt;br&gt;
  "cgpa": 9&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;⚙️&lt;strong&gt;Step 1: Create (Insert)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Insert at least 5 student records into the students collection.&lt;/p&gt;

&lt;p&gt;MongoDB Query:&lt;br&gt;
db.students.insertMany&lt;/p&gt;

&lt;p&gt;{ &lt;br&gt;
 "student_id": "S001",&lt;br&gt;
 "name": "Santhosh",&lt;br&gt;
 "age": 20, &lt;br&gt;
 "department": "CSBS",&lt;br&gt;
 "year": 2, &lt;br&gt;
 "cgpa": 9 &lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
 "student_id": "S002",&lt;br&gt;
 "name": "Priya",&lt;br&gt;
 "age": 19, &lt;br&gt;
 "department": "CSE",&lt;br&gt;
 "year": 1, &lt;br&gt;
 "cgpa": 8.7&lt;br&gt;
 },&lt;br&gt;
 {&lt;br&gt;
  "student_id": "S003",&lt;br&gt;
  "name": "Karthik",&lt;br&gt;
  "age": 21, &lt;br&gt;
  "department": "IT",&lt;br&gt;
  "year": 3,&lt;br&gt;
  "cgpa": 7.4 &lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
 "student_id": "S004", &lt;br&gt;
 "name": "Meena",&lt;br&gt;
 "age": 22,&lt;br&gt;
 "department": "ECE", &lt;br&gt;
 "year": 4, &lt;br&gt;
 "cgpa": 8.1 &lt;br&gt;
},&lt;br&gt;
{&lt;br&gt;
 "student_id": "S005",&lt;br&gt;
 "name": "Arun", &lt;br&gt;
 "age": 20,&lt;br&gt;
 "department": "CSBS",&lt;br&gt;
 "year": 2, &lt;br&gt;
 "cgpa": 9.2 &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%2Fr5kirtupo9jssdzwwavu.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%2Fr5kirtupo9jssdzwwavu.png" alt=" " width="800" height="405"&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%2Fbrri0bmfoa653rubgdbw.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%2Fbrri0bmfoa653rubgdbw.png" alt=" " width="800" height="413"&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%2Fn7bhgyl5op4k46c6xcy1.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%2Fn7bhgyl5op4k46c6xcy1.png" alt=" " width="800" height="411"&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%2Fexr247iu005kh5xmkw5z.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%2Fexr247iu005kh5xmkw5z.png" alt=" " width="800" height="411"&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%2Fxbkpqfwxi7mtr0pw41az.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%2Fxbkpqfwxi7mtr0pw41az.png" alt=" " width="800" height="401"&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;Step 2: Read (Query)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Display all student records&lt;br&gt;
db.students.find();&lt;/p&gt;

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

&lt;p&gt;c. Find students belonging to the Computer Science department&lt;br&gt;
db.students.find({ department: { $in: ["CSE", "CSBS"] } });&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%2F2jc1ua6iydm1n91h3vy5.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%2F2jc1ua6iydm1n91h3vy5.png" alt=" " width="800" height="405"&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%2Fhwu9fvm9o2ou6jy9isv9.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%2Fhwu9fvm9o2ou6jy9isv9.png" alt=" " width="800" height="413"&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%2Fo7csc8y3q28ge73tiar0.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%2Fo7csc8y3q28ge73tiar0.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Tip:&lt;/strong&gt;&lt;br&gt;
Use the MongoDB Atlas “Filter” option to test these queries easily.&lt;/p&gt;

&lt;p&gt;✏️ &lt;strong&gt;Step 3: Update&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Update the CGPA of a specific student&lt;br&gt;
Example: Update Santhosh’s CGPA to 9.5&lt;br&gt;
db.students.updateOne(&lt;br&gt;
  { student_id: "S001" },&lt;br&gt;
  { $set: { cgpa: 9.5 } }&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%2Fkkidbmpaaup07yowp74h.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%2Fkkidbmpaaup07yowp74h.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modified 1 document.&lt;/p&gt;

&lt;p&gt;b. Increase the year of study for all 3rd-year students by 1&lt;br&gt;
db.students.updateMany(&lt;br&gt;
  { year: 3 },&lt;br&gt;
  { $inc: { year: 1 } }&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%2Fgqwpqgqonhryycwivpbp.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%2Fgqwpqgqonhryycwivpbp.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
Shows how many documents were modified.&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%2Fsmu3nz5rcsggzwof20c6.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%2Fsmu3nz5rcsggzwof20c6.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;br&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%2Fkkidbmpaaup07yowp74h.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%2Fkkidbmpaaup07yowp74h.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗑️ &lt;strong&gt;Step 4: Delete&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Delete one student record by student_id&lt;br&gt;
Example: Delete student S003&lt;br&gt;
db.students.deleteOne({ student_id: "S003" });&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%2F4cvuxwsq7sw9n5iyuxwu.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%2F4cvuxwsq7sw9n5iyuxwu.png" alt=" " width="800" height="178"&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%2Feosvd2bygi1llv6eobmj.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%2Feosvd2bygi1llv6eobmj.png" alt=" " width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;b. Delete all students having CGPA &amp;lt; 7.5&lt;br&gt;
db.students.deleteMany({ 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%2Ffljf4er7oafqsl4m094u.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%2Ffljf4er7oafqsl4m094u.png" alt=" " width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
Displays number of deleted documents.&lt;br&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%2Ffljf4er7oafqsl4m094u.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%2Ffljf4er7oafqsl4m094u.png" alt=" " width="800" height="281"&gt;&lt;/a&gt;&lt;br&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%2Frhfgte4fgl3d54brinky.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%2Frhfgte4fgl3d54brinky.png" alt=" " width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📤&lt;strong&gt;Step 5: Export the Collection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After performing all CRUD operations, you can export your collection from MongoDB Atlas:&lt;/p&gt;

&lt;p&gt;🪶 Steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your cluster → Collections → Select students.&lt;/li&gt;
&lt;li&gt;Click Export Collection.&lt;/li&gt;
&lt;li&gt;Choose JSON or CSV format.&lt;/li&gt;
&lt;li&gt;Download your file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 &lt;strong&gt;Deliverables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ MongoDB Queries (as shown above)&lt;br&gt;
✅ Screenshots of query results (from Atlas)&lt;br&gt;
✅ Exported students.json or students.csv file&lt;/p&gt;

&lt;p&gt;🌟** Conclusion**&lt;br&gt;
This hands-on lab demonstrates how easily MongoDB handles CRUD operations using a flexible schema.&lt;br&gt;
The students collection can be expanded further to include additional attributes like address, email, or course list — giving you real-world database experience for college or project work.&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>database</category>
    </item>
    <item>
      <title>💾Ensuring Database Stability: Transactions, Deadlocks &amp; Log-Based Recovery</title>
      <dc:creator>Prabavathy Balagurusamy</dc:creator>
      <pubDate>Wed, 08 Oct 2025 20:13:47 +0000</pubDate>
      <link>https://dev.to/prabavathy_balagurusamy_2/ensuring-database-stability-transactions-deadlocks-log-based-recovery-4g3m</link>
      <guid>https://dev.to/prabavathy_balagurusamy_2/ensuring-database-stability-transactions-deadlocks-log-based-recovery-4g3m</guid>
      <description>&lt;p&gt;🧱Modern databases are built to stay consistent, reliable, and resilient — even when systems crash or multiple users access data at once.&lt;br&gt;
Three major mechanisms that make this possible are Transactions, Deadlocks, and Log-Based Recovery.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll explore how each of these works in practice using a simple DB_Assignment table as an example.&lt;/p&gt;

&lt;p&gt;🧱 Step 1: Set Up the DB_Assignment Table&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We’ll start by creating a basic table that mimics a real banking environment where multiple accounts interact.&lt;/li&gt;
&lt;li&gt;Once inserted, verify your data using a simple SELECT * FROM DB_Assignment; query.&lt;/li&gt;
&lt;/ul&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%2Ffj52y25tsq8cxjw20t6h.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%2Ffj52y25tsq8cxjw20t6h.png" alt=" " width="602" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Output:&lt;br&gt;
This table will serve as the foundation for testing transactions and recovery concepts.&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%2Fjbmlwhu9cqdye9ag4m1l.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%2Fjbmlwhu9cqdye9ag4m1l.png" alt=" " width="527" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A transaction is a collection of SQL commands treated as a single logical operation.&lt;/li&gt;
&lt;li&gt;It upholds the ACID principles — Atomicity, Consistency, Isolation, and Durability.&lt;/li&gt;
&lt;li&gt;Here, we’ll highlight Atomicity, which guarantees that either all steps in a transaction are applied or none are — there’s no halfway point.&lt;/li&gt;
&lt;li&gt;💸 Example: Money Transfer&lt;/li&gt;
&lt;li&gt;Suppose Alice transfers ₹500 to Bob.&lt;/li&gt;
&lt;li&gt;We’ll begin the transfer but then roll it back before committing to observe atomicity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE DB_Assignment SET balance = balance - 500 WHERE acc_no = 1;&lt;br&gt;
UPDATE DB_Assignment SET balance = balance + 500 WHERE acc_no = 2;&lt;br&gt;
ROLLBACK;&lt;br&gt;
SELECT * FROM DB_Assignment;&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%2F4jt34hfstqftv67c5pw9.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%2F4jt34hfstqftv67c5pw9.png" alt=" " width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Result:&lt;br&gt;
After rollback, both account balances stay the same — confirming that no partial update occurred.&lt;/p&gt;

&lt;p&gt;💡 Why It’s Important:&lt;br&gt;
If a power outage or software failure happens midway, the rollback mechanism prevents incomplete changes from corrupting the database.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A deadlock happens when two transactions each hold a lock that the other needs, causing both to wait forever.&lt;/li&gt;
&lt;li&gt;This issue often surfaces when multiple users access and modify shared data simultaneously.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💼 Real-World Example:&lt;br&gt;
Think of two cashiers trying to update two linked bank accounts — one has locked Account A and the other Account B.&lt;br&gt;
Each is waiting for the other to release their lock — that’s a deadlock.&lt;/p&gt;

&lt;p&gt;-- Session 1&lt;br&gt;
BEGIN;&lt;br&gt;
UPDATE DB_Assignment SET balance = balance - 500 WHERE acc_no = 1; -- Locks Alice&lt;br&gt;
UPDATE DB_Assignment SET balance = balance + 500 WHERE acc_no = 2; -- Waiting on Bob&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%2F7z5cbjgotw3c000pcu4c.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%2F7z5cbjgotw3c000pcu4c.png" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-- Session 2&lt;br&gt;
BEGIN;&lt;br&gt;
UPDATE DB_Assignment SET balance = balance - 300 WHERE acc_no = 2; -- Locks Bob&lt;br&gt;
UPDATE DB_Assignment SET balance = balance + 300 WHERE acc_no = 1; -- Waiting on Alice&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%2Fa1lsll62mom8qniawsx9.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%2Fa1lsll62mom8qniawsx9.png" alt=" " width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⏳ Both transactions are now stuck waiting — forming a deadlock.&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;How Databases Handle It:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modern DBMS (like MySQL, PostgreSQL, Oracle) automatically detect deadlocks and abort one transaction, allowing the other to complete successfully.&lt;/li&gt;
&lt;li&gt;This maintains database consistency without manual intervention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡&lt;strong&gt;Tips to Prevent Deadlocks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always access tables and rows in a consistent order.&lt;/li&gt;
&lt;li&gt;Keep transactions short and efficient.&lt;/li&gt;
&lt;li&gt;Avoid unnecessary or long-held locks.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Even with transactions and deadlock control, unexpected failures can still occur.&lt;/li&gt;
&lt;li&gt;This is where log-based recovery ensures the Durability part of ACID — guaranteeing that committed data survives system crashes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚙️ &lt;strong&gt;What It Does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Databases maintain transaction logs — for instance, Binary Logs in MySQL or Write-Ahead Logs (WAL) in PostgreSQL — that track every change made to the database.&lt;/li&gt;
&lt;li&gt;If a crash happens, the DBMS replays the log to redo committed transactions and undo incomplete ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE DB_Assignment SET balance = balance + 100 WHERE acc_no = 3;&lt;br&gt;
ROLLBACK;&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%2Fh5eq9cljkykdcb5u5z85.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%2Fh5eq9cljkykdcb5u5z85.png" alt=" " width="800" height="204"&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%2Feeh0twzvnn6vxwx92med.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%2Feeh0twzvnn6vxwx92med.png" alt=" " width="526" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
The rollback entry gets recorded in the log.&lt;br&gt;
If the system crashes, the recovery process reads this log and restores the database to the last consistent state.&lt;/p&gt;

&lt;p&gt;💡&lt;strong&gt;Why It Matters:&lt;/strong&gt;&lt;br&gt;
Without logging, recovering from crashes or incomplete updates would be nearly impossible.&lt;br&gt;
That’s why mission-critical systems like banking and e-commerce rely heavily on log-based recovery.&lt;/p&gt;

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

&lt;p&gt;Database reliability isn’t just about storing data — it’s about maintaining integrity during every possible failure or concurrency issue.&lt;/p&gt;

&lt;p&gt;Transactions ensure atomic and consistent operations.&lt;/p&gt;

&lt;p&gt;Deadlocks teach us how to manage concurrent processes safely.&lt;/p&gt;

&lt;p&gt;Log-Based Recovery guarantees data durability even after unexpected crashes.&lt;/p&gt;

&lt;p&gt;By practicing these concepts hands-on, you’ll understand how professional-grade databases achieve high fault tolerance and data safety in real-world scenarios. ⚡&lt;/p&gt;

</description>
      <category>database</category>
      <category>learning</category>
      <category>sql</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>The Backbone of Database Reliability: Exploring ACID in Action with SQL Transactions</title>
      <dc:creator>Prabavathy Balagurusamy</dc:creator>
      <pubDate>Wed, 08 Oct 2025 19:28:42 +0000</pubDate>
      <link>https://dev.to/prabavathy_balagurusamy_2/the-backbone-of-database-reliability-exploring-acid-in-action-with-sql-transactions-3j3c</link>
      <guid>https://dev.to/prabavathy_balagurusamy_2/the-backbone-of-database-reliability-exploring-acid-in-action-with-sql-transactions-3j3c</guid>
      <description>&lt;p&gt;When it comes to relational databases, the ACID principles form the bedrock of data reliability. They guarantee that every transaction behaves predictably, maintaining stability and trust in the system even when errors occur.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Atomicity 🧩 – Either all operations occur or none do&lt;/li&gt;
&lt;li&gt;Consistency ⚖️ – Rules and constraints always stay valid&lt;/li&gt;
&lt;li&gt;Isolation 🚧 – Parallel transactions don’t interfere&lt;/li&gt;
&lt;li&gt;Durability 💪 – Once committed, data stays safe forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll demonstrate these concepts step by step using an Accounts table and simple SQL transactions.&lt;/p&gt;

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

&lt;p&gt;To begin, we’ll create a table named Accounts with a primary key and a check constraint to ensure valid balances.&lt;/p&gt;

&lt;p&gt;🧑‍💻 CODE:&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%2F9z5c6r3qk4kk8exklin8.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%2F9z5c6r3qk4kk8exklin8.png" alt=" " width="800" height="604"&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 serves as the unique identifier for each account 🔑&lt;/li&gt;
&lt;li&gt;The CHECK constraint blocks any record with a negative balance ❌&lt;/li&gt;
&lt;li&gt;The three sample entries give us a foundation to explore ACID behavior ✅&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Objective: Ensure that no partial updates occur if a transaction fails midway.&lt;br&gt;
Scenario: Transfer ₹1500 from Calindra to Thalorin, but simulate an interruption before completion.&lt;/p&gt;

&lt;p&gt;🧑‍💻 CODE:&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%2Fv66vkregughdm1mdk3ov.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%2Fv66vkregughdm1mdk3ov.png" alt=" " width="800" height="480"&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 executing ROLLBACK, all account balances remain unchanged 🔄.&lt;/li&gt;
&lt;li&gt;This proves Atomicity, where incomplete or failed operations are completely undone — a must for financial systems💳.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Goal: Maintain valid data according to defined rules and constraints.&lt;br&gt;
Scenario: Attempt to insert a record with a negative balance.&lt;/p&gt;

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

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

&lt;p&gt;Result:The system rejects the insertion immediately ❌&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%2F7i19xgu5kdybi3u46jnp.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%2F7i19xgu5kdybi3u46jnp.png" alt=" " width="800" height="39"&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;The CHECK constraint enforces that balances cannot be negative, ensuring the database remains valid.&lt;/li&gt;
&lt;li&gt;Consistency ensures that all business logic and schema rules remain intact — no matter what the transaction tries to do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Tip: Use constraints, validations, and triggers to ensure that the database always holds meaningful, error-free data.&lt;/p&gt;

&lt;p&gt;⭐&lt;strong&gt;Step 4: Isolation 🚧 – Transactions Stay Independent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Goal: Ensure that one transaction doesn’t affect another running at the same time.&lt;br&gt;
Scenario: Run two sessions — one updates an account, the other tries to read it before the update commits.&lt;/p&gt;

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

&lt;p&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;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Session 1: Begins the update but doesn’t commit immediately.&lt;br&gt;
Session 2: Reads the balance — it still sees the old value until the first session commits.&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%2F4d2lorw6c890txtvnogw.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%2F4d2lorw6c890txtvnogw.png" alt=" " width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once Session 1 commits, the new balance becomes visible ✅.&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%2F5vbyrkhngtga9lv3clp4.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%2F5vbyrkhngtga9lv3clp4.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 Note: Isolation levels like READ COMMITTED, REPEATABLE READ, and SERIALIZABLE determine how strictly this behavior is enforced in concurrent environments.&lt;/p&gt;

&lt;p&gt;⭐&lt;strong&gt;Step 5: Durability 💪 – Committed Data Stays&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Goal: Make sure that once a transaction is committed, the data remains safe even after system failures or restarts.&lt;br&gt;
Scenario: Increase Veylith’s balance by ₹2500 and commit.&lt;/p&gt;

&lt;p&gt;🧑‍💻 CODE:&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%2Fioaqh3a6r183jutczqav.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%2Fioaqh3a6r183jutczqav.png" alt=" " width="800" height="336"&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 restarting the database, the committed change persists 💾.&lt;/li&gt;
&lt;li&gt;That’s Durability — once the system acknowledges a commit, it’s written permanently, usually ensured by write-ahead logs (WAL) and disk persistence mechanisms.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Through this hands-on walkthrough, we demonstrated how ACID properties safeguard the integrity and reliability of databases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atomicity: Transactions fully succeed or completely roll back&lt;/li&gt;
&lt;li&gt;Consistency: Data always follows the defined rules&lt;/li&gt;
&lt;li&gt;Isolation: Transactions run without disturbing one another&lt;/li&gt;
&lt;li&gt;Durability: Committed data survives any crash or restart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By mastering these core principles, developers can design systems that are robust, predictable, and secure, whether in banking 💳, healthcare 🏥, or e-commerce 🛒.&lt;/p&gt;

&lt;p&gt;✅ Remember: ACID isn’t just a theory — it’s what makes databases trustworthy and dependable at scale.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>🧠 Database Normalization in SQL (1NF 2NF 3NF)</title>
      <dc:creator>Prabavathy Balagurusamy</dc:creator>
      <pubDate>Wed, 08 Oct 2025 17:11:05 +0000</pubDate>
      <link>https://dev.to/prabavathy_balagurusamy_2/database-normalization-in-sql-1nf-2nf-3nf-5e19</link>
      <guid>https://dev.to/prabavathy_balagurusamy_2/database-normalization-in-sql-1nf-2nf-3nf-5e19</guid>
      <description>&lt;p&gt;&lt;strong&gt;🎯 Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Database normalization 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;To understand 1NF, 2NF, and 3NF, identify data anomalies, and implement normalization using SQL with proper CREATE TABLE, INSERT, and JOIN queries&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%2F3jo1miasymk1shrzfgb3.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%2F3jo1miasymk1shrzfgb3.png" alt=" " width="800" height="206"&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&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This table has the following anomalies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Insertion anomaly&lt;/strong&gt;: A new course can’t be added unless at least one student is enrolled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update anomaly&lt;/strong&gt;: If the instructor’s phone number changes, it must be updated in multiple rows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deletion anomaly&lt;/strong&gt;: If all students of a course are removed, information about that course and instructor is lost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We apply Normalization — a step-by-step process of structuring the database.  &lt;/p&gt;

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

&lt;p&gt;✅ Rule: Every column should contain indivisible (atomic) values — no groups or lists within a single field.&lt;/p&gt;

&lt;p&gt;Our original table already meets this rule since each column stores one value per cell.&lt;br&gt;
However, let’s formally define this table in SQL to establish a proper structure.&lt;/p&gt;

&lt;p&gt;CREATE TABLE StudentCourse_1NF (&lt;br&gt;
  StudentID VARCHAR(10),&lt;br&gt;
  StudentName VARCHAR(50),&lt;br&gt;
  CourseID VARCHAR(10),&lt;br&gt;
  CourseName VARCHAR(50),&lt;br&gt;
  Instructor VARCHAR(50),&lt;br&gt;
  InstructorPhone VARCHAR(15)&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%2F7zfvpjbmffjcnamqtjat.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%2F7zfvpjbmffjcnamqtjat.png" alt=" " width="587" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;INSERT INTO StudentCourse_1NF VALUES&lt;br&gt;
('S01', 'Arjun', 'C101', 'DBMS', 'Dr. Kumar', '9876543210'),&lt;br&gt;
('S01', 'Arjun', 'C102', 'Data Mining', 'Dr. Mehta', '9123456780'),&lt;br&gt;
('S02', 'Priya', 'C101', 'DBMS', 'Dr. Kumar', '9876543210'),&lt;br&gt;
('S03', 'Kiran', 'C103', 'AI', 'Dr. Rao', '9988776655');&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%2Fhk9sjnxzx63s3e4xj773.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%2Fhk9sjnxzx63s3e4xj773.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%2Few8e0t2sahalst2ene1z.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%2Few8e0t2sahalst2ene1z.png" alt=" " width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Observation:&lt;/strong&gt;&lt;br&gt;
Although the data follows 1NF, there’s still repeated information — the same course and instructor details appear multiple times.&lt;/p&gt;

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

&lt;p&gt;✅ Rule: Remove partial dependencies — every non-key attribute must depend on the entire primary key.&lt;/p&gt;

&lt;p&gt;In our current structure, a composite key could be (StudentID, CourseID).&lt;br&gt;
But attributes like CourseName, Instructor, and InstructorPhone depend only on CourseID.&lt;br&gt;
This means the table breaks the rule for 2NF.&lt;/p&gt;

&lt;p&gt;To correct this, we’ll divide the data into three distinct tables: Student, Course, and Enrollment.&lt;/p&gt;

&lt;p&gt;🧮 &lt;strong&gt;Student Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Holds all student-specific details.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Student (&lt;br&gt;
  StudentID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  StudentName VARCHAR(50)&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%2Fkknl8lavbh0p5nel8ktk.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%2Fkknl8lavbh0p5nel8ktk.png" alt=" " width="656" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Student VALUES&lt;br&gt;
('S01', 'Arjun'),&lt;br&gt;
('S02', 'Priya'),&lt;br&gt;
('S03', 'Kiran');&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%2Fuxgcv02tb55ae38eouup.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%2Fuxgcv02tb55ae38eouup.png" alt=" " width="586" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📘 &lt;strong&gt;Course Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contains information about each course and its instructor.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Course (&lt;br&gt;
  CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR(50),&lt;br&gt;
  Instructor VARCHAR(50),&lt;br&gt;
  InstructorPhone VARCHAR(15)&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%2Foiyix1ektoe9brk0g4n4.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%2Foiyix1ektoe9brk0g4n4.png" alt=" " width="628" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Course VALUES&lt;br&gt;
('C101', 'DBMS', 'Dr. Kumar', '9876543210'),&lt;br&gt;
('C102', 'Data Mining', 'Dr. Mehta', '9123456780'),&lt;br&gt;
('C103', 'AI', 'Dr. Rao', '9988776655');&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%2Fxi7krztwqw6qaxl7hcmv.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%2Fxi7krztwqw6qaxl7hcmv.png" alt=" " width="800" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧾 &lt;strong&gt;Enrollment Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Links students to the courses they have enrolled in.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollment (&lt;br&gt;
  StudentID VARCHAR(10),&lt;br&gt;
  CourseID VARCHAR(10),&lt;br&gt;
  PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
  FOREIGN KEY (StudentID) REFERENCES Student(StudentID),&lt;br&gt;
  FOREIGN KEY (CourseID) REFERENCES Course(CourseID)&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%2Fiesax60pxn1ndvqbrx8z.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%2Fiesax60pxn1ndvqbrx8z.png" alt=" " width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollment VALUES&lt;br&gt;
('S01', 'C101'),&lt;br&gt;
('S01', 'C102'),&lt;br&gt;
('S02', 'C101'),&lt;br&gt;
('S03', 'C103');&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%2Ftwg7cvzqpemapbx5z71v.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%2Ftwg7cvzqpemapbx5z71v.png" alt=" " width="611" height="224"&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%2Fhvsimkidw8ajv952u7d1.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%2Fhvsimkidw8ajv952u7d1.png" alt=" " width="800" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Result:&lt;br&gt;
Now, each table only includes data that depends on its own key.&lt;br&gt;
We’ve removed redundant information between students and courses — though one more dependency still exists between Instructor and InstructorPhone.&lt;/p&gt;

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

&lt;p&gt;✅ Rule: Eliminate transitive dependencies — non-key fields shouldn’t depend on other non-key fields.&lt;/p&gt;

&lt;p&gt;Here, InstructorPhone depends on Instructor, not on CourseID.&lt;br&gt;
That’s a transitive dependency, and it violates 3NF.&lt;/p&gt;

&lt;p&gt;To fix this, we’ll create a new table just for instructor details.&lt;/p&gt;

&lt;p&gt;👨‍🏫 &lt;strong&gt;Instructor Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Instructor (&lt;br&gt;
  InstructorID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  InstructorName VARCHAR(50),&lt;br&gt;
  InstructorPhone VARCHAR(15)&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%2Fcudt66dyhmuagyti50sj.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%2Fcudt66dyhmuagyti50sj.png" alt=" " width="698" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Instructor VALUES&lt;br&gt;
('I01', 'Dr. Kumar', '9876543210'),&lt;br&gt;
('I02', 'Dr. Mehta', '9123456780'),&lt;br&gt;
('I03', 'Dr. Rao', '9988776655');&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%2Fdxn77hvlsnfa88932ndu.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%2Fdxn77hvlsnfa88932ndu.png" alt=" " width="647" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📘** Updated Course Table (After 3NF)**&lt;/p&gt;

&lt;p&gt;CREATE TABLE Course_3NF (&lt;br&gt;
  CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR(50),&lt;br&gt;
  InstructorID VARCHAR(10),&lt;br&gt;
  FOREIGN KEY (InstructorID) REFERENCES Instructor(InstructorID)&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%2F0fgl82iu6rzzzpa43nl8.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%2F0fgl82iu6rzzzpa43nl8.png" alt=" " width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Course_3NF VALUES&lt;br&gt;
('C101', 'DBMS', 'I01'),&lt;br&gt;
('C102', 'Data Mining', 'I02'),&lt;br&gt;
('C103', 'AI', 'I03');&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%2Fr3aajfk74t41k8ghsf33.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%2Fr3aajfk74t41k8ghsf33.png" alt=" " width="592" height="189"&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%2Fs5ns8ffoxeaovgkl53hl.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%2Fs5ns8ffoxeaovgkl53hl.png" alt=" " width="746" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Now:&lt;br&gt;
Every column in every table depends directly on its primary key — there’s no indirect dependency left.&lt;br&gt;
The schema is now fully normalized and easy to maintain.&lt;/p&gt;

&lt;p&gt;🧮 &lt;strong&gt;Step 4: Retrieve Data Using JOINs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s merge all the tables to display complete student-course-instructor details.&lt;/p&gt;

&lt;p&gt;SELECT s.StudentName, c.CourseName, i.InstructorName, i.InstructorPhone&lt;br&gt;
FROM Enrollment e&lt;br&gt;
JOIN Student s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Course_3NF c ON e.CourseID = c.CourseID&lt;br&gt;
JOIN Instructor i ON c.InstructorID = i.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%2Fka82k2g6fgxdwi18i6uo.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%2Fka82k2g6fgxdwi18i6uo.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ This result neatly connects students, their courses, and instructors — all using efficient, normalized tables.&lt;/p&gt;

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

&lt;p&gt;Normalization isn’t just a database theory — it’s the foundation for creating efficient, accurate, and scalable database systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By systematically applying 1NF → 2NF → 3NF, &lt;/li&gt;
&lt;li&gt;Removed unnecessary duplication&lt;/li&gt;
&lt;li&gt;Solved insertion, update, and deletion problems&lt;/li&gt;
&lt;li&gt;Organized data for easier queries and maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This Student–Course example clearly demonstrates how normalization transforms messy data into a clean, reliable, and well-structured database.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>database</category>
      <category>mongodb</category>
      <category>sql</category>
    </item>
    <item>
      <title>Optimizing SQL Performance with Indexing, Hashing, and B+ Trees</title>
      <dc:creator>Prabavathy Balagurusamy</dc:creator>
      <pubDate>Mon, 06 Oct 2025 14:53:43 +0000</pubDate>
      <link>https://dev.to/prabavathy_balagurusamy_2/optimizing-sql-performance-with-indexing-hashing-and-b-trees-5a1b</link>
      <guid>https://dev.to/prabavathy_balagurusamy_2/optimizing-sql-performance-with-indexing-hashing-and-b-trees-5a1b</guid>
      <description>&lt;p&gt;🎯 Overview&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore Indexing, Hashing, and Query Optimization concepts practically using SQL.&lt;br&gt;
We’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a Students table&lt;/li&gt;
&lt;li&gt;Insert sample records&lt;/li&gt;
&lt;li&gt;Create B-Tree, B+ Tree, and Hash indexes&lt;/li&gt;
&lt;li&gt;Run queries and see how indexing improves performance&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Let’s start by creating a simple table with columns — roll_no, name, dept, and cgpa.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
    roll_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    dept VARCHAR(10),&lt;br&gt;
    cgpa FLOAT&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%2F1lw68xlh7q8gmzkz0qc9.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%2F1lw68xlh7q8gmzkz0qc9.png" alt=" " width="627" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧾 Step 2: Insert 20 Sample Records&lt;/p&gt;

&lt;p&gt;Here’s some sample data to work with:&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (roll_no, name, dept, cgpa) VALUES&lt;br&gt;
(101, 'Ananya', 'CSBS', 9.1),&lt;br&gt;
(102, 'Rahul', 'CSE', 8.3),&lt;br&gt;
(103, 'Divya', 'ECE', 7.9),&lt;br&gt;
(104, 'Karthik', 'MECH', 8.5),&lt;br&gt;
(105, 'Sanjay', 'EEE', 7.4),&lt;br&gt;
(106, 'Priya', 'CSBS', 9.3),&lt;br&gt;
(107, 'Deepak', 'CSE', 8.0),&lt;br&gt;
(108, 'Meena', 'IT', 8.7),&lt;br&gt;
(109, 'Vishal', 'CSE', 9.0),&lt;br&gt;
(110, 'Kavya', 'CSBS', 8.8),&lt;br&gt;
(111, 'Harini', 'ECE', 7.2),&lt;br&gt;
(112, 'Rakesh', 'MECH', 8.1),&lt;br&gt;
(113, 'Aishwarya', 'EEE', 9.2),&lt;br&gt;
(114, 'Manoj', 'IT', 8.4),&lt;br&gt;
(115, 'Siva', 'CSBS', 9.5),&lt;br&gt;
(116, 'Sneha', 'CSE', 7.8),&lt;br&gt;
(117, 'Nithin', 'MECH', 8.9),&lt;br&gt;
(118, 'Gayathri', 'CSBS', 8.2),&lt;br&gt;
(119, 'Arun', 'ECE', 9.0),&lt;br&gt;
(120, 'Monika', 'IT', 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%2Fui1hikcqk2hexkxm2e4z.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%2Fui1hikcqk2hexkxm2e4z.png" alt=" " width="800" height="556"&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%2Fslxtabpy8v4wanndzfbl.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%2Fslxtabpy8v4wanndzfbl.png" alt=" " width="555" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Most RDBMSs (like MySQL and PostgreSQL) use B-Trees by default for indexing primary keys and unique columns.&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_rollno_btree ON Students(roll_no);&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%2Fg56p9kxfgb6tzn0n27ym.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%2Fg56p9kxfgb6tzn0n27ym.png" alt=" " width="800" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Why B-Tree?&lt;br&gt;
It helps quickly locate records in sorted order. The database doesn’t need to scan every row — it navigates the index like a tree structure.&lt;/p&gt;

&lt;p&gt;🔍 Step 4: Query with B-Tree Index&lt;/p&gt;

&lt;p&gt;Let’s fetch details of the student with roll_no = 110:&lt;/p&gt;

&lt;p&gt;SELECT * FROM Students WHERE roll_no = 110;&lt;/p&gt;

&lt;p&gt;The query optimizer will automatically use the B-Tree index to quickly find the matching record.&lt;/p&gt;

&lt;p&gt;Output:&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%2F7mi9u66s357r4moqdv8i.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%2F7mi9u66s357r4moqdv8i.png" alt=" " width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In databases, B+ Trees are often used for range queries, especially in systems like PostgreSQL.&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_cgpa_bplustree ON Students(cgpa);&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%2F7hkfw9pvlodupu7hbsnw.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%2F7hkfw9pvlodupu7hbsnw.png" alt=" " width="800" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Why B+ Tree?&lt;br&gt;
It stores all values in leaf nodes in sorted order, perfect for range queries like &amp;gt;, &amp;lt;, BETWEEN, etc.&lt;/p&gt;

&lt;p&gt;📈 Step 6: Query Using B+ Tree&lt;/p&gt;

&lt;p&gt;Now, display all students with CGPA greater than 8.0:&lt;/p&gt;

&lt;p&gt;SELECT * FROM Students WHERE cgpa &amp;gt; 8.0;&lt;/p&gt;

&lt;p&gt;Output:&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%2Fdqx53z9xc1ebkpm8lixn.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%2Fdqx53z9xc1ebkpm8lixn.png" alt=" " width="726" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 Query Optimization:&lt;br&gt;
The database engine uses the B+ Tree index to skip lower CGPA values, scanning only relevant entries.&lt;/p&gt;

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

&lt;p&gt;Hash indexes are ideal for equality comparisons (=), such as finding all students from a specific department.&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_dept_hash ON Students USING HASH (dept);&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%2Fyu7iowyscmbwvnkgt6p2.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%2Fyu7iowyscmbwvnkgt6p2.png" alt=" " width="674" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Why Hash Index?&lt;br&gt;
Hashing maps keys directly to fixed locations — it’s extremely fast for equality lookups.&lt;/p&gt;

&lt;p&gt;🧠 Step 8: Query Using Hash Index&lt;/p&gt;

&lt;p&gt;Retrieve all students from the CSBS department:&lt;/p&gt;

&lt;p&gt;SELECT * FROM Students WHERE dept = 'CSBS';&lt;/p&gt;

&lt;p&gt;Output:&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%2Fr1pkgra61y7v2oooh2nw.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%2Fr1pkgra61y7v2oooh2nw.png" alt=" " width="725" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;output:&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%2Fo70mqwnrri949f5d58xr.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%2Fo70mqwnrri949f5d58xr.png" alt=" " width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧠 Final Thoughts&lt;/p&gt;

&lt;p&gt;Indexing and hashing are powerful optimization tools that can drastically improve database performance.&lt;br&gt;
Choosing the right index type based on the query type — equality, range, or sorting — ensures your database runs efficiently even with millions of records.&lt;/p&gt;

&lt;p&gt;💬 Conclusion&lt;/p&gt;

&lt;p&gt;Optimized queries = Faster apps! ⚡&lt;br&gt;
Index smartly, hash wisely, and watch your queries fly 🚀&lt;/p&gt;

</description>
      <category>sql</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building a College Student &amp; Course Management System with SQL</title>
      <dc:creator>Prabavathy Balagurusamy</dc:creator>
      <pubDate>Fri, 22 Aug 2025 04:06:27 +0000</pubDate>
      <link>https://dev.to/prabavathy_balagurusamy_2/building-a-college-student-course-management-system-with-sql-13lc</link>
      <guid>https://dev.to/prabavathy_balagurusamy_2/building-a-college-student-course-management-system-with-sql-13lc</guid>
      <description>&lt;p&gt;In every college, managing students, courses, and enrollments can become a real challenge. From storing student details to tracking who has enrolled in which course, a well-structured database makes life a lot easier. That’s where SQL comes in.&lt;/p&gt;

&lt;p&gt;In this blog, let’s explore how we can design a College Student &amp;amp; Course Management System step by step—with both the concepts and the queries.&lt;/p&gt;

&lt;p&gt;🏗 Designing the Foundation&lt;/p&gt;

&lt;p&gt;We begin by creating the core tables:&lt;/p&gt;

&lt;p&gt;Students Table&lt;br&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;Courses Table&lt;br&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;Enrollments Table (Many-to-Many)&lt;br&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;This setup handles the many-to-many relationship between students and courses.&lt;/p&gt;

&lt;p&gt;🔑 Creating the Faculty Table (DDL)&lt;/p&gt;

&lt;p&gt;We can also add a faculty table to store professors’ details.&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;✍️ Inserting Data (DML)&lt;/p&gt;

&lt;p&gt;Now, let’s add a few student records.&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email) &lt;br&gt;
VALUES (1, 'Arun Kumar', 'CSE', DATE '2002-05-10', '&lt;a href="mailto:arun@example.com"&gt;arun@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email) &lt;br&gt;
VALUES (2, 'Priya Sharma', 'ECE', DATE '2001-11-23', '&lt;a href="mailto:priya@example.com"&gt;priya@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email) &lt;br&gt;
VALUES (3, 'Rahul Singh', 'MECH', DATE '2003-02-15', '&lt;a href="mailto:rahul@example.com"&gt;rahul@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;📞 Altering Tables&lt;/p&gt;

&lt;p&gt;If we need to add phone numbers for students:&lt;/p&gt;

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

&lt;p&gt;✅ Defining Constraints&lt;/p&gt;

&lt;p&gt;We restrict course credits to only 1–5:&lt;/p&gt;

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

&lt;p&gt;🔍 Using Functions&lt;/p&gt;

&lt;p&gt;Let’s see student names in uppercase and find email lengths:&lt;/p&gt;

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

&lt;p&gt;📊 Aggregate Functions&lt;/p&gt;

&lt;p&gt;Some useful statistics:&lt;/p&gt;

&lt;p&gt;-- Average credits of courses&lt;br&gt;
SELECT AVG(Credits) AS AvgCredits FROM Courses;&lt;/p&gt;

&lt;p&gt;-- Total number of students enrolled&lt;br&gt;
SELECT COUNT(DISTINCT StudentID) AS TotalEnrolled &lt;br&gt;
FROM Enrollments;&lt;/p&gt;

&lt;p&gt;🔗 JOIN Operation&lt;/p&gt;

&lt;p&gt;List students with their 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 Enrollments e&lt;br&gt;
JOIN Students s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Courses c ON e.CourseID = c.CourseID;&lt;/p&gt;

&lt;p&gt;📑 Grouping Data&lt;/p&gt;

&lt;p&gt;Count students in each department, showing only those with more than 2:&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;👀 Creating a View&lt;/p&gt;

&lt;p&gt;Simplify repeated queries with a view:&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 Enrollments e&lt;br&gt;
JOIN Students s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Courses c ON e.CourseID = c.CourseID;&lt;/p&gt;

&lt;p&gt;⚡ Stored Procedure&lt;/p&gt;

&lt;p&gt;Automating grade updates:&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;
) 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;br&gt;
/&lt;/p&gt;

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

&lt;p&gt;By building this system, we learned how to:&lt;/p&gt;

&lt;p&gt;✅ Create relational tables (Students, Courses, Enrollments, Faculty)&lt;/p&gt;

&lt;p&gt;✅ Insert, alter, and update records&lt;/p&gt;

&lt;p&gt;✅ Enforce constraints for data integrity&lt;/p&gt;

&lt;p&gt;✅ Use functions and aggregates for insights&lt;/p&gt;

&lt;p&gt;✅ Apply joins and grouping for reports&lt;/p&gt;

&lt;p&gt;✅ Simplify with views&lt;/p&gt;

&lt;p&gt;✅ Automate with stored procedures&lt;/p&gt;

&lt;p&gt;This is a mini real-world academic database project—great practice for students and professionals learning SQL.&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%2Fzfc3b9w3d4ppmrh1pr4q.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%2Fzfc3b9w3d4ppmrh1pr4q.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2F05wxp4zocopxp5wyot2i.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%2F05wxp4zocopxp5wyot2i.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;br&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%2F5hudsuqn9acyt6gwv7ji.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%2F5hudsuqn9acyt6gwv7ji.png" alt=" " width="800" height="388"&gt;&lt;/a&gt;&lt;br&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%2Fa9goqpyi4sns3ouqgtn2.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%2Fa9goqpyi4sns3ouqgtn2.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;br&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%2Fl5vph5zs10bqoykevljq.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%2Fl5vph5zs10bqoykevljq.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
