<?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: Vishnupriya K</title>
    <description>The latest articles on Forem by Vishnupriya K (@vishnupriya_k_678c3b9ea11).</description>
    <link>https://forem.com/vishnupriya_k_678c3b9ea11</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%2F3454507%2F59cc4308-9688-40c3-bab2-d763e964936f.jpg</url>
      <title>Forem: Vishnupriya K</title>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vishnupriya_k_678c3b9ea11"/>
    <language>en</language>
    <item>
      <title>Hands-On with MongoDB: Performing CRUD Operations on a Student Collection 🎓</title>
      <dc:creator>Vishnupriya K</dc:creator>
      <pubDate>Wed, 08 Oct 2025 18:15:23 +0000</pubDate>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11/hands-on-with-mongodb-performing-crud-operations-on-a-student-collection-3855</link>
      <guid>https://forem.com/vishnupriya_k_678c3b9ea11/hands-on-with-mongodb-performing-crud-operations-on-a-student-collection-3855</guid>
      <description>&lt;p&gt;As part of learning MongoDB, I decided to practice CRUD operations (Create, Read, Update, Delete) using a simple student collection. This hands-on approach helped me understand how MongoDB handles data in a flexible, JSON-like format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gain practical experience with MongoDB by performing CRUD operations on a students collection.&lt;/p&gt;

&lt;p&gt;Student schema:&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;1️⃣ Create (Insert)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insert 5 student records using insertOne() or insertMany():&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;db.students.insertOne({ "student_id": "S001", "name": "Santhosh", "age": 20, "department": "CSBS", "year": 2, "cgpa": 9 });&lt;br&gt;
db.students.insertOne({ "student_id": "S002", "name": "Anjali", "age": 21, "department": "CSE", "year": 3, "cgpa": 8.5 });&lt;br&gt;
db.students.insertOne({ "student_id": "S003", "name": "Ravi", "age": 19, "department": "ECE", "year": 1, "cgpa": 7.2 });&lt;br&gt;
db.students.insertOne({ "student_id": "S004", "name": "Meera", "age": 22, "department": "CSE", "year": 3, "cgpa": 9.1 });&lt;br&gt;
db.students.insertOne({ "student_id": "S005", "name": "Karthik", "age": 20, "department": "MECH", "year": 2, "cgpa": 6.8 });&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2️⃣ Read (Query)&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Display all students:&lt;/em&gt;&lt;br&gt;
db.students.find().pretty();&lt;/p&gt;

&lt;p&gt;Students with CGPA &amp;gt; 8:&lt;br&gt;
db.students.find({ "cgpa": { $gt: 8 } }).pretty();&lt;/p&gt;

&lt;p&gt;Students in Computer Science (CSE):&lt;br&gt;
db.students.find({ "department": "CSE" }).pretty();&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3️⃣ Update&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Update CGPA for a student:&lt;/em&gt;&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;Increment year for all 3rd-year students:&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;strong&gt;4️⃣ Delete&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Delete a student by ID:&lt;/em&gt;&lt;br&gt;
db.students.deleteOne({ "student_id": "S005" });&lt;/p&gt;

&lt;p&gt;Delete students with CGPA &amp;lt; 7.5:&lt;br&gt;
db.students.deleteMany({ "cgpa": { $lt: 7.5 } });&lt;/p&gt;

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

&lt;p&gt;This hands-on exercise taught me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How MongoDB manages JSON-like documents.&lt;/li&gt;
&lt;li&gt;Performing CRUD operations is straightforward and powerful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Querying, updating, and deleting data in MongoDB is very flexible compared to traditional SQL.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Practicing with small datasets like a student collection is a great way to build confidence in NoSQL databases.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeau9mm7pqwfkxsvjzho.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%2Fmeau9mm7pqwfkxsvjzho.jpg" alt=" " width="800" height="351"&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%2F3zadrplestxouwwzpgqj.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%2F3zadrplestxouwwzpgqj.jpg" alt=" " width="800" height="348"&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%2Fvfq96xyag1v9xpk29z2d.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%2Fvfq96xyag1v9xpk29z2d.jpg" alt=" " width="800" height="355"&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%2Fxejs5g4jnus1kliwfgap.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%2Fxejs5g4jnus1kliwfgap.jpg" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>mongodb</category>
      <category>database</category>
    </item>
    <item>
      <title>Indexing, Hashing &amp; Query Optimization in SQL</title>
      <dc:creator>Vishnupriya K</dc:creator>
      <pubDate>Sun, 05 Oct 2025 20:59:26 +0000</pubDate>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11/indexing-hashing-query-optimization-in-sql-2cnn</link>
      <guid>https://forem.com/vishnupriya_k_678c3b9ea11/indexing-hashing-query-optimization-in-sql-2cnn</guid>
      <description>&lt;p&gt;Efficient data retrieval is essential for database performance. In this tutorial, we’ll explore B-Tree, B+ Tree, and Hash indexing, and see how they optimize queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create Sample Students Table&lt;/strong&gt;&lt;br&gt;
