<?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>Forem: Ramya</title>
    <description>The latest articles on Forem by Ramya (@ramya_ae121b08c2e0f9e215c).</description>
    <link>https://forem.com/ramya_ae121b08c2e0f9e215c</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%2F3453800%2F20054f42-fe87-4f6d-b544-1c491d4f368a.png</url>
      <title>Forem: Ramya</title>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ramya_ae121b08c2e0f9e215c"/>
    <language>en</language>
    <item>
      <title>Mastering MongoDB CRUD with a College Students Collection</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 17:45:14 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/mastering-mongodb-crud-with-a-college-students-collection-51ko</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/mastering-mongodb-crud-with-a-college-students-collection-51ko</guid>
      <description>&lt;p&gt;MongoDB is a dynamic NoSQL database that stores data in flexible, JSON-like documents. In this guide, we’ll dive into CRUD operations — Create, Read, Update, and Delete — using a simple college students collection.&lt;br&gt;
Step 1: Create (Insert)&lt;/p&gt;

&lt;p&gt;Let’s start by adding student records to the students collection. Each document has this structure:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "student_id": "S001",&lt;br&gt;
  "name": "Soniya",&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;Insert five students:&lt;/p&gt;

&lt;p&gt;db.students.insertMany([&lt;br&gt;
  { "student_id": "S001", "name": "Soniya", "age": 20, "department": "CSBS", "year": 2, "cgpa": 9 },&lt;br&gt;
  { "student_id": "S002", "name": "Isha", "age": 21, "department": "CSE", "year": 3, "cgpa": 8.5 },&lt;br&gt;
  { "student_id": "S003", "name": "Sashmi", "age": 22, "department": "ECE", "year": 4, "cgpa": 7.2 },&lt;br&gt;
  { "student_id": "S004", "name": "Priya", "age": 19, "department": "CSBS", "year": 1, "cgpa": 9.3 },&lt;br&gt;
  { "student_id": "S005", "name": "Alice", "age": 20, "department": "Mechanical", "year": 2, "cgpa": 6.8 }&lt;br&gt;
]);&lt;/p&gt;

&lt;p&gt;🔍 Step 2: Read (Query)&lt;/p&gt;

&lt;p&gt;View all student records:&lt;/p&gt;

&lt;p&gt;db.students.find().pretty();&lt;/p&gt;

&lt;p&gt;Find students with CGPA greater than 8:&lt;/p&gt;

&lt;p&gt;db.students.find({ cgpa: { $gt: 8 } }).pretty();&lt;/p&gt;

&lt;p&gt;Find students from the Computer Science department (CSBS):&lt;/p&gt;

&lt;p&gt;db.students.find({ department: "CSBS" }).pretty();&lt;/p&gt;

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

&lt;p&gt;Update the CGPA of a specific student (e.g., student_id = "S002"):&lt;/p&gt;

