<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Prabanjan B</title>
    <description>The latest articles on DEV Community by Prabanjan B (@pjn_b_e25b30362b3f8ceef1d).</description>
    <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d</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%2F3449178%2F14cf29f2-4e57-4ed4-ae86-c2399fd8aa9c.png</url>
      <title>DEV Community: Prabanjan B</title>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pjn_b_e25b30362b3f8ceef1d"/>
    <language>en</language>
    <item>
      <title>Hands-On MongoDB CRUD Operations with a College Student Sche</title>
      <dc:creator>Prabanjan B</dc:creator>
      <pubDate>Sun, 05 Oct 2025 04:34:04 +0000</pubDate>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d/hands-on-mongodb-crud-operations-with-a-college-student-sche-1gg5</link>
      <guid>https://dev.to/pjn_b_e25b30362b3f8ceef1d/hands-on-mongodb-crud-operations-with-a-college-student-sche-1gg5</guid>
      <description>&lt;p&gt;MongoDB is a powerful NoSQL database that allows flexible storage of JSON-like documents. In this blog, we’ll explore CRUD operations — Create, Read, Update, and Delete — using a simple college students collection.&lt;/p&gt;




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

&lt;p&gt;We start by inserting student records into the students collection. Each document follows 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;ol&gt;
&lt;li&gt;Display all student records:&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;Find students with CGPA &amp;gt; 8:&lt;/li&gt;
&lt;/ol&gt;

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

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

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




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

&lt;ol&gt;
&lt;li&gt;Update CGPA of a specific student (e.g., student_id = "S002"):&lt;/li&gt;
&lt;/ol&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;ol&gt;
&lt;li&gt;Increase the year of study for all 3rd year students by 1:&lt;/li&gt;
&lt;/ol&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;ol&gt;
&lt;li&gt;Delete a student by student_id (e.g., "S005"):&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;Delete all students with CGPA &amp;lt; 7.5:&lt;/li&gt;
&lt;/ol&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: Insert documents using insertOne or insertMany.&lt;/p&gt;

&lt;p&gt;Read: Use find with filters to query documents.&lt;/p&gt;

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

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

&lt;p&gt;MongoDB makes CRUD operations intuitive and flexible, especially for JSON-like data structures, making it perfect for applications like student management systems.&lt;/p&gt;




&lt;p&gt;Next Steps&lt;/p&gt;

&lt;p&gt;Take screenshots of your execution in MongoDB Atlas.&lt;/p&gt;

&lt;p&gt;Export the final students collection as JSON or CSV for backup or further analysis.&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%2Fjs89hceqg51dmis08vj1.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%2Fjs89hceqg51dmis08vj1.png" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read (Query)&lt;/p&gt;

&lt;p&gt;A.Display all students&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%2Fbdex9vr568m9xxzy8fg4.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%2Fbdex9vr568m9xxzy8fg4.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Students with CGPA &amp;gt; 8&lt;/p&gt;

&lt;p&gt;{ "cgpa": { "$gt": 8 } }&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%2Fyznvi0oovcdxooctkgub.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%2Fyznvi0oovcdxooctkgub.png" alt=" " width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Students in CSBS department&lt;/p&gt;

&lt;p&gt;{ "department": { "$in": ["CSBS"] } }&lt;/p&gt;

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

&lt;p&gt;Update&lt;/p&gt;

&lt;p&gt;A.Update CGPA of a specific student (S002)&lt;br&gt;
{ "student_id": "S002" }&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%2Fupb6hnefopuqiccwu5ok.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%2Fupb6hnefopuqiccwu5ok.png" alt=" " width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Increase year of all 3rd year students by 1&lt;br&gt;
{ "year": 3 }&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%2Fzjw5xv7t8rhkxbqxxqqq.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%2Fzjw5xv7t8rhkxbqxxqqq.png" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Delete&lt;/p&gt;

&lt;p&gt;A. Delete one student by student_id (S005)&lt;/p&gt;

&lt;p&gt;{ "student_id": "S004" }&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%2Fkxa1qfyvpra96urdhjzm.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%2Fkxa1qfyvpra96urdhjzm.png" alt=" " width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;B. Delete all students with CGPA &amp;lt; 7.5&lt;/p&gt;