CREATE TABLE Students (&lt;br&gt;
    roll_no INT 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;&lt;strong&gt;-- Insert 20 sample records&lt;/strong&gt;&lt;br&gt;
INSERT INTO Students VALUES (101, 'Alice', 'CSBS', 9.1);&lt;br&gt;
INSERT INTO Students VALUES (102, 'Bob', 'MECH', 7.8);&lt;br&gt;
INSERT INTO Students VALUES (103, 'Charlie', 'CSBS', 8.5);&lt;br&gt;
INSERT INTO Students VALUES (104, 'David', 'ECE', 8.2);&lt;br&gt;
INSERT INTO Students VALUES (105, 'Eve', 'CSBS', 9.0);&lt;br&gt;
INSERT INTO Students VALUES (106, 'Frank', 'CIVIL', 7.5);&lt;br&gt;
INSERT INTO Students VALUES (107, 'Grace', 'ECE', 8.9);&lt;br&gt;
INSERT INTO Students VALUES (108, 'Hannah', 'CSBS', 9.2);&lt;br&gt;
INSERT INTO Students VALUES (109, 'Ivy', 'MECH', 7.9);&lt;br&gt;
INSERT INTO Students VALUES (110, 'Jack', 'CSBS', 8.6);&lt;br&gt;
INSERT INTO Students VALUES (111, 'Kevin', 'CIVIL', 7.2);&lt;br&gt;
INSERT INTO Students VALUES (112, 'Laura', 'ECE', 8.0);&lt;br&gt;
INSERT INTO Students VALUES (113, 'Mallory', 'CSBS', 8.8);&lt;br&gt;
INSERT INTO Students VALUES (114, 'Nina', 'MECH', 7.7);&lt;br&gt;
INSERT INTO Students VALUES (115, 'Oscar', 'CSBS', 9.3);&lt;br&gt;
INSERT INTO Students VALUES (116, 'Peggy', 'ECE', 8.1);&lt;br&gt;
INSERT INTO Students VALUES (117, 'Quentin', 'CSBS', 8.9);&lt;br&gt;
INSERT INTO Students VALUES (118, 'Rita', 'CIVIL', 7.6);&lt;br&gt;
INSERT INTO Students VALUES (119, 'Steve', 'CSBS', 9.0);&lt;br&gt;
INSERT INTO Students VALUES (120, 'Trudy', 'MECH', 7.8);&lt;/p&gt;

&lt;p&gt;COMMIT;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. B-Tree Index on roll_no&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;B-Tree indexes are ideal for exact match queries.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;-- Create B-Tree index&lt;/em&gt;&lt;br&gt;
CREATE INDEX idx_roll_no ON Students(roll_no);&lt;/p&gt;

&lt;p&gt;&lt;em&gt;-- Query using index&lt;/em&gt;&lt;br&gt;
SELECT * FROM Students&lt;br&gt;
WHERE roll_no = 110;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;✅ Using this index, the database can quickly locate roll_no = 110 without scanning the full table.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. B+ Tree Index on cgpa&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;B+ Tree indexes are great for range queries.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- Create B+ Tree index&lt;br&gt;
CREATE INDEX idx_cgpa ON Students(cgpa);&lt;/p&gt;

&lt;p&gt;-- Query all students with cgpa &amp;gt; 8.0&lt;br&gt;
SELECT * FROM Students&lt;br&gt;
WHERE cgpa &amp;gt; 8.0&lt;br&gt;
ORDER BY cgpa DESC;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Efficiently fetches multiple records in a range.&lt;br&gt;
The ORDER BY clause benefits from B+ Tree’s sequential structure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hash Index on dept&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hash indexes work well for equality lookups on discrete values.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- Create Hash index&lt;br&gt;
CREATE INDEX idx_dept ON Students(dept) LOCAL; -- Oracle supports HASH-like functionality with GLOBAL or partitioned indexes&lt;/p&gt;

&lt;p&gt;-- Query students from 'CSBS' department&lt;br&gt;
SELECT * FROM Students&lt;br&gt;
WHERE dept = 'CSBS';&lt;/p&gt;

&lt;p&gt;&lt;em&gt;✅ Quickly retrieves all students from a specific department without scanning the table.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Query Optimization Tips&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always create indexes on columns used in WHERE, JOIN, or ORDER BY clauses.&lt;/li&gt;
&lt;li&gt;Use B-Tree/B+ Tree for range queries.&lt;/li&gt;
&lt;li&gt;Use Hash indexes for equality searches on high-cardinality columns.&lt;/li&gt;
&lt;li&gt;Check execution plans to ensure queries use indexes effectively.&lt;/li&gt;
&lt;li&gt;Avoid over-indexing — it slows INSERT/UPDATE/DELETE operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Indexing is a key tool for query optimization. B-Tree, B+ Tree, and Hash indexes reduce table scans and improve performance. Combining indexes with query best practices ensures your database is fast and scalable.&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%2F6kcgi76kaplspy2h2vvd.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%2F6kcgi76kaplspy2h2vvd.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%2Fbkjp3caheirsbutfl8t2.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%2Fbkjp3caheirsbutfl8t2.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%2Fzkn7re7v1xvwuoi4khri.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%2Fzkn7re7v1xvwuoi4khri.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%2Fptru3q92zsgtrrmr3t31.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%2Fptru3q92zsgtrrmr3t31.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>indexing</category>
      <category>hashing</category>
      <category>queryoptimization</category>
      <category>livesql</category>
    </item>
    <item>
      <title>Understanding Transactions, Deadlocks &amp; Log-Based Recovery in SQL</title>
      <dc:creator>Vishnupriya K</dc:creator>
      <pubDate>Sun, 05 Oct 2025 20:43:04 +0000</pubDate>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11/understanding-transactions-deadlocks-log-based-recovery-in-sql-1m83</link>
      <guid>https://forem.com/vishnupriya_k_678c3b9ea11/understanding-transactions-deadlocks-log-based-recovery-in-sql-1m83</guid>
      <description>&lt;p&gt;Database reliability is critical for any application. In this tutorial, we’ll explore Transactions, Deadlocks, and Log-Based Recovery using a simple &lt;strong&gt;Accounts&lt;/strong&gt; table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Setup: Accounts Table&lt;/strong&gt;&lt;br&gt;
CREATE TABLE Accounts (&lt;br&gt;
    acc_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR2(50),&lt;br&gt;
    balance INT&lt;br&gt;
);&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;COMMIT;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This table will be used to simulate transactions, deadlocks, and recovery.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Transaction – Atomicity &amp;amp; Rollback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Goal: Transfer 500 from Alice to Bob, then rollback to demonstrate atomicity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- Start transaction&lt;br&gt;
BEGIN&lt;br&gt;
    -- Deduct 500 from Alice&lt;br&gt;
    UPDATE Accounts&lt;br&gt;
    SET balance = balance - 500&lt;br&gt;
    WHERE acc_no = 1;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Add 500 to Bob
UPDATE Accounts
SET balance = balance + 500
WHERE acc_no = 2;

-- Simulate a rollback
ROLLBACK;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;END;&lt;br&gt;
/&lt;/p&gt;

&lt;p&gt;&lt;em&gt;✅ Check balances:&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Balances remain unchanged. No partial update occurred — atomicity is preserved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Deadlock Simulation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Goal: Demonstrate a deadlock scenario with two sessions.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;-- Lock Alice’s account&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance + 100&lt;br&gt;
WHERE acc_no = 1;&lt;/p&gt;

&lt;p&gt;-- Pause before committing (wait)&lt;/p&gt;

&lt;p&gt;Session 2 (simultaneously):&lt;/p&gt;

&lt;p&gt;-- Lock Bob’s account&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance - 50&lt;br&gt;
WHERE acc_no = 2;&lt;/p&gt;

&lt;p&gt;-- Now try to update Alice’s account&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance - 100&lt;br&gt;
WHERE acc_no = 1;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Both sessions are waiting for the other to release locks → deadlock occurs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most DBMS detect deadlocks and abort one transaction to resolve it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaway:&lt;/strong&gt; Always acquire locks in the same order to avoid deadlocks in multi-session environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Log-Based Recovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Goal: Ensure database can undo changes after rollback using logs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In Oracle, all transactions are automatically logged in the Redo Log.&lt;/p&gt;

&lt;p&gt;In MySQL/PostgreSQL, binary logs / WAL (Write-Ahead Log) track all changes.&lt;/p&gt;

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

&lt;p&gt;BEGIN&lt;br&gt;
    UPDATE Accounts&lt;br&gt;
    SET balance = balance + 200&lt;br&gt;
    WHERE acc_no = 3;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROLLBACK; -- Undo the update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;END;&lt;br&gt;
/&lt;/p&gt;

&lt;p&gt;Check logs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle: V$LOGMNR_CONTENTS or redo logs capture the undo operation.&lt;/li&gt;
&lt;li&gt;MySQL: Binary log will record both the original update and rollback action
.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Log ensures database can recover from failures without losing consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Summary&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Concept    Explanation&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transaction (Atomicity)&lt;/strong&gt;   Either all operations succeed or none; rollback prevents partial updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadlock&lt;/strong&gt;  Two sessions waiting for each other’s locks; resolved by DBMS aborting one transaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log-Based Recovery&lt;/strong&gt;    Logs record changes so rollback and crash recovery are possible.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;By understanding transactions, deadlocks, and log-based recovery, you can ensure your database remains reliable, consistent, and recoverable. Always test transactions carefully, handle deadlocks gracefully, and leverage logging for safety.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Tip: Simulate deadlocks in a controlled environment to learn how your DBMS resolves them. This is essential for multi-user applications.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexbvdywcqd9o7znl7osv.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%2Fexbvdywcqd9o7znl7osv.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%2Fwtvpyg4vns97bxahnk46.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%2Fwtvpyg4vns97bxahnk46.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%2Ffcguhwy80n6i9i0fz8e5.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%2Ffcguhwy80n6i9i0fz8e5.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%2F9m12ez5yvjfpcadjk93z.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%2F9m12ez5yvjfpcadjk93z.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%2Frgvjwf9tj17cs6tpvcg3.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%2Frgvjwf9tj17cs6tpvcg3.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>transactions</category>
      <category>deadlocks</category>
      <category>livesql</category>
    </item>
    <item>
      <title>Understanding ACID Properties in SQL with Examples</title>
      <dc:creator>Vishnupriya K</dc:creator>
      <pubDate>Sun, 05 Oct 2025 20:29:04 +0000</pubDate>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11/understanding-acid-properties-in-sql-with-examples-24l4</link>
      <guid>https://forem.com/vishnupriya_k_678c3b9ea11/understanding-acid-properties-in-sql-with-examples-24l4</guid>
      <description>&lt;p&gt;ACID properties — Atomicity, Consistency, Isolation, Durability — ensure that database transactions are reliable, safe, and predictable. Let’s explore them with a practical Accounts table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create Sample Accounts Table&lt;/strong&gt;&lt;br&gt;
CREATE TABLE Accounts (&lt;br&gt;
    acc_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR2(50),&lt;br&gt;
    balance INT CHECK (balance &amp;gt;= 0) -- enforce positive balance&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insert sample data&lt;/em&gt;&lt;br&gt;
INSERT INTO Accounts VALUES (101, 'Alice', 5000);&lt;br&gt;
INSERT INTO Accounts VALUES (102, 'Bob', 3000);&lt;br&gt;
INSERT INTO Accounts VALUES (103, 'Charlie', 7000);&lt;/p&gt;

&lt;p&gt;COMMIT;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Atomicity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Definition: Either all operations in a transaction succeed, or none do.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Transfer 1000 from Alice to Bob, but simulate a failure midway.&lt;/p&gt;

&lt;p&gt;-- Start transaction&lt;br&gt;
BEGIN&lt;br&gt;
    -- Deduct 1000 from Alice&lt;br&gt;
    UPDATE Accounts&lt;br&gt;
    SET balance = balance - 1000&lt;br&gt;
    WHERE acc_no = 101;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Simulate error (e.g., divide by zero)
-- This will cause the transaction to fail
-- Uncomment the following line to simulate failure
-- DECLARE x NUMBER := 1/0; END;

-- Add 1000 to Bob
UPDATE Accounts
SET balance = balance + 1000
WHERE acc_no = 102;

COMMIT; -- Will not reach here if error occurs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;EXCEPTION&lt;br&gt;
    WHEN OTHERS THEN&lt;br&gt;
        ROLLBACK; -- Ensures no partial update&lt;br&gt;
        DBMS_OUTPUT.PUT_LINE('Transaction failed, rolled back.');&lt;br&gt;
END;&lt;br&gt;
/&lt;br&gt;
&lt;strong&gt;✅ After rollback, balances remain unchanged — Atomicity is maintained.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Consistency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Definition: Transactions must leave the database in a valid state.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Try inserting a negative balance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-- This will fail due to the CHECK constraint&lt;/strong&gt;&lt;br&gt;
INSERT INTO Accounts VALUES (104, 'David', -500);&lt;/p&gt;

&lt;p&gt;The database rejects this, ensuring Consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Isolation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Definition: Concurrent transactions should not interfere with each other.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Two sessions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 1: Update Alice’s balance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UPDATE Accounts&lt;br&gt;
SET balance = balance + 2000&lt;br&gt;
WHERE acc_no = 101;&lt;br&gt;
-- Do not commit yet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 2: Read Alice’s balance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SELECT balance FROM Accounts WHERE acc_no = 101;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Session 2 will not see the uncommitted change (depending on isolation level, default is READ COMMITTED).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This prevents dirty reads — demonstrating Isolation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Durability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Definition: Once a transaction is committed, data persists even after a crash.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-- Commit a transaction&lt;br&gt;
UPDATE Accounts&lt;br&gt;
SET balance = balance + 1000&lt;br&gt;
WHERE acc_no = 102;&lt;/p&gt;

&lt;p&gt;COMMIT;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Restart the database&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run:&lt;/strong&gt;&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changes persist — Durability is guaranteed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary Table&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;ACID Property&lt;/strong&gt;   &lt;strong&gt;Example Action&lt;/strong&gt;&lt;br&gt;
Atomicity   Transfer money → rollback on error&lt;br&gt;
Consistency CHECK constraint prevents negative balance&lt;br&gt;
Isolation   Concurrent reads/writes don’t interfere&lt;br&gt;
Durability  Committed changes persist after DB restart&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡Tip: Try changing isolation levels (READ COMMITTED, SERIALIZABLE) to observe how concurrent transactions behave differently.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbau25zxjkpv58sq9ga7.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%2Fdbau25zxjkpv58sq9ga7.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%2Fb5lmz281nw7kcec3nx26.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%2Fb5lmz281nw7kcec3nx26.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%2F8ohhywzs3ao7of7ocwzb.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%2F8ohhywzs3ao7of7ocwzb.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%2F5lh98kqxyi6my1banwg2.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%2F5lh98kqxyi6my1banwg2.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%2F51du03mt52w8zyi7dao4.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%2F51du03mt52w8zyi7dao4.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%2F7z3p8l6n6yj7f0edwzhc.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%2F7z3p8l6n6yj7f0edwzhc.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>acid</category>
      <category>dbms</category>
      <category>livesql</category>
    </item>
    <item>
      <title>Mastering Oracle SQL: Cursor and Trigger Examples</title>
      <dc:creator>Vishnupriya K</dc:creator>
      <pubDate>Sun, 05 Oct 2025 20:13:13 +0000</pubDate>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11/mastering-oracle-sql-cursor-and-trigger-examples-3h31</link>
      <guid>https://forem.com/vishnupriya_k_678c3b9ea11/mastering-oracle-sql-cursor-and-trigger-examples-3h31</guid>
      <description>&lt;p&gt;Oracle SQL provides powerful features to automate and process data efficiently. In this post, we will explore Cursors and Triggers with practical examples that you can implement right away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Cursors in Oracle SQL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A cursor is a pointer to a result set of a query. It allows you to process rows one by one in PL/SQL. Cursors are especially useful when you want to perform operations conditionally on each row.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Display employees with salary &amp;gt; 50,000&lt;/strong&gt;&lt;br&gt;
DECLARE&lt;br&gt;
    CURSOR emp_cursor IS&lt;br&gt;
        SELECT EmployeeName, Salary&lt;br&gt;
        FROM Employee&lt;br&gt;
        WHERE Salary &amp;gt; 50000;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;emp_record emp_cursor%ROWTYPE;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&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.EmployeeName || ' | 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;&lt;strong&gt;✅ This code will output employees whose salary exceeds 50,000.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key points&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CURSOR emp_cursor IS … defines the cursor.&lt;/li&gt;
&lt;li&gt;FETCH emp_cursor INTO … retrieves one row at a time.&lt;/li&gt;
&lt;li&gt;emp_cursor%NOTFOUND checks if all rows are processed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Triggers in Oracle SQL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A trigger is a stored PL/SQL block that automatically executes in response to DML events (INSERT, UPDATE, DELETE) on a table. Triggers are ideal for auditing, validation, or automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Automatically log new student registrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We want to track student registrations in a separate Student_Audit table whenever a new student is added.&lt;/p&gt;

&lt;p&gt;CREATE OR REPLACE TRIGGER trg_student_audit&lt;br&gt;
AFTER INSERT ON Student&lt;br&gt;
FOR EACH ROW&lt;br&gt;
BEGIN&lt;br&gt;
    INSERT INTO Student_Audit(AuditID, StudentID, StudentName, RegistrationDate)&lt;br&gt;
    VALUES (seq_audit_id.NEXTVAL, :NEW.StudentID, :NEW.StudentName, SYSDATE);&lt;br&gt;
END;&lt;br&gt;
/&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;AFTER INSERT ON Student → Trigger fires after a new student is added.&lt;/li&gt;
&lt;li&gt;FOR EACH ROW → Executes for every row inserted.&lt;/li&gt;
&lt;li&gt;:NEW → References the new record being inserted.&lt;/li&gt;
&lt;li&gt;Student_Audit automatically logs the student’s details with a timestamp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Benefits of Using Cursors and Triggers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor    Process query results row by row, implement conditional logic, and automate complex tasks.&lt;/li&gt;
&lt;li&gt;Trigger   Automatically maintain audit logs, enforce rules, and reduce manual tasks.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Cursors and triggers are essential tools for any Oracle SQL developer. With cursors, you can handle row-level operations efficiently, while triggers help maintain data integrity and automation.&lt;/p&gt;

&lt;p&gt;Start experimenting with your own tables and see how these features can save time and reduce errors in real-world applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Tip: Combine cursors and triggers to build advanced automation, like automatically processing data after insert or update events.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1cqsnamjfd73ph6n2bb.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%2Fw1cqsnamjfd73ph6n2bb.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%2Fyvnzjna01nojms5abl4r.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%2Fyvnzjna01nojms5abl4r.png" alt=" " width="800" height="450"&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%2Ffkkgrnys0l9ab4lprb7w.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%2Ffkkgrnys0l9ab4lprb7w.png" alt=" " width="800" height="450"&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%2Flheisx93n0ixkdbf3p2y.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%2Flheisx93n0ixkdbf3p2y.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cursor</category>
      <category>trigger</category>
      <category>oraclelivesql</category>
    </item>
    <item>
      <title>🚀 Understanding Database Normalization (1NF, 2NF, 3NF) with Oracle SQL — Step-by-Step Example</title>
      <dc:creator>Vishnupriya K</dc:creator>
      <pubDate>Sun, 05 Oct 2025 19:57:24 +0000</pubDate>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11/understanding-database-normalization-1nf-2nf-3nf-with-oracle-sql-step-by-step-example-1hf5</link>
      <guid>https://forem.com/vishnupriya_k_678c3b9ea11/understanding-database-normalization-1nf-2nf-3nf-with-oracle-sql-step-by-step-example-1hf5</guid>
      <description>&lt;p&gt;Database normalization is one of the most important concepts in DBMS. It helps in reducing redundancy and improving data integrity.&lt;br&gt;
In this post, let’s understand 1NF, 2NF, and 3NF using a simple real-world example — and implement everything using Oracle Live SQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧩The Base Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ll start with this unnormalized table:&lt;/p&gt;

&lt;p&gt;StudentID   StudentName CourseID    CourseName  Instructor  InstructorPhone&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;⚠️ Step 1 — Identify Anomalies&lt;/p&gt;

&lt;p&gt;In the base table, we can observe three major problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔸 Insertion Anomaly&lt;/strong&gt;&lt;br&gt;
You cannot insert a new course unless a student enrolls in it.&lt;br&gt;
&lt;strong&gt;🔸 Update Anomaly&lt;/strong&gt;&lt;br&gt;
If Dr. Kumar changes his phone number, we must update it in multiple rows.&lt;br&gt;
&lt;strong&gt;🔸 Deletion Anomaly&lt;/strong&gt;&lt;br&gt;
If all students drop the “AI” course, we lose Dr. Rao’s details completely.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So, let’s fix these issues one normalization step at a time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧱 Step 2 — Convert to 1NF (First Normal Form)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt;&lt;br&gt;
Each cell must contain only atomic (single) values — no repeating groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Our base table already satisfies 1NF, but we’ll create it formally in SQL.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE BaseTable (&lt;br&gt;
  StudentID VARCHAR2(10),&lt;br&gt;
  StudentName VARCHAR2(50),&lt;br&gt;
  CourseID VARCHAR2(10),&lt;br&gt;
  CourseName VARCHAR2(50),&lt;br&gt;
  Instructor VARCHAR2(50),&lt;br&gt;
  InstructorPhone VARCHAR2(15)&lt;br&gt;
);&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt;&lt;br&gt;
Remove partial dependencies — no non-key attribute should depend on part of a composite key.&lt;/p&gt;

&lt;p&gt;Here, the composite key is (StudentID, CourseID).&lt;/p&gt;

&lt;p&gt;We separate the data into three smaller tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Student&lt;/li&gt;
&lt;li&gt;Course&lt;/li&gt;
&lt;li&gt;Enrollment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CREATE TABLE Student (&lt;br&gt;
  StudentID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
  StudentName VARCHAR2(50)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Course (&lt;br&gt;
  CourseID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR2(50),&lt;br&gt;
  Instructor VARCHAR2(50),&lt;br&gt;
  InstructorPhone VARCHAR2(15)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Enrollment (&lt;br&gt;
  StudentID VARCHAR2(10),&lt;br&gt;
  CourseID VARCHAR2(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;em&gt;Now, data redundancy is reduced — but we can still do better!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧠 Step 4 — Convert to 3NF (Third Normal Form)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Remove transitive dependencies&lt;/strong&gt; — non-key attributes should not depend on other non-key attributes.&lt;/p&gt;

&lt;p&gt;Here, InstructorPhone depends on Instructor, not on CourseID.&lt;br&gt;
So, we’ll create a separate Instructor table and link it to Course via an InstructorID.&lt;/p&gt;

&lt;p&gt;CREATE TABLE Instructor (&lt;br&gt;
  InstructorID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
  InstructorName VARCHAR2(50),&lt;br&gt;
  InstructorPhone VARCHAR2(15)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Course (&lt;br&gt;
  CourseID VARCHAR2(10) PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR2(50),&lt;br&gt;
  InstructorID VARCHAR2(10),&lt;br&gt;
  FOREIGN KEY (InstructorID) REFERENCES Instructor(InstructorID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧾 Step 5 — Final 3NF Schema Diagram&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Student(StudentID, StudentName)&lt;/li&gt;
&lt;li&gt;Instructor(InstructorID, InstructorName, InstructorPhone)&lt;/li&gt;
&lt;li&gt;Course(CourseID, CourseName, InstructorID)&lt;/li&gt;
&lt;li&gt;Enrollment(EnrollID, StudentID, CourseID)
This structure removes redundancy completely and makes the database consistent and scalable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🧩 Step 6 — Sample Data Insertion&lt;/strong&gt;&lt;br&gt;
INSERT INTO Student VALUES ('S01', 'Arjun');&lt;br&gt;
INSERT INTO Student VALUES ('S02', 'Priya');&lt;br&gt;
INSERT INTO Student VALUES ('S03', 'Kiran');&lt;/p&gt;

&lt;p&gt;INSERT INTO Instructor VALUES ('I01', 'Dr. Kumar', '9876543210');&lt;br&gt;
INSERT INTO Instructor VALUES ('I02', 'Dr. Mehta', '9123456780');&lt;br&gt;
INSERT INTO Instructor VALUES ('I03', 'Dr. Rao', '9988776655');&lt;/p&gt;

&lt;p&gt;INSERT INTO Course VALUES ('C101', 'DBMS', 'I01');&lt;br&gt;
INSERT INTO Course VALUES ('C102', 'Data Mining', 'I02');&lt;br&gt;
INSERT INTO Course VALUES ('C103', 'AI', 'I03');&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollment (StudentID, CourseID) VALUES ('S01', 'C101');&lt;br&gt;
INSERT INTO Enrollment (StudentID, CourseID) VALUES ('S01', 'C102');&lt;br&gt;
INSERT INTO Enrollment (StudentID, CourseID) VALUES ('S02', 'C101');&lt;br&gt;
INSERT INTO Enrollment (StudentID, CourseID) VALUES ('S03', 'C103');&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔍 Step 7 — Display Data using JOINs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, we can easily query all students, their courses, and their instructors:&lt;/p&gt;

&lt;p&gt;SELECT &lt;br&gt;
  s.StudentID,&lt;br&gt;
  s.StudentName,&lt;br&gt;
  c.CourseName,&lt;br&gt;
  i.InstructorName,&lt;br&gt;
  i.InstructorPhone&lt;br&gt;
FROM Enrollment e&lt;br&gt;
JOIN Student s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Course c ON e.CourseID = c.CourseID&lt;br&gt;
JOIN Instructor i ON c.InstructorID = i.InstructorID;&lt;/p&gt;

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

&lt;p&gt;StudentID   StudentName CourseName  InstructorName  InstructorPhone&lt;br&gt;
S01 Arjun   DBMS    Dr. Kumar   9876543210&lt;br&gt;
S01 Arjun   Data Mining Dr. Mehta   9123456780&lt;br&gt;
S02 Priya   DBMS    Dr. Kumar   9876543210&lt;br&gt;
S03 Kiran   AI  Dr. Rao 9988776655&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Through normalization:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data redundancy is minimized&lt;/li&gt;
&lt;li&gt;Update, insertion, and deletion anomalies are eliminated&lt;/li&gt;
&lt;li&gt;The database becomes more reliable and scalable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;By implementing these steps in Oracle Live SQL, you can clearly visualize how normalization improves your database structure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A special thanks to &lt;a class="mentioned-user" href="https://dev.to/santhoshnc"&gt;@santhoshnc&lt;/a&gt; sir for mentoring me on these Normalisation topics!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dxnj659vwrt9xamuc5c.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%2F7dxnj659vwrt9xamuc5c.png" alt=" " width="800" height="450"&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%2Fm98wtdceyatxe8bubmjy.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%2Fm98wtdceyatxe8bubmjy.png" alt=" " width="800" height="450"&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%2Fnwsk5k35ln1gap87k2b6.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%2Fnwsk5k35ln1gap87k2b6.png" alt=" " width="800" height="450"&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%2Fedk36nbeabpi8r2nxpz1.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%2Fedk36nbeabpi8r2nxpz1.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>database</category>
      <category>tutorial</category>
      <category>sql</category>
    </item>
    <item>
      <title>College Student &amp; Course Management System (Oracle LiveSQL)</title>
      <dc:creator>Vishnupriya K</dc:creator>
      <pubDate>Sat, 23 Aug 2025 13:15:17 +0000</pubDate>
      <link>https://forem.com/vishnupriya_k_678c3b9ea11/college-student-course-management-system-oracle-livesql-40p4</link>
      <guid>https://forem.com/vishnupriya_k_678c3b9ea11/college-student-course-management-system-oracle-livesql-40p4</guid>
      <description>&lt;h1&gt;
  
  
  sql #oracle #database #tutorial
&lt;/h1&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;This blog covers my hands-on implementation of a simple College Student &amp;amp; Course Management System using SQL on Oracle LiveSQL.&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Table creation&lt;/li&gt;
&lt;li&gt;Data insertion&lt;/li&gt;
&lt;li&gt;Constraints &amp;amp; table alterations&lt;/li&gt;
&lt;li&gt;SQL queries with string functions &amp;amp; aggregates&lt;/li&gt;
&lt;li&gt;Joins&lt;/li&gt;
&lt;li&gt;Views&lt;/li&gt;
&lt;li&gt;Grouping with HAVING&lt;/li&gt;
&lt;li&gt;Stored procedure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This use case manages students, faculty, courses, and enrollments in a college database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Database Schema
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;I created four main tables:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Students Table&lt;/strong&gt;&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;&lt;strong&gt;Courses Table&lt;/strong&gt;&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;&lt;strong&gt;Enrollments Table&lt;/strong&gt;&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;&lt;strong&gt;Faculty Table&lt;/strong&gt;&lt;br&gt;
CREATE TABLE Faculty (&lt;br&gt;
    FacultyID NUMBER PRIMARY KEY,&lt;br&gt;
    FacultyName VARCHAR2(50) NOT NULL,&lt;br&gt;
    Dept VARCHAR2(30),&lt;br&gt;
    Email VARCHAR2(50) UNIQUE&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Insertion&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Students&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (1, 'Arun Kumar', 'Computer Science', TO_DATE('2002-08-15','YYYY-MM-DD'), '&lt;a href="mailto:arun.kumar@example.com"&gt;arun.kumar@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (2, 'Divya R', 'Electronics', TO_DATE('2001-10-22','YYYY-MM-DD'), '&lt;a href="mailto:divya.r@example.com"&gt;divya.r@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (3, 'Mohan S', 'Mechanical', TO_DATE('2003-01-05','YYYY-MM-DD'), '&lt;a href="mailto:mohan.s@example.com"&gt;mohan.s@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Courses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (101, 'Databases', 4);&lt;/p&gt;

&lt;p&gt;INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (102, 'Algorithms', 3);&lt;/p&gt;

&lt;p&gt;INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (103, 'Physics', 5);&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enrollments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade)&lt;br&gt;
VALUES (1, 1, 101, 'A');&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade)&lt;br&gt;
VALUES (2, 2, 102, 'B+');&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade)&lt;br&gt;
VALUES (3, 3, 103, 'A-');&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table Alterations &amp;amp; Constraints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Add PhoneNo to Students&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Add Credits Constraint to Courses&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;SQL Queries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Uppercase Names &amp;amp; Email Length&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Department-wise Student Count (&amp;gt;2 only)&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Average Credits &amp;amp; Total Enrolled Students&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;SELECT&lt;br&gt;
   (SELECT AVG(Credits) FROM Courses) AS AvgCredits,&lt;br&gt;
   (SELECT COUNT(DISTINCT StudentID) FROM Enrollments) AS TotalStudentsEnrolled&lt;br&gt;
FROM dual;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Joins&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Show student-course-grade details:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Views&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Created a view to simplify lookups:&lt;/em&gt;&lt;/p&gt;

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

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

&lt;p&gt;Procedure to update a student’s grade:&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 AND CourseID = p_CourseID;&lt;br&gt;
    COMMIT;&lt;br&gt;
END;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Through this system, I learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating tables with constraints&lt;/li&gt;
&lt;li&gt;Inserting and managing data&lt;/li&gt;
&lt;li&gt;Using string &amp;amp; aggregate functions&lt;/li&gt;
&lt;li&gt;Applying JOIN, GROUP BY, HAVING&lt;/li&gt;
&lt;li&gt;Building views for easier queries&lt;/li&gt;
&lt;li&gt;Writing stored procedures for updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;This small project gave me strong practice in Oracle SQL and reinforced database concepts 💡.&lt;/strong&gt;
&lt;/h2&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%2F20u87fwszw6fmmkmujt7.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%2F20u87fwszw6fmmkmujt7.png" alt=" " width="800" height="435"&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%2Fpjh2twfvkle1e3io21h9.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%2Fpjh2twfvkle1e3io21h9.png" alt=" " width="800" height="432"&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%2Fto6dqc34jruh5cqxcrn9.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%2Fto6dqc34jruh5cqxcrn9.png" alt=" " width="800" height="431"&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%2Fmknl35jv7aiigkgtdtav.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%2Fmknl35jv7aiigkgtdtav.png" alt=" " width="800" height="432"&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%2Fsbuqgbbqphpu2y28cfuo.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%2Fsbuqgbbqphpu2y28cfuo.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

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