&lt;p&gt;db.students.updateOne(&lt;br&gt;
  { student_id: "S002" },&lt;br&gt;
  { $set: { cgpa: 8.8 } }&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Increase the year of study for all 3rd-year students by 1:&lt;/p&gt;

&lt;p&gt;db.students.updateMany(&lt;br&gt;
  { year: 3 },&lt;br&gt;
  { $inc: { year: 1 } }&lt;br&gt;
);&lt;/p&gt;

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

&lt;p&gt;Delete a student by student_id (e.g., "S005"):&lt;/p&gt;

&lt;p&gt;db.students.deleteOne({ student_id: "S005" });&lt;/p&gt;

&lt;p&gt;Delete all students with CGPA less than 7.5:&lt;/p&gt;

&lt;p&gt;db.students.deleteMany({ cgpa: { $lt: 7.5 } });&lt;/p&gt;

&lt;p&gt;🧠 Key Takeaways&lt;/p&gt;

&lt;p&gt;Create: Add documents using insertOne or insertMany.&lt;/p&gt;

&lt;p&gt;Read: Query documents using find() with filters.&lt;/p&gt;

&lt;p&gt;Update: Modify single or multiple documents with updateOne/updateMany.&lt;/p&gt;

&lt;p&gt;Delete: Remove documents using deleteOne or deleteMany.&lt;/p&gt;

&lt;p&gt;MongoDB makes managing JSON-like data intuitive and flexible, making it ideal for applications like student management systems.&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%2Fpwjqdj5qhtbw3aibwzkr.jpg" 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%2Fpwjqdj5qhtbw3aibwzkr.jpg" alt=" " width="800" height="346"&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%2Fazie3dnsx0oyiie2frm6.jpg" 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%2Fazie3dnsx0oyiie2frm6.jpg" 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%2F8bl6wcq01ok9m8g9d8dn.jpg" 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%2F8bl6wcq01ok9m8g9d8dn.jpg" alt=" " width="800" height="355"&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%2Fhqxuaasreqar7tp9whh3.jpg" 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%2Fhqxuaasreqar7tp9whh3.jpg" alt=" " width="800" height="361"&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%2Fxoz362d582gp6eg3cohs.jpg" 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%2Fxoz362d582gp6eg3cohs.jpg" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>dbms</category>
      <category>livesql</category>
      <category>oracle</category>
    </item>
    <item>
      <title>Boosting SQL Performance: Indexing &amp; Query Optimization Using a Students Table</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 17:26:03 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/boosting-sql-performance-indexing-query-optimization-using-a-students-table-2l87</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/boosting-sql-performance-indexing-query-optimization-using-a-students-table-2l87</guid>
      <description>&lt;p&gt;Indexes are one of the most effective ways to enhance SQL query performance. In this tutorial, we’ll dive into B-Tree Index, B+ Tree Index, and Hash Index using a simple Students table in Oracle LiveSQL.&lt;/p&gt;

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

&lt;p&gt;Let’s begin by creating a Students table with columns for roll number, name, department, and CGPA:&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
ROLL_NO NUMBER PRIMARY KEY,&lt;br&gt;
NAME VARCHAR2(50),&lt;br&gt;
DEPT VARCHAR2(20),&lt;br&gt;
CGPA NUMBER(3,2)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;💡 Step 2: Add Sample Data&lt;/p&gt;

&lt;p&gt;We’ll insert 20 sample student records across different departments with varying CGPAs:&lt;/p&gt;

&lt;p&gt;INSERT INTO Students VALUES (101, 'Alice', 'CSBS', 8.5);&lt;br&gt;
INSERT INTO Students VALUES (102, 'Bob', 'ECE', 7.9);&lt;br&gt;
INSERT INTO Students VALUES (103, 'Charlie', 'MECH', 8.2);&lt;br&gt;
INSERT INTO Students VALUES (104, 'David', 'CIVIL', 7.0);&lt;br&gt;
INSERT INTO Students VALUES (105, 'Eva', 'CSBS', 9.0);&lt;br&gt;
INSERT INTO Students VALUES (106, 'Frank', 'EEE', 6.8);&lt;br&gt;
INSERT INTO Students VALUES (107, 'Grace', 'ECE', 8.3);&lt;br&gt;
INSERT INTO Students VALUES (108, 'Hank', 'MECH', 7.2);&lt;br&gt;
INSERT INTO Students VALUES (109, 'Ivy', 'CIVIL', 8.1);&lt;br&gt;
INSERT INTO Students VALUES (110, 'Jack', 'CSBS', 9.0);&lt;br&gt;
INSERT INTO Students VALUES (111, 'Kim', 'EEE', 7.5);&lt;br&gt;
INSERT INTO Students VALUES (112, 'Leo', 'CSBS', 9.2);&lt;br&gt;
INSERT INTO Students VALUES (113, 'Mia', 'MECH', 6.9);&lt;br&gt;
INSERT INTO Students VALUES (114, 'Nina', 'ECE', 8.7);&lt;br&gt;
INSERT INTO Students VALUES (115, 'Oscar', 'CSBS', 9.4);&lt;br&gt;
INSERT INTO Students VALUES (116, 'Paul', 'EEE', 7.8);&lt;br&gt;
INSERT INTO Students VALUES (117, 'Quinn', 'MECH', 8.0);&lt;br&gt;
INSERT INTO Students VALUES (118, 'Rose', 'CIVIL', 7.3);&lt;br&gt;
INSERT INTO Students VALUES (119, 'Sam', 'ECE', 8.8);&lt;br&gt;
INSERT INTO Students VALUES (120, 'Tina', 'CSBS', 9.1);&lt;/p&gt;

&lt;p&gt;⚡ Step 3: Implement a B-Tree Index&lt;/p&gt;

&lt;p&gt;B-Tree indexes excel at point queries and range queries:&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_rollno_btree ON Students(ROLL_NO);&lt;/p&gt;

&lt;p&gt;-- Fetch a student with a specific roll number&lt;br&gt;
SELECT * FROM Students WHERE ROLL_NO = 110;&lt;/p&gt;

&lt;p&gt;✅ Output: Jack, CSBS, 9.0&lt;/p&gt;

&lt;p&gt;This index allows the query to run efficiently without scanning the entire table.&lt;/p&gt;

&lt;p&gt;⚡ Step 4: Add a B+ Tree Index on CGPA&lt;/p&gt;

&lt;p&gt;B+ Tree indexes are perfect for range-based queries:&lt;/p&gt;

&lt;p&gt;-- Example: fetch students with CGPA &amp;gt; 8.0&lt;br&gt;
SELECT * FROM Students WHERE CGPA &amp;gt; 8.0;&lt;/p&gt;

&lt;p&gt;The database can quickly locate all students that meet the CGPA condition.&lt;/p&gt;

&lt;p&gt;⚡ Step 5: Create a Hash Index on Department&lt;/p&gt;

&lt;p&gt;Hash indexes are ideal for exact match searches:&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_dept_hash ON Students(DEPT);&lt;/p&gt;

&lt;p&gt;-- Fetch all students from the CSBS department&lt;br&gt;
SELECT * FROM Students WHERE DEPT = 'CSBS';&lt;/p&gt;

&lt;p&gt;✅ Result: All CSBS students are returned efficiently using the hash index.&lt;/p&gt;

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

&lt;p&gt;Indexes are the unsung heroes of SQL performance. Understanding when and how to use B-Tree, B+ Tree, and Hash indexes can make your queries run significantly faster. Efficient indexing is not just a technical optimization—it’s a key skill that sets apart proficient database developers and data engineers. Start experimenting with different index types, and watch your database operations become more streamlined and powerful.&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%2Fucby78uvm28h2g6n1rh8.jpg" 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%2Fucby78uvm28h2g6n1rh8.jpg" alt=" " width="800" height="370"&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%2F8szjdag93lybqc43mdol.jpg" 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%2F8szjdag93lybqc43mdol.jpg" alt=" " width="800" height="377"&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%2F4j9kpkut1jy7mx2ww662.jpg" 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%2F4j9kpkut1jy7mx2ww662.jpg" alt=" " width="800" height="385"&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%2F35z0l2qp95h5tyhtmmhy.jpg" 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%2F35z0l2qp95h5tyhtmmhy.jpg" 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%2Fxoizdwf5y6pyoy4at6bj.jpg" 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%2Fxoizdwf5y6pyoy4at6bj.jpg" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧠 Key Insights&lt;/p&gt;

&lt;p&gt;B-Tree Index: Fast for exact lookups and sorted range queries.&lt;/p&gt;

&lt;p&gt;B+ Tree Index: Optimized for scanning ranges; all values are stored in leaf nodes.&lt;/p&gt;

&lt;p&gt;Hash Index: Best suited for equality searches (e.g., DEPT = 'CSBS').&lt;/p&gt;

&lt;p&gt;Proper indexing can dramatically boost query performance, especially when dealing with large datasets.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>dbms</category>
      <category>livesql</category>
      <category>oracle</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 17:16:09 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/-54m4</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/-54m4</guid>
      <description></description>
    </item>
    <item>
      <title>SQL Essentials: Transactions, Deadlocks, and Recovery Explained</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 17:14:59 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/sql-essentials-transactions-deadlocks-and-recovery-explained-3nc1</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/sql-essentials-transactions-deadlocks-and-recovery-explained-3nc1</guid>
      <description>&lt;p&gt;Databases are designed to remain consistent and reliable, even during complex operations. Mastering concepts like transactions, deadlocks, and log-based recovery is essential for effective database management.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll use a simple Accounts table to demonstrate these concepts.&lt;/p&gt;

&lt;p&gt;Step 1: Create the Accounts Table&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&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES&lt;br&gt;
(1, 'Alice', 1000),&lt;br&gt;
(2, 'Bob', 1500),&lt;br&gt;
(3, 'Charlie', 2000);&lt;/p&gt;

&lt;p&gt;SELECT * FROM Accounts;&lt;/p&gt;

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

&lt;p&gt;acc_no  name    balance&lt;/p&gt;

&lt;p&gt;1   Alice   1000&lt;br&gt;
2   Bob 1500&lt;br&gt;
3   Charlie 2000&lt;/p&gt;

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

&lt;p&gt;Atomicity ensures that a transaction is executed entirely or not at all.&lt;/p&gt;

&lt;p&gt;Example: transferring money from Alice to Bob and rolling it back:&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;/p&gt;

&lt;p&gt;-- Transfer 500 from Alice to Bob&lt;br&gt;
UPDATE Accounts SET balance = balance - 500 WHERE acc_no = 1;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 2;&lt;/p&gt;

&lt;p&gt;-- Cancel the transaction&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;✅ After the rollback, balances remain unchanged, demonstrating no partial updates occur.&lt;/p&gt;




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

&lt;p&gt;Deadlocks occur when two transactions wait indefinitely for each other’s resources.&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 100 WHERE acc_no = 1; -- Locks Alice&lt;br&gt;
UPDATE Accounts SET balance = balance - 100 WHERE acc_no = 2; -- Waits for Bob&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 200 WHERE acc_no = 2; -- Locks Bob&lt;br&gt;
UPDATE Accounts SET balance = balance - 200 WHERE acc_no = 1; -- Waits for Alice&lt;/p&gt;

&lt;p&gt;⏳ Both sessions wait on each other, causing a deadlock. Most DBMS automatically detect and abort one transaction to resolve it.&lt;/p&gt;




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

&lt;p&gt;Databases maintain logs (binary log in MySQL, WAL in PostgreSQL) to recover from failures.&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;/p&gt;

&lt;p&gt;UPDATE Accounts SET balance = balance + 300 WHERE acc_no = 3;&lt;/p&gt;

&lt;p&gt;-- Rollback instead of commit&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;✅ The rollback is recorded in the log. If a crash occurs, the system can undo uncommitted changes and restore consistency.&lt;/p&gt;

&lt;p&gt;Step 1: Create the Accounts Table&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&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES&lt;br&gt;
(1, 'Alice', 1000),&lt;br&gt;
(2, 'Bob', 1500),&lt;br&gt;
(3, 'Charlie', 2000);&lt;/p&gt;

&lt;p&gt;SELECT * FROM Accounts;&lt;/p&gt;

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

&lt;p&gt;acc_no  name    balance&lt;/p&gt;

&lt;p&gt;1   Alice   1000&lt;br&gt;
2   Bob 1500&lt;br&gt;
3   Charlie 2000&lt;/p&gt;




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

&lt;p&gt;Atomicity ensures that a transaction is executed entirely or not at all.&lt;/p&gt;

&lt;p&gt;Example: transferring money from Alice to Bob and rolling it back:&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;/p&gt;

&lt;p&gt;-- Transfer 500 from Alice to Bob&lt;br&gt;
UPDATE Accounts SET balance = balance - 500 WHERE acc_no = 1;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 2;&lt;/p&gt;

&lt;p&gt;-- Cancel the transaction&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;✅ After the rollback, balances remain unchanged, demonstrating no partial updates occur.&lt;/p&gt;




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

&lt;p&gt;Deadlocks occur when two transactions wait indefinitely for each other’s resources.&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 100 WHERE acc_no = 1; -- Locks Alice&lt;br&gt;
UPDATE Accounts SET balance = balance - 100 WHERE acc_no = 2; -- Waits for Bob&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 200 WHERE acc_no = 2; -- Locks Bob&lt;br&gt;
UPDATE Accounts SET balance = balance - 200 WHERE acc_no = 1; -- Waits for Alice&lt;/p&gt;

&lt;p&gt;⏳ Both sessions wait on each other, causing a deadlock. Most DBMS automatically detect and abort one transaction to resolve it.&lt;/p&gt;




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

&lt;p&gt;Databases maintain logs (binary log in MySQL, WAL in PostgreSQL) to recover from failures.&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;/p&gt;

&lt;p&gt;UPDATE Accounts SET balance = balance + 300 WHERE acc_no = 3;&lt;/p&gt;

&lt;p&gt;-- Rollback instead of commit&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;✅ The rollback is recorded in the log. If a crash occurs, the system can undo uncommitted changes and restore consistency.&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%2Frlfe1876597107iot5aq.jpg" 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%2Frlfe1876597107iot5aq.jpg" alt=" " width="800" height="526"&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%2F1deice3vinha2mh9dbwd.jpg" 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%2F1deice3vinha2mh9dbwd.jpg" alt=" " width="800" height="471"&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%2F58s6x4cgvt6847gfuf0h.jpg" 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%2F58s6x4cgvt6847gfuf0h.jpg" alt=" " width="800" height="296"&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%2F4vo8kgr2mflziucn83gc.jpg" 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%2F4vo8kgr2mflziucn83gc.jpg" alt=" " width="800" height="332"&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%2Fdu4fjgk7khxmuzg7p0ho.jpg" 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%2Fdu4fjgk7khxmuzg7p0ho.jpg" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>dbms</category>
      <category>oracle</category>
      <category>livesql</category>
    </item>
    <item>
      <title>Exploring ACID Properties in SQL with Practical Examples</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 16:54:25 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/exploring-acid-properties-in-sql-with-practical-examples-3fgp</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/exploring-acid-properties-in-sql-with-practical-examples-3fgp</guid>
      <description>&lt;p&gt;Ensuring that data remains accurate, reliable, and consistent is at the heart of database systems. This reliability comes from the ACID properties — Atomicity, Consistency, Isolation, and Durability.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore each property using a simple bank Accounts table.&lt;/p&gt;

&lt;p&gt;Step 1: Creating the Accounts Table&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) -- prevents negative balance&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;The CHECK constraint ensures no account can have a negative balance, maintaining data consistency.&lt;/p&gt;