&lt;p&gt;{ "cgpa": { "$lt": 7.5 } }&lt;/p&gt;

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




&lt;h1&gt;
  
  
  MongoDB #NoSQL #CRUD #DatabaseLearning #DataEngineering #DevCommunity
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>SQL Indexing, Hashing &amp; Query Optimization with a Students Table</title>
      <dc:creator>Prabanjan B</dc:creator>
      <pubDate>Sun, 05 Oct 2025 04:16:56 +0000</pubDate>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d/sql-indexing-hashing-query-optimization-with-a-students-table-1k8o</link>
      <guid>https://dev.to/pjn_b_e25b30362b3f8ceef1d/sql-indexing-hashing-query-optimization-with-a-students-table-1k8o</guid>
      <description>&lt;p&gt;Indexes are one of the most powerful tools in SQL databases for improving query performance. In this blog, we’ll explore 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: Create the Students Table&lt;/p&gt;

&lt;p&gt;We start by creating a table Students with fields 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: Insert Sample Records&lt;/p&gt;

&lt;p&gt;Let’s insert 20 sample students across various departments with different 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: Create a B-Tree Index&lt;/p&gt;

&lt;p&gt;B-Tree indexes are efficient for 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;br&gt;
The B-Tree index ensures this query runs efficiently without scanning the entire table.&lt;/p&gt;




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

&lt;p&gt;B+ Tree indexes are ideal for range 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;This allows the database to quickly locate all students satisfying 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 perfect for exact match lookups.&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, leveraging the hash index.&lt;/p&gt;




&lt;p&gt;Key Takeaways&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 range scans; all values stored at leaf nodes.&lt;/p&gt;

&lt;p&gt;Hash Index: Excellent for equality comparisons (e.g., department = 'CSBS').&lt;/p&gt;

&lt;p&gt;Proper indexing dramatically improves query performance, especially with large datasets.&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%2Fddglhm57fd4v2s0atjm0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddglhm57fd4v2s0atjm0.jpeg" alt=" " width="800" height="370"&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%2Fwtzokg85japfe94dmjxz.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtzokg85japfe94dmjxz.jpeg" alt=" " width="800" height="377"&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%2Fe3rqp07rml6s0682rcc5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3rqp07rml6s0682rcc5.jpeg" alt=" " width="800" height="385"&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%2F58qj7ace2oxicz8ih04r.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58qj7ace2oxicz8ih04r.jpeg" alt=" " width="800" height="375"&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%2Fmdj2xzzwzg17y8i2sdxl.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdj2xzzwzg17y8i2sdxl.jpeg" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Understanding and using indexes effectively is crucial for query optimization. By combining B-Tree, B+ Tree, and Hash indexes, you can make your database queries faster and more efficient — a key skill for any data engineer or developer.&lt;/p&gt;




&lt;h1&gt;
  
  
  SQL #Database #Indexing #QueryOptimization #BTree #HashIndex #DataEngineering #DevCommunity
&lt;/h1&gt;

</description>
      <category>sql</category>
      <category>oracle</category>
    </item>
    <item>
      <title>Exploring SQL Transactions, Deadlocks &amp; Log-Based Recovery</title>
      <dc:creator>Prabanjan B</dc:creator>
      <pubDate>Sun, 05 Oct 2025 04:11:54 +0000</pubDate>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d/exploring-sql-transactions-deadlocks-log-based-recovery-olk</link>
      <guid>https://dev.to/pjn_b_e25b30362b3f8ceef1d/exploring-sql-transactions-deadlocks-log-based-recovery-olk</guid>
      <description>&lt;p&gt;Databases are designed to be reliable and consistent even in complex operations. Understanding transactions, deadlocks, and log-based recovery is key to mastering database management.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore these concepts using a simple Accounts table.&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;Transaction – Atomicity &amp;amp; Rollback&lt;/p&gt;

&lt;p&gt;Atomicity ensures that a transaction is treated as a single unit — either fully executed or not executed at all.&lt;/p&gt;