&lt;p&gt;Step 2: Inserting Sample Records&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES (1, 'Alice', 1000);&lt;br&gt;
INSERT INTO Accounts VALUES (2, 'Bob', 1500);&lt;br&gt;
INSERT INTO Accounts VALUES (3, 'Charlie', 2000);&lt;/p&gt;

&lt;p&gt;SELECT * FROM Accounts;&lt;/p&gt;

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

&lt;p&gt;acc_no  name    balance&lt;/p&gt;

&lt;p&gt;1   Alice   1000&lt;br&gt;
2   Bob 1500&lt;br&gt;
3   Charlie 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%2Fm86jabfnrmk2s7kqtbj9.jpg" 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%2Fm86jabfnrmk2s7kqtbj9.jpg" alt=" " width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Atomicity&lt;br&gt;
Atomicity ensures a transaction is all or nothing.&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;/p&gt;

&lt;p&gt;UPDATE Accounts SET balance = balance - 1000 WHERE acc_no = 1;&lt;br&gt;
UPDATE Accounts SET balance = balance + 1000 WHERE acc_no = 2;&lt;/p&gt;

&lt;p&gt;ROLLBACK;&lt;/p&gt;

&lt;p&gt;After rollback, balances return to their original state. ✅ No partial updates occur.&lt;/p&gt;

&lt;p&gt;Step 4: Consistency&lt;br&gt;
Consistency ensures all data follows predefined rules.&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts VALUES (104, 'David', -2000);&lt;/p&gt;

&lt;p&gt;❌ This fails because negative balances are not allowed — maintaining data integrity.&lt;/p&gt;

&lt;p&gt;Step 5: Isolation&lt;br&gt;
Isolation prevents concurrent transactions from interfering with each other.&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 3;&lt;/p&gt;

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

&lt;p&gt;SELECT * FROM Accounts WHERE acc_no = 3;&lt;/p&gt;

&lt;p&gt;Depending on your isolation level, uncommitted changes may or may not be visible.&lt;/p&gt;

&lt;p&gt;Step 6: Durability&lt;br&gt;
Durability ensures that once committed, changes persist, even after system failures.&lt;/p&gt;

&lt;p&gt;START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 2000 WHERE acc_no = 3;&lt;br&gt;
COMMIT;&lt;/p&gt;

&lt;p&gt;✅ After restarting the database, Charlie’s updated balance remains intact.&lt;/p&gt;

&lt;p&gt;ACID properties in action — keeping your data safe, reliable, and consistent.&lt;/p&gt;

&lt;p&gt;🧩Summary :&lt;/p&gt;

&lt;p&gt;Databases rely on ACID properties — Atomicity, Consistency, Isolation, and Durability — to ensure data remains accurate, reliable, and consistent.&lt;/p&gt;