&lt;p&gt;Let’s simulate a money transfer from Alice to Bob and roll it back before committing.&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 rollback, balances remain unchanged, confirming no partial update occurs.&lt;/p&gt;




&lt;p&gt;Deadlock Simulation&lt;/p&gt;

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

&lt;p&gt;Simulate using two sessions:&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;
-- Try to update Bob&lt;br&gt;
UPDATE Accounts SET balance = balance - 100 WHERE acc_no = 2;&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;
-- Try to update Alice&lt;br&gt;
UPDATE Accounts SET balance = balance - 200 WHERE acc_no = 1;&lt;/p&gt;

&lt;p&gt;Both sessions wait on each other — a deadlock occurs.&lt;br&gt;
Most DBMS detect this and abort one transaction automatically.&lt;/p&gt;




&lt;p&gt;Log-Based Recovery&lt;/p&gt;

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

&lt;p&gt;Example:&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 the database crashes, the system can undo uncommitted changes and restore consistency.&lt;/p&gt;




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

&lt;p&gt;Concept Purpose / Behavior&lt;/p&gt;

&lt;p&gt;Atomicity   All-or-nothing execution; rollback undoes partial updates&lt;br&gt;
Deadlocks   Conflicting locks; DBMS resolves by aborting one transaction&lt;br&gt;
Log-Based Recovery  Maintains consistency after crashes by replaying/undoing transactions&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%2Fwifvpjq5srau8sufgtku.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwifvpjq5srau8sufgtku.jpeg" alt=" " width="800" height="526"&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%2Fg7riijlqf54nb79palo7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7riijlqf54nb79palo7.jpeg" alt=" " width="800" height="471"&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%2Fosfd267xurbfh7unf273.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosfd267xurbfh7unf273.jpeg" alt=" " width="800" height="296"&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%2F5zaht8c7jjq5novm5zy1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zaht8c7jjq5novm5zy1.jpeg" alt=" " width="800" height="332"&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%2Fdc1p7128ktrwfqqof2c3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdc1p7128ktrwfqqof2c3.jpeg" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Understanding transactions, deadlocks, and recovery mechanisms is crucial for building robust and reliable database applications.&lt;/p&gt;

&lt;p&gt;Experimenting with these SQL operations gives hands-on insight into how real-world DBMS maintain data integrity and availability.&lt;/p&gt;




&lt;h1&gt;
  
  
  SQL #Database #Transactions #Deadlocks #Recovery #DevCommunity #LearningByDoing
&lt;/h1&gt;

</description>
      <category>sql</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Exploring ACID Properties in SQL with Practical Queries</title>
      <dc:creator>Prabanjan B</dc:creator>
      <pubDate>Sun, 05 Oct 2025 04:04:06 +0000</pubDate>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d/exploring-acid-properties-in-sql-with-practical-queries-4aok</link>
      <guid>https://dev.to/pjn_b_e25b30362b3f8ceef1d/exploring-acid-properties-in-sql-with-practical-queries-4aok</guid>
      <description>&lt;p&gt;Exploring ACID Properties in SQL with Practical Queries&lt;/p&gt;

&lt;p&gt;Databases are designed to ensure that data remains accurate, reliable, and consistent even in the face of failures.&lt;br&gt;
This reliability comes from the ACID properties — Atomicity, Consistency, Isolation, and Durability.&lt;/p&gt;

&lt;p&gt;In this blog, let’s understand each property using a simple example: a bank Accounts table.&lt;/p&gt;




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

&lt;p&gt;We’ll begin by creating a table with three columns — account number, name, and balance.&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 that no record can have a negative balance — maintaining data consistency.&lt;/p&gt;




&lt;p&gt;Step 2: Insert 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;Step 3: Atomicity&lt;/p&gt;

&lt;p&gt;Atomicity ensures that a transaction is treated as a single unit — either all changes happen, or none do.&lt;/p&gt;

&lt;p&gt;Let’s simulate a money transfer between two accounts, then roll it back to ensure no partial changes occur.&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;-- Cancel the transaction&lt;br&gt;
ROLLBACK;&lt;/p&gt;

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

&lt;p&gt;✅ After rollback, both balances return to their original state.&lt;br&gt;
That’s Atomicity in action — preventing partial updates.&lt;/p&gt;