&lt;p&gt;Using a simple bank Accounts table, we can see these principles in action:&lt;/p&gt;

&lt;p&gt;Atomicity: Transactions are all-or-nothing, preventing partial updates.&lt;/p&gt;

&lt;p&gt;Consistency: Data always adheres to predefined rules.&lt;/p&gt;

&lt;p&gt;Isolation: Concurrent transactions don’t interfere with each other.&lt;/p&gt;

&lt;p&gt;Durability: Committed changes are permanent, even after system failures.&lt;/p&gt;

&lt;p&gt;Understanding ACID is essential for building robust and reliable SQL databases.&lt;/p&gt;

</description>
      <category>livesql</category>
      <category>dbms</category>
      <category>database</category>
      <category>oracle</category>
    </item>
    <item>
      <title>Mastering SQL Cursors &amp; Triggers in Oracle</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 16:23:03 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/mastering-sql-cursors-triggers-in-oracle-4h6a</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/mastering-sql-cursors-triggers-in-oracle-4h6a</guid>
      <description>&lt;p&gt;In this post, we’ll dive into two essential SQL concepts:&lt;br&gt;
1️⃣ Using a Cursor with a condition&lt;br&gt;
2️⃣ Implementing an AFTER INSERT Trigger&lt;/p&gt;

&lt;p&gt;All examples are built in Oracle Live SQL.&lt;/p&gt;

&lt;p&gt;🌀 1️⃣ Cursor: List Employees with Salary &amp;gt; 50,000&lt;/p&gt;

&lt;p&gt;A cursor allows you to process query results row by row, giving you precise control over each record.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;DECLARE&lt;br&gt;
  CURSOR emp_cursor IS&lt;br&gt;
    SELECT EmpName, Salary&lt;br&gt;
    FROM Employee&lt;br&gt;
    WHERE Salary &amp;gt; 50000;&lt;/p&gt;

&lt;p&gt;emp_record emp_cursor%ROWTYPE;&lt;br&gt;
BEGIN&lt;br&gt;
  OPEN emp_cursor;&lt;br&gt;
  LOOP&lt;br&gt;
    FETCH emp_cursor INTO emp_record;&lt;br&gt;
    EXIT WHEN emp_cursor%NOTFOUND;&lt;br&gt;
    DBMS_OUTPUT.PUT_LINE('Employee: ' || emp_record.EmpName ||&lt;br&gt;
                         ', Salary: ' || emp_record.Salary);&lt;br&gt;
  END LOOP;&lt;br&gt;
  CLOSE emp_cursor;&lt;br&gt;
END;&lt;br&gt;
/&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;p&gt;CURSOR emp_cursor IS → Defines the query.&lt;/p&gt;

&lt;p&gt;emp_record emp_cursor%ROWTYPE → Creates a record to store each fetched row.&lt;/p&gt;

&lt;p&gt;OPEN, FETCH, CLOSE → Manage cursor operations.&lt;/p&gt;

&lt;p&gt;DBMS_OUTPUT.PUT_LINE → Prints each result.&lt;/p&gt;

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

&lt;p&gt;Employee: Arjun, Salary: 60000&lt;br&gt;
Employee: Kiran, Salary: 80000&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%2Fdxdmywfhmv6475a36bqm.jpg" 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%2Fdxdmywfhmv6475a36bqm.jpg" alt=" " width="800" height="366"&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%2Flfn27ybvnpex561jq23t.jpg" 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%2Flfn27ybvnpex561jq23t.jpg" 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%2Fbnxfer1zsusvyu45kr3i.jpg" 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%2Fbnxfer1zsusvyu45kr3i.jpg" alt=" " width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚡ 2️⃣ AFTER INSERT Trigger: Student Registration Audit&lt;/p&gt;

&lt;p&gt;A trigger automatically runs in response to specific table events.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;CREATE OR REPLACE TRIGGER trg_student_insert&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, StudentName)&lt;br&gt;
  VALUES (:NEW.StudentID, :NEW.StudentName);&lt;br&gt;
END;&lt;br&gt;
/&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;p&gt;AFTER INSERT ON Students → Trigger fires after a new record is inserted.&lt;/p&gt;

&lt;p&gt;:NEW → References the newly inserted row.&lt;/p&gt;

&lt;p&gt;Student_Audit → Automatically logs new student entries.&lt;/p&gt;

&lt;p&gt;Test it:&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, StudentName)&lt;br&gt;
VALUES ('S01', 'Arjun');&lt;/p&gt;

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

&lt;p&gt;Trigger TRG_STUDENT_INSERT compiled&lt;br&gt;
1 row inserted&lt;/p&gt;

&lt;p&gt;✅ A new log entry is now in 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%2Fkzfml9s4506qdz5mfcd9.jpg" 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%2Fkzfml9s4506qdz5mfcd9.jpg" alt=" " width="800" height="377"&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%2Flmtca2idtbb0lu9lw0bw.jpg" 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%2Flmtca2idtbb0lu9lw0bw.jpg" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🏁 Summary&lt;/p&gt;

&lt;p&gt;In this post, we explored SQL Cursors and AFTER INSERT Triggers in Oracle:&lt;/p&gt;

&lt;p&gt;Cursor: Processes query results row by row, allowing precise control over each record. We used it to display employees earning more than ₹50,000.&lt;/p&gt;

&lt;p&gt;Trigger: Automatically executes when a specified database event occurs. We implemented an AFTER INSERT trigger to log new student registrations in an audit table.&lt;/p&gt;

&lt;p&gt;🎯 Key Takeaways&lt;/p&gt;

&lt;p&gt;Feature Purpose Example&lt;/p&gt;

&lt;p&gt;Cursor  Row-by-row processing of query results  List employees with Salary &amp;gt; ₹50,000&lt;br&gt;
Trigger Automatic action after table events Log new student registrations into Student_Audit&lt;/p&gt;

</description>
      <category>sql</category>
      <category>dbms</category>
      <category>livesql</category>
      <category>database</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 16:00:18 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/-2lp4</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/-2lp4</guid>
      <description></description>
    </item>
    <item>
      <title>EXPLORING NORMALIZATION</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Wed, 08 Oct 2025 15:48:44 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/exploring-normalization-28gb</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/exploring-normalization-28gb</guid>
      <description>&lt;p&gt;Database normalization is crucial for eliminating redundancy and preventing anomalies such as insertion, update, and deletion issues. In this guide, we’ll walk through a sample base table, identify its anomalies, and normalize it step by step into 1NF, 2NF, and 3NF using SQL CREATE TABLE statements.&lt;br&gt;
📌 Base Table&lt;/p&gt;

&lt;p&gt;Consider a base table that contains student-course-instructor information:&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%2Fxjeg841hdkhe3wnhgnmg.jpg" 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%2Fxjeg841hdkhe3wnhgnmg.jpg" alt=" " width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚨 Anomalies in the Table&lt;/p&gt;

&lt;p&gt;Insertion Anomaly: Cannot add a new course until a student enrolls.&lt;/p&gt;

&lt;p&gt;Update Anomaly: Changing an instructor’s email requires updating multiple rows.&lt;/p&gt;

&lt;p&gt;Deletion Anomaly: Deleting the last student enrolled in a course removes course and instructor information too.&lt;/p&gt;

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

&lt;p&gt;Goal: Eliminate repeating groups and ensure all attributes have atomic values.&lt;/p&gt;