&lt;p&gt;Step 4: Consistency&lt;/p&gt;

&lt;p&gt;Now, let’s check if our table enforces consistency by rejecting invalid data.&lt;/p&gt;

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

&lt;p&gt;❌ This statement will fail because of the CHECK (balance &amp;gt;= 0) constraint.&lt;/p&gt;

&lt;p&gt;This demonstrates Consistency, ensuring that all data adheres to predefined rules.&lt;/p&gt;




&lt;p&gt;Step 5: Isolation&lt;/p&gt;

&lt;p&gt;Isolation ensures that concurrent transactions don’t interfere with each other.&lt;/p&gt;

&lt;p&gt;Try this in two different sessions:&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;br&gt;
-- Keep this transaction open&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 (e.g., READ COMMITTED, REPEATABLE READ), Session 2 may or may not see the uncommitted change.&lt;br&gt;
That’s how Isolation controls visibility between transactions.&lt;/p&gt;




&lt;p&gt;Step 6: Durability&lt;/p&gt;

&lt;p&gt;Once a transaction is committed, its changes are permanent — even if the system crashes.&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;SELECT acc_no, name, balance FROM Accounts WHERE acc_no = 3;&lt;/p&gt;

&lt;p&gt;✅ After restarting your database, the updated balance for Charlie remains.&lt;br&gt;
That’s Durability — ensuring committed data is never lost.&lt;/p&gt;




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

&lt;p&gt;Property    Description Example&lt;/p&gt;

&lt;p&gt;Atomicity   All or nothing execution of a transaction.  Rollback test&lt;br&gt;
Consistency Data remains valid before and after a transaction.  Negative balance rejection&lt;br&gt;
Isolation   Transactions are executed independently.    Two-session example&lt;br&gt;
Durability  Once committed, data persists permanently.  Commit and restart DB&lt;/p&gt;




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

&lt;p&gt;ACID properties form the foundation of reliable database systems.&lt;br&gt;
By experimenting with simple SQL transactions, you can clearly see how Atomicity, Consistency, Isolation, and Durability maintain data integrity — even in complex systems.&lt;/p&gt;

&lt;p&gt;💬 Try running these queries yourself and observe how your database ensures reliability step-by-step!&lt;/p&gt;




&lt;h1&gt;
  
  
  SQL #Database #ACID #Transactions #LearningByDoing #DevCommunity
&lt;/h1&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%2Fua0kd2tso1358yvdxnoi.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%2Fua0kd2tso1358yvdxnoi.png" alt=" " width="800" height="326"&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%2Fr2u4v6vp0wx87bv4299m.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%2Fr2u4v6vp0wx87bv4299m.png" alt=" " width="800" height="274"&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%2Faefn2xk2hlx0xlghp0ht.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faefn2xk2hlx0xlghp0ht.jpeg" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>database</category>
      <category>beginners</category>
      <category>sql</category>
    </item>
    <item>
      <title>SQL Cursor and Trigger Implementation — Step by Step Guide</title>
      <dc:creator>Prabanjan B</dc:creator>
      <pubDate>Sun, 05 Oct 2025 03:51:23 +0000</pubDate>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d/sql-cursor-and-trigger-implementation-step-by-step-guide-512o</link>
      <guid>https://dev.to/pjn_b_e25b30362b3f8ceef1d/sql-cursor-and-trigger-implementation-step-by-step-guide-512o</guid>
      <description>&lt;p&gt;In this post, we’ll explore two key SQL programming concepts:&lt;br&gt;
1️⃣ Cursor with condition and&lt;br&gt;
2️⃣ AFTER INSERT Trigger.&lt;br&gt;
Both examples are implemented in Oracle Live SQL.&lt;/p&gt;




&lt;p&gt;1️⃣ Cursor: Display Employees with Salary Greater than 50,000&lt;/p&gt;

&lt;p&gt;A cursor is used to process each record returned by a query, one row at a time.&lt;/p&gt;

&lt;p&gt;✅ Step 1: Create a Cursor&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;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.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;🧠 Explanation:&lt;/p&gt;

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