&lt;p&gt;CREATE TABLE StudentCourses_1NF (&lt;br&gt;
    StudentID INT,&lt;br&gt;
    StudentName VARCHAR(100),&lt;br&gt;
    CourseID VARCHAR(10),&lt;br&gt;
    CourseName VARCHAR(100),&lt;br&gt;
    Instructor VARCHAR(100),&lt;br&gt;
    InstructorEmail VARCHAR(100)&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%2Fceyxy45r8i2c54odaqkb.jpg" 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%2Fceyxy45r8i2c54odaqkb.jpg" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Goal: Remove partial dependency (attributes depending only on part of a composite key).&lt;br&gt;
Separate the table into Students, Courses, and Enrollments:&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
    StudentID INT PRIMARY KEY,&lt;br&gt;
    StudentName VARCHAR(100)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses (&lt;br&gt;
    CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
    CourseName VARCHAR(100),&lt;br&gt;
    Instructor VARCHAR(100),&lt;br&gt;
    InstructorEmail VARCHAR(100)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollments (&lt;br&gt;
    StudentID INT,&lt;br&gt;
    CourseID VARCHAR(10),&lt;br&gt;
    PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
    FOREIGN KEY (StudentID) REFERENCES Students(StudentID),&lt;br&gt;
    FOREIGN KEY (CourseID) REFERENCES Courses(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%2F0gwhuj1otvfckpmy42ms.jpg" 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%2F0gwhuj1otvfckpmy42ms.jpg" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Goal: Remove transitive dependency (e.g., InstructorEmail depends on Instructor, not CourseID).&lt;br&gt;
We create a separate Instructors table:&lt;/p&gt;

&lt;p&gt;CREATE TABLE Instructors (&lt;br&gt;
    InstructorID INT PRIMARY KEY,&lt;br&gt;
    InstructorName VARCHAR(100),&lt;br&gt;
    InstructorEmail VARCHAR(100)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Courses (&lt;br&gt;
    CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
    CourseName VARCHAR(100),&lt;br&gt;
    InstructorID INT,&lt;br&gt;
    FOREIGN KEY (InstructorID) REFERENCES Instructors(InstructorID)&lt;br&gt;
);&lt;br&gt;
📝 Insert Sample Data&lt;/p&gt;

&lt;p&gt;INSERT INTO Students VALUES (1, 'Alice'), (2, 'Bob');&lt;/p&gt;

&lt;p&gt;INSERT INTO Instructors VALUES &lt;br&gt;
    (1, 'Dr. Smith', '&lt;a href="mailto:smith@uni.edu"&gt;smith@uni.edu&lt;/a&gt;'),&lt;br&gt;
    (2, 'Dr. Lee', '&lt;a href="mailto:lee@uni.edu"&gt;lee@uni.edu&lt;/a&gt;'),&lt;br&gt;
    (3, 'Dr. Clark', '&lt;a href="mailto:clark@uni.edu"&gt;clark@uni.edu&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Courses VALUES &lt;br&gt;
    ('C101', 'DBMS', 1),&lt;br&gt;
    ('C102', 'Networks', 2),&lt;br&gt;
    ('C103', 'AI', 3);&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollments VALUES &lt;br&gt;
    (1, 'C101'), &lt;br&gt;
    (2, 'C102'), &lt;br&gt;
    (1, 'C103');&lt;br&gt;
🔗 Query with JOINS&lt;/p&gt;

&lt;p&gt;To list all students along with their courses and instructors:&lt;/p&gt;

&lt;p&gt;SELECT s.StudentName, c.CourseName, i.InstructorName&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;br&gt;
JOIN Instructors 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%2F6jwivsncnp1w1ymm3niz.jpg" 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%2F6jwivsncnp1w1ymm3niz.jpg" 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%2Fwjy8k2y8fkmyhcun61b3.jpg" 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%2Fwjy8k2y8fkmyhcun61b3.jpg" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Key Takeaways&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Normalization reduces redundancy: Properly structured tables save storage and prevent duplicate data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoid anomalies: Normalization prevents insertion, update, and deletion anomalies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step-wise approach:&lt;br&gt;
1NF: Ensures atomic values and removes repeating groups.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2NF: Removes partial dependency by separating data into multiple tables.&lt;/p&gt;

&lt;p&gt;3NF: Eliminates transitive dependency to ensure each attribute depends only on the primary key.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Improved data integrity: Normalized databases are easier to maintain and update.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Joins become powerful: Once normalized, SQL joins can easily combine data across tables for meaningful queries.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>sql</category>
      <category>database</category>
      <category>dbms</category>
      <category>livesql</category>
    </item>
    <item>
      <title>COLLEGE STUDENT AND COURSE MANAGEMENT SYSTEM.</title>
      <dc:creator>Ramya</dc:creator>
      <pubDate>Sat, 23 Aug 2025 05:10:04 +0000</pubDate>
      <link>https://forem.com/ramya_ae121b08c2e0f9e215c/college-student-and-course-management-system-427n</link>
      <guid>https://forem.com/ramya_ae121b08c2e0f9e215c/college-student-and-course-management-system-427n</guid>
      <description>&lt;p&gt;In this blog we are going to Building a Simple Student-Course Management System with Oracle SQL&lt;br&gt;
Managing student enrollments and course information is a common task for educational institutions and developers building academic applications. We'll create tables for students, courses, and enrollments, insert sample data, and explore some interesting queries.&lt;/p&gt;

&lt;p&gt;Step 1: Creating the Tables&lt;br&gt;
We start by creating three tables—Students, Courses, and Enrollments. Each table is designed with appropriate data types, constraints, and relationships.&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
-- Create 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;-- Create 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;-- Create Enrollments table&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;br&gt;
The Students table contains the student's name, department, date of birth, email (unique), and an ID as a primary key.&lt;/p&gt;

&lt;p&gt;The Courses table has course details including credits.&lt;/p&gt;

&lt;p&gt;The Enrollments table records which student is enrolled in which course, along with their grades. It establishes foreign key relationships to ensure referential integrity.&lt;/p&gt;

&lt;p&gt;Step 2: Adding Data Integrity Features&lt;br&gt;
To improve data quality, let’s add a phone number column to Students and a check constraint on the Credits column in Courses:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
-- Add PhoneNo column to Students&lt;br&gt;
ALTER TABLE Students&lt;br&gt;
ADD PhoneNo VARCHAR2(10);&lt;/p&gt;

&lt;p&gt;-- Add check constraint for Credits in Courses (must be 1 to 5)&lt;br&gt;
ALTER TABLE Courses&lt;br&gt;
ADD CHECK (Credits BETWEEN 1 AND 5);&lt;br&gt;
Step 3: Inserting Sample Data&lt;br&gt;
Insert some sample student and course data to work with:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
-- Insert students with different departments&lt;br&gt;
INSERT INTO Students (StudentID, Name, Dept, DOB, Email) VALUES (2, 'TOM HOLLAND', 'ECE', TO_DATE('11/22/2005', 'MM/DD/YYYY'), '&lt;a href="mailto:tom@gmail.com"&gt;tom@gmail.com&lt;/a&gt;');&lt;br&gt;
INSERT INTO Students (StudentID, Name, Dept, DOB, Email) VALUES (3, 'ANDREW', 'IT', TO_DATE('7/9/2008', 'MM/DD/YYYY'), '&lt;a href="mailto:andrew@gmail.com"&gt;andrew@gmail.com&lt;/a&gt;');&lt;br&gt;
INSERT INTO Students (StudentID, Name, Dept, DOB, Email) VALUES (1, 'EMMA', 'CSBS', TO_DATE('3/15/2007', 'MM/DD/YYYY'), '&lt;a href="mailto:emma@gmail.com"&gt;emma@gmail.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;-- Insert courses with credits&lt;br&gt;
INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (101, 'DE', 3);&lt;br&gt;
INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (102, 'CE', 4);&lt;br&gt;
INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (103, 'Data science', 5);&lt;/p&gt;

&lt;p&gt;-- Commit changes&lt;br&gt;
COMMIT;&lt;br&gt;
Step 4: Querying Data with Useful Functions&lt;br&gt;
Some simple queries to analyze the data:&lt;/p&gt;

&lt;p&gt;sql&lt;br&gt;
-- Display student names in uppercase and length of emails&lt;br&gt;
SELECT UPPER(Name) AS Student_Name, LENGTH(Email) AS Email_Length FROM Students;&lt;/p&gt;

&lt;p&gt;-- Show all courses with their credits&lt;br&gt;
SELECT CourseID, CourseName, Credits FROM Courses;&lt;/p&gt;

&lt;p&gt;-- Display all student details, including the new PhoneNo column&lt;br&gt;
SELECT StudentID, Name, Dept, DOB, Email, PhoneNo FROM Students;&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
This simple  database management system covers the  core concepts like table creation with constraints, foreign keys for relationships, data insertion, and basic querying in Oracle 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%2Fnzq7q35wu2s0ilsv8h88.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%2Fnzq7q35wu2s0ilsv8h88.png" alt=" " width="800" height="385"&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%2Faaom9owrwylde8bxcy5t.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%2Faaom9owrwylde8bxcy5t.png" alt=" " width="800" height="400"&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%2Fbux26pwttottsezzgf3t.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%2Fbux26pwttottsezzgf3t.png" alt=" " width="800" height="404"&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%2Fizyextlekudyb9plou05.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%2Fizyextlekudyb9plou05.png" alt=" " width="800" height="406"&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%2Fk9u9ccn4qfv2dogeor5x.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%2Fk9u9ccn4qfv2dogeor5x.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; sir for guiding me.&lt;/p&gt;

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