&lt;p&gt;emp_record emp_cursor%ROWTYPE → Declares a record to store fetched rows.&lt;/p&gt;

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

&lt;p&gt;DBMS_OUTPUT.PUT_LINE → Displays 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;2️⃣ AFTER INSERT Trigger — Student Registration Audit&lt;/p&gt;

&lt;p&gt;A trigger automatically performs an action when a specified database event occurs.&lt;/p&gt;

&lt;p&gt;✅ Step 2: Create AFTER INSERT Trigger&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;🧠 Explanation:&lt;/p&gt;

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

&lt;p&gt;:NEW → Refers to the new row being added.&lt;/p&gt;

&lt;p&gt;Student_Audit Table → Logs inserted student records automatically.&lt;/p&gt;

&lt;p&gt;✅ Step 3: Test the Trigger&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;And a new log entry will appear in the Student_Audit table 🎯&lt;/p&gt;




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

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

&lt;p&gt;Cursor  Used for row-by-row processing  Displays employees earning &amp;gt; ₹50,000&lt;br&gt;
Trigger Executes automatically after table events   Logs new student registrations&lt;/p&gt;




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

&lt;p&gt;Cursors and Triggers are essential for database automation and record handling.&lt;br&gt;
By using them effectively, you can make your SQL programs more powerful, reliable, and dynamic!&lt;/p&gt;

&lt;p&gt;Step 1:&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%2Fk1j5h84q424ex280x31u.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk1j5h84q424ex280x31u.jpeg" alt=" " width="800" height="366"&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%2Fcxxy8duhcotuemy113bf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxxy8duhcotuemy113bf.jpeg" alt=" " width="800" height="375"&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%2Fi6xca8dtqd8glvx5frg1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6xca8dtqd8glvx5frg1.jpeg" alt=" " width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2:&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%2Fz9hxa8hudvnd3ula73xb.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9hxa8hudvnd3ula73xb.jpeg" alt=" " width="800" height="377"&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%2Fm82m0xwzgepvn8lsjbpr.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm82m0xwzgepvn8lsjbpr.jpeg" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>oracle</category>
      <category>tutorial</category>
      <category>database</category>
    </item>
    <item>
      <title>Understanding 1NF, 2NF, and 3NF in DBMS with SQL Examples</title>
      <dc:creator>Prabanjan B</dc:creator>
      <pubDate>Sat, 04 Oct 2025 10:42:29 +0000</pubDate>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d/understanding-1nf-2nf-and-3nf-in-dbms-with-sql-examples-2ikn</link>
      <guid>https://dev.to/pjn_b_e25b30362b3f8ceef1d/understanding-1nf-2nf-and-3nf-in-dbms-with-sql-examples-2ikn</guid>
      <description>&lt;p&gt;Base Table&lt;br&gt;
Use the following data as the starting point:&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%2Fkpe9qfjuyxnd7vj675ju.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%2Fkpe9qfjuyxnd7vj675ju.png" alt=" " width="800" height="220"&gt;&lt;/a&gt;&lt;br&gt;
When designing databases, normalization is essential to remove redundancy and anomalies (insertion, update, deletion). In this post, we’ll take a sample base table, identify anomalies, and step-by-step normalize it into 1NF, 2NF, and 3NF using SQL CREATE TABLE statements.&lt;/p&gt;




&lt;p&gt;📌 Base Table&lt;/p&gt;

&lt;p&gt;Let’s assume a base table with student-course-instructor details:&lt;/p&gt;

&lt;p&gt;StudentID   StudentName CourseID    CourseName  Instructor  InstructorEmail&lt;/p&gt;

&lt;p&gt;1   Alice   C101    DBMS    Dr. Smith   &lt;a href="mailto:smith@uni.edu"&gt;smith@uni.edu&lt;/a&gt;&lt;br&gt;
2   Bob C102    Networks    Dr. Lee &lt;a href="mailto:lee@uni.edu"&gt;lee@uni.edu&lt;/a&gt;&lt;br&gt;
3   Alice   C103    AI  Dr. Clark   &lt;a href="mailto:clark@uni.edu"&gt;clark@uni.edu&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🚨 Anomalies in this 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: If instructor’s email changes, must update multiple rows.&lt;/p&gt;

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




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

&lt;p&gt;➡️ Eliminate repeating groups and ensure 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;✅ Step 2: Convert to 2NF (Second Normal Form)&lt;/p&gt;

&lt;p&gt;➡️ Remove partial dependency (attributes depending only on part of composite key).&lt;br&gt;
We separate 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;✅ Step 3: Convert to 3NF (Third Normal Form)&lt;/p&gt;

&lt;p&gt;➡️ Remove transitive dependency (InstructorEmail depends on Instructor, not CourseID).&lt;br&gt;
So, 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;/p&gt;




&lt;p&gt;📝 Insert Sample Data&lt;/p&gt;

&lt;p&gt;INSERT INTO Students VALUES (1, 'Alice'), (2, 'Bob');&lt;br&gt;
INSERT INTO Instructors VALUES (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;br&gt;
INSERT INTO Courses VALUES ('C101', 'DBMS', 1),&lt;br&gt;
                           ('C102', 'Networks', 2),&lt;br&gt;
                           ('C103', 'AI', 3);&lt;br&gt;
INSERT INTO Enrollments VALUES (1, 'C101'), (2, 'C102'), (1, 'C103');&lt;/p&gt;




&lt;p&gt;🔗 Query with JOINS&lt;/p&gt;

&lt;p&gt;List all students 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;🚀 Final Thoughts&lt;/p&gt;

&lt;p&gt;Database normalization helps eliminate redundancy, prevent anomalies, and improve efficiency. By following 1NF → 2NF → 3NF, we created a robust schema ready for real-world applications.&lt;/p&gt;

&lt;h1&gt;
  
  
  SQL #DBMS #DatabaseDesign #Normalization #BackendDevelopment
&lt;/h1&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%2F10lhlfyyce3bbogvoqeg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F10lhlfyyce3bbogvoqeg.jpeg" alt=" " width="800" height="328"&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%2F480e028zn64er71syt6r.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F480e028zn64er71syt6r.jpeg" alt=" " width="800" height="383"&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%2F641kq7ja5xsnwoit6hav.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F641kq7ja5xsnwoit6hav.jpeg" alt=" " width="800" height="334"&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%2Frfa7nwju2qkr0r0441fp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfa7nwju2qkr0r0441fp.jpeg" alt=" " width="800" height="347"&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%2F44vf2aon4srqc00hympa.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44vf2aon4srqc00hympa.jpeg" alt=" " width="800" height="381"&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%2Fllb0drjar6u9a6u0kbl6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllb0drjar6u9a6u0kbl6.jpeg" alt=" " width="800" height="378"&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%2Fyz6olfndqa89qqk0kr2m.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz6olfndqa89qqk0kr2m.jpeg" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>design</category>
      <category>tutorial</category>
      <category>sql</category>
    </item>
    <item>
      <title>College Student &amp; Course Management System</title>
      <dc:creator>Prabanjan B</dc:creator>
      <pubDate>Mon, 25 Aug 2025 10:02:22 +0000</pubDate>
      <link>https://dev.to/pjn_b_e25b30362b3f8ceef1d/college-student-course-management-system-55g3</link>
      <guid>https://dev.to/pjn_b_e25b30362b3f8ceef1d/college-student-course-management-system-55g3</guid>
      <description>&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%2F9a3j7z9bk4syv6qortti.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9a3j7z9bk4syv6qortti.jpeg" alt=" " width="800" height="409"&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%2Fdtomfbgxugkyrx0sgxbh.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtomfbgxugkyrx0sgxbh.jpeg" alt=" " width="800" height="388"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewkac403udp1ng64j49z.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewkac403udp1ng64j49z.jpeg" alt=" " width="800" height="412"&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%2Fmwosa45lynrzoqsucyxq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwosa45lynrzoqsucyxq.jpeg" alt=" " width="800" height="412"&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%2Frr3z3ih261c1xk497l99.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr3z3ih261c1xk497l99.jpeg" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;br&gt;
Introduction&lt;br&gt;
This blog covers the implementation of a simple College Student &amp;amp; Course Management System using SQL on Oracle LiveSQL. It demonstrates key database concepts such as table creation, data insertion, constraint addition, queries with functions and aggregates, joins, views, and stored procedures.&lt;/p&gt;

&lt;p&gt;The use case focuses on managing students, courses, enrollments, and faculty members with related operations.&lt;/p&gt;

&lt;p&gt;Database Schema&lt;br&gt;
The database contains four main tables: Students, Courses, Enrollments, and Faculty.&lt;/p&gt;

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

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

&lt;p&gt;Enrollments Table&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;Faculty Table&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;Data Insertion&lt;br&gt;
Sample data was inserted into these tables to represent students, courses, and their enrollments:&lt;/p&gt;

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

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (2, 'Bob Smith', 'Mathematics', TO_DATE('2001-11-23', 'YYYY-MM-DD'), '&lt;a href="mailto:bob.smith@example.com"&gt;bob.smith@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, Name, Dept, DOB, Email)&lt;br&gt;
VALUES (3, 'Cathy Brown', 'Physics', TO_DATE('2003-07-02', 'YYYY-MM-DD'), '&lt;a href="mailto:cathy.brown@example.com"&gt;cathy.brown@example.com&lt;/a&gt;');&lt;/p&gt;

&lt;p&gt;INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (101, 'Databases', 4);&lt;br&gt;
INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (102, 'Algorithms', 3);&lt;br&gt;
INSERT INTO Courses (CourseID, CourseName, Credits) VALUES (103, 'Physics', 5);&lt;/p&gt;

&lt;p&gt;INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade) VALUES (1, 1, 101, 'A');&lt;br&gt;
INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade) VALUES (2, 2, 102, 'B+');&lt;br&gt;
INSERT INTO Enrollments (EnrollID, StudentID, CourseID, Grade) VALUES (3, 3, 103, 'A-');&lt;/p&gt;

&lt;p&gt;Table Alterations and Constraints&lt;br&gt;
Added a new column PhoneNo to Students and a CHECK constraint on the Credits column of Courses:&lt;/p&gt;

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

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

&lt;p&gt;SQL Queries with Functions and Aggregates&lt;br&gt;
Listing student names in uppercase and length of their emails:&lt;br&gt;
SELECT UPPER(Name) AS UppercaseName, LENGTH(Email) AS EmailLength FROM Students;&lt;/p&gt;

&lt;p&gt;Calculating average course credits and counting enrolled students:&lt;br&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;Sample result:&lt;/p&gt;

&lt;p&gt;UppercaseName   EmailLength&lt;br&gt;
ALICE JOHNSON   25&lt;br&gt;
BOB SMITH   21&lt;br&gt;
CATHY BROWN 23&lt;br&gt;
AvgCredits  TotalStudentsEnrolled&lt;br&gt;
4.0 3&lt;br&gt;
JOIN Queries&lt;br&gt;
Joining Students, Enrollments, and Courses to show which student is enrolled in which course along with grades:&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;Sample result:&lt;/p&gt;

&lt;p&gt;StudentName CourseName  Grade&lt;br&gt;
Alice Johnson   Databases   A&lt;br&gt;
Bob Smith   Algorithms  B+&lt;br&gt;
Cathy Brown Physics A-&lt;br&gt;
GROUP BY and HAVING Clause&lt;br&gt;
Counting students in each department and filtering departments with more than 2 students:&lt;/p&gt;

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

&lt;p&gt;Views&lt;br&gt;
Created a view to simplify student-course-grade lookup:&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;br&gt;
Procedure to update a student's grade in enrollments:&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;br&gt;
/&lt;/p&gt;

&lt;p&gt;Summary&lt;br&gt;
This assignment reinforced understanding of:&lt;/p&gt;

&lt;p&gt;Creating and managing SQL database schemas&lt;br&gt;
Writing data manipulation queries&lt;br&gt;
Using SQL functions and aggregate operations&lt;br&gt;
Performing joins to combine related data&lt;br&gt;
Creating views and stored procedures to enhance SQL capabilities&lt;br&gt;
Feel free to try the full script on Oracle LiveSQL to see these operations in action.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>oracle</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
