<?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: Pranav Aadithya</title>
    <description>The latest articles on DEV Community by Pranav Aadithya (@pranav_aadithya_36edf63cb).</description>
    <link>https://dev.to/pranav_aadithya_36edf63cb</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%2F3448224%2F48b350dc-a90f-4a88-83cf-3e6e05f02a2e.png</url>
      <title>DEV Community: Pranav Aadithya</title>
      <link>https://dev.to/pranav_aadithya_36edf63cb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pranav_aadithya_36edf63cb"/>
    <language>en</language>
    <item>
      <title>CRUD Operations in MongoDB: Hands-On with a Student Collection</title>
      <dc:creator>Pranav Aadithya</dc:creator>
      <pubDate>Fri, 03 Oct 2025 05:40:31 +0000</pubDate>
      <link>https://dev.to/pranav_aadithya_36edf63cb/crud-operations-in-mongodb-hands-on-with-a-student-collection-3d6j</link>
      <guid>https://dev.to/pranav_aadithya_36edf63cb/crud-operations-in-mongodb-hands-on-with-a-student-collection-3d6j</guid>
      <description>&lt;p&gt;MongoDB is a NoSQL document database that stores data in JSON-like documents. In this tutorial, we’ll perform CRUD operations using a simple college student schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1️⃣ Create (Insert)&lt;/strong&gt;&lt;br&gt;
Schema:&lt;br&gt;
&lt;strong&gt;Student 1&lt;/strong&gt;&lt;br&gt;
{&lt;br&gt;
  "student_id": "S001",&lt;br&gt;
  "name": "Pranav",&lt;br&gt;
  "age": 20,&lt;br&gt;
  "department": "CSBS",&lt;br&gt;
  "year": 2,&lt;br&gt;
  "cgpa": 9&lt;br&gt;
}&lt;br&gt;
&lt;strong&gt;Student 2&lt;/strong&gt;&lt;br&gt;
{&lt;br&gt;
  "student_id": "S002",&lt;br&gt;
  "name": "Anitha",&lt;br&gt;
  "age": 21,&lt;br&gt;
  "department": "CSE",&lt;br&gt;
  "year": 3,&lt;br&gt;
  "cgpa": 8.5&lt;br&gt;
}&lt;br&gt;
&lt;strong&gt;Student 3&lt;/strong&gt;&lt;br&gt;
{&lt;br&gt;
  "student_id": "S003",&lt;br&gt;
  "name": "Ramesh",&lt;br&gt;
  "age": 22,&lt;br&gt;
  "department": "ECE",&lt;br&gt;
  "year": 4,&lt;br&gt;
  "cgpa": 7.2&lt;br&gt;
}&lt;br&gt;
&lt;strong&gt;Student 4&lt;/strong&gt;&lt;br&gt;
{&lt;br&gt;
  "student_id": "S004",&lt;br&gt;
  "name": "Priya",&lt;br&gt;
  "age": 19,&lt;br&gt;
  "department": "CSBS",&lt;br&gt;
  "year": 1,&lt;br&gt;
  "cgpa": 9.3&lt;br&gt;
}&lt;br&gt;
&lt;strong&gt;Student 5&lt;/strong&gt;&lt;br&gt;
{&lt;br&gt;
  "student_id": "S005",&lt;br&gt;
  "name": "Vignesh",&lt;br&gt;
  "age": 20,&lt;br&gt;
  "department": "Mechanical",&lt;br&gt;
  "year": 2,&lt;br&gt;
  "cgpa": 6.8&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot:&lt;/strong&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%2Fg4oj6924iqkkpotyjnw1.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%2Fg4oj6924iqkkpotyjnw1.png" alt=" " width="800" height="401"&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%2Foygch2to5l4m2cxev3ah.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%2Foygch2to5l4m2cxev3ah.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2️⃣Read (Query)&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;B.Students with CGPA &amp;gt; 8&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;C.Students in CSBS department&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;{ "department": { "$in": ["CSBS"] } }&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%2Fcb3ryjts86ec9n5zb84j.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%2Fcb3ryjts86ec9n5zb84j.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3️⃣Update&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A.Update CGPA of a specific student (S002)&lt;/strong&gt;&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%2Fhgxczksf9dpxjdk15h7a.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%2Fhgxczksf9dpxjdk15h7a.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Increase year of all 3rd year students by 1&lt;/strong&gt;&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%2Fi3zoya80fbx4dtqfnng4.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%2Fi3zoya80fbx4dtqfnng4.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4️⃣Delete&lt;/strong&gt;&lt;/p&gt;

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

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

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

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

&lt;p&gt;✅ Summary of MongoDB CRUD Operations&lt;br&gt;
Operation    MongoDB Query&lt;br&gt;
Create         insertOne / insertMany&lt;br&gt;
Read           find()&lt;br&gt;
Update         updateOne / updateMany&lt;br&gt;
Delete         deleteOne / deleteMany&lt;/p&gt;

&lt;p&gt;MongoDB allows flexible, schema-less data storage, making it ideal for applications requiring rapid iteration and scalability.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>mysql</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>Indexing, Hashing &amp; Query Optimization in SQL</title>
      <dc:creator>Pranav Aadithya</dc:creator>
      <pubDate>Wed, 01 Oct 2025 08:14:49 +0000</pubDate>
      <link>https://dev.to/pranav_aadithya_36edf63cb/indexing-hashing-query-optimization-in-sql-3onp</link>
      <guid>https://dev.to/pranav_aadithya_36edf63cb/indexing-hashing-query-optimization-in-sql-3onp</guid>
      <description>&lt;p&gt;Indexes are essential for faster data retrieval and query optimization. In this tutorial, we’ll explore B-Tree, B+ Tree, and Hash indexes using a Students table.&lt;br&gt;
&lt;strong&gt;Step 1 — Create Students Table and Insert Data&lt;/strong&gt;&lt;br&gt;
CREATE TABLE Students (&lt;br&gt;
    roll_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    dept VARCHAR(30),&lt;br&gt;
    cgpa DECIMAL(3,2)&lt;br&gt;
);&lt;br&gt;
INSERT INTO Students (roll_no, name, dept, cgpa) VALUES&lt;br&gt;
(101, 'Alice', 'CSBS', 8.5),&lt;br&gt;
(102, 'Bob', 'CSBS', 7.8),&lt;br&gt;
(103, 'Charlie', 'ECE', 8.2),&lt;br&gt;
(104, 'David', 'CSBS', 9.0),&lt;br&gt;
(105, 'Eva', 'ECE', 6.9),&lt;br&gt;
(106, 'Frank', 'CSBS', 8.1),&lt;br&gt;
(107, 'Grace', 'CSBS', 7.5),&lt;br&gt;
(108, 'Hannah', 'ECE', 8.6),&lt;br&gt;
(109, 'Ivy', 'CSBS', 8.0),&lt;br&gt;
(110, 'Jack', 'CSBS', 8.9),&lt;br&gt;
(111, 'Kiran', 'ECE', 7.7),&lt;br&gt;
(112, 'Liam', 'CSBS', 8.3),&lt;br&gt;
(113, 'Mia', 'ECE', 9.2),&lt;br&gt;
(114, 'Noah', 'CSBS', 8.4),&lt;br&gt;
(115, 'Olivia', 'ECE', 7.6),&lt;br&gt;
(116, 'Paul', 'CSBS', 8.7),&lt;br&gt;
(117, 'Quinn', 'CSBS', 7.9),&lt;br&gt;
(118, 'Ria', 'ECE', 8.8),&lt;br&gt;
(119, 'Sam', 'CSBS', 8.0),&lt;br&gt;
(120, 'Tina', 'ECE', 9.1);&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 2 — Create a B-Tree Index on roll_no&lt;/strong&gt;&lt;br&gt;
B-Tree indexes are default in MySQL for numeric primary keys, but we’ll explicitly create one:&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_roll_no ON Students(roll_no);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query to fetch a student by roll_no = 110:&lt;/strong&gt;&lt;/p&gt;

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

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

&lt;p&gt;+---------+------+------+------+&lt;br&gt;
| roll_no | name | dept | cgpa |&lt;br&gt;
+---------+------+------+------+&lt;br&gt;
|     110 | Jack | CSBS | 8.90 |&lt;br&gt;
+---------+------+------+------+&lt;/p&gt;

&lt;p&gt;Using a B-Tree index speeds up retrieval for single-row lookups.&lt;br&gt;
screenshot:&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%2Fzwpado7ssnwzhnofc5t1.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%2Fzwpado7ssnwzhnofc5t1.png" alt=" " width="755" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Create a B+ Tree Index on cgpa&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MySQL/InnoDB uses B+ Tree internally for indexes on non-primary keys.&lt;/p&gt;

&lt;p&gt;CREATE INDEX idx_cgpa ON Students(cgpa);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query to display all students with cgpa &amp;gt; 8.0:&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
+---------+--------+------+------+&lt;br&gt;
| roll_no | name   | dept | cgpa |&lt;br&gt;
+---------+--------+------+------+&lt;br&gt;
| 113     | Mia    | ECE  | 9.20 |&lt;br&gt;
| 120     | Tina   | ECE  | 9.10 |&lt;br&gt;
| 104     | David  | CSBS | 9.00 |&lt;br&gt;
| 110     | Jack   | CSBS | 8.90 |&lt;br&gt;
| 118     | Ria    | ECE  | 8.80 |&lt;br&gt;
| 101     | Alice  | CSBS | 8.50 |&lt;br&gt;
| 114     | Noah   | CSBS | 8.40 |&lt;br&gt;
| 112     | Liam   | CSBS | 8.30 |&lt;br&gt;
| 106     | Frank  | CSBS | 8.10 |&lt;br&gt;
| 109     | Ivy    | CSBS | 8.00 |&lt;br&gt;
+---------+--------+------+------+&lt;br&gt;
B+ Tree index helps with range queries like cgpa &amp;gt; 8.0.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 4 — Create a Hash Index on dept&lt;/strong&gt;&lt;br&gt;
Hash indexes are great for equality lookups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; MySQL only supports hash indexes in Memory tables, or you can simulate using InnoDB for equality searches.&lt;/p&gt;

&lt;p&gt;-- For demo, create a MEMORY table&lt;br&gt;
CREATE TABLE StudentsHash (&lt;br&gt;
    roll_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    dept VARCHAR(30),&lt;br&gt;
    cgpa DECIMAL(3,2)&lt;br&gt;
) ENGINE=MEMORY;&lt;/p&gt;

&lt;p&gt;INSERT INTO StudentsHash SELECT * FROM Students;&lt;br&gt;
CREATE INDEX idx_dept_hash USING HASH ON StudentsHash(dept);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query to fetch all students from CSBS department:&lt;/strong&gt;&lt;/p&gt;

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

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

&lt;p&gt;+---------+--------+------+------+&lt;br&gt;
| roll_no | name   | dept | cgpa |&lt;br&gt;
+---------+--------+------+------+&lt;br&gt;
| 101     | Alice  | CSBS | 8.50 |&lt;br&gt;
| 102     | Bob    | CSBS | 7.80 |&lt;br&gt;
| 104     | David  | CSBS | 9.00 |&lt;br&gt;
| 106     | Frank  | CSBS | 8.10 |&lt;br&gt;
| 107     | Grace  | CSBS | 7.50 |&lt;br&gt;
| 109     | Ivy    | CSBS | 8.00 |&lt;br&gt;
| 110     | Jack   | CSBS | 8.90 |&lt;br&gt;
| 112     | Liam   | CSBS | 8.30 |&lt;br&gt;
| 114     | Noah   | CSBS | 8.40 |&lt;br&gt;
| 116     | Paul   | CSBS | 8.70 |&lt;br&gt;
| 117     | Quinn  | CSBS | 7.90 |&lt;br&gt;
| 119     | Sam    | CSBS | 8.00 |&lt;br&gt;
+---------+--------+------+------+&lt;/p&gt;

&lt;p&gt;Hash indexes optimize exact match queries, but not range queries.&lt;br&gt;
screenshot:&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%2Finqccevli5xoq4uzd024.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%2Finqccevli5xoq4uzd024.png" alt=" " width="800" height="802"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Observations &amp;amp; Query Optimization Tips&lt;/strong&gt;&lt;br&gt;
1.B-Tree / B+ Tree: Efficient for range queries and ordered retrieval.&lt;br&gt;
2.Hash Index: Fast for equality searches but not for ranges.&lt;br&gt;
3.Indexes improve SELECT performance but may slow down INSERT/UPDATE due to maintenance.&lt;br&gt;
4.Always choose the right index type depending on query patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Full SQL Script&lt;/strong&gt;&lt;br&gt;
CREATE DATABASE IF NOT EXISTS StudentsDemo;&lt;br&gt;
USE StudentsDemo;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
    roll_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    dept VARCHAR(30),&lt;br&gt;
    cgpa DECIMAL(3,2)&lt;br&gt;
);&lt;br&gt;
-- Insert 20 sample records&lt;br&gt;
INSERT INTO Students (roll_no, name, dept, cgpa) VALUES&lt;br&gt;
(101, 'Alice', 'CSBS', 8.5),&lt;br&gt;
(102, 'Bob', 'CSBS', 7.8),&lt;br&gt;
(103, 'Charlie', 'ECE', 8.2),&lt;br&gt;
(104, 'David', 'CSBS', 9.0),&lt;br&gt;
(105, 'Eva', 'ECE', 6.9),&lt;br&gt;
(106, 'Frank', 'CSBS', 8.1),&lt;br&gt;
(107, 'Grace', 'CSBS', 7.5),&lt;br&gt;
(108, 'Hannah', 'ECE', 8.6),&lt;br&gt;
(109, 'Ivy', 'CSBS', 8.0),&lt;br&gt;
(110, 'Jack', 'CSBS', 8.9),&lt;br&gt;
(111, 'Kiran', 'ECE', 7.7),&lt;br&gt;
(112, 'Liam', 'CSBS', 8.3),&lt;br&gt;
(113, 'Mia', 'ECE', 9.2),&lt;br&gt;
(114, 'Noah', 'CSBS', 8.4),&lt;br&gt;
(115, 'Olivia', 'ECE', 7.6),&lt;br&gt;
(116, 'Paul', 'CSBS', 8.7),&lt;br&gt;
(117, 'Quinn', 'CSBS', 7.9),&lt;br&gt;
(118, 'Ria', 'ECE', 8.8),&lt;br&gt;
(119, 'Sam', 'CSBS', 8.0),&lt;br&gt;
(120, 'Tina', 'ECE', 9.1);&lt;br&gt;
-- B-Tree index on roll_no&lt;br&gt;
CREATE INDEX idx_roll_no ON Students(roll_no);&lt;br&gt;
SELECT * FROM Students WHERE roll_no = 110;&lt;br&gt;
-- B+ Tree index on cgpa&lt;br&gt;
CREATE INDEX idx_cgpa ON Students(cgpa);&lt;br&gt;
SELECT * FROM Students WHERE cgpa &amp;gt; 8.0 ORDER BY cgpa DESC;&lt;br&gt;
-- Hash index on dept (Memory table)&lt;br&gt;
CREATE TABLE StudentsHash (&lt;br&gt;
    roll_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    dept VARCHAR(30),&lt;br&gt;
    cgpa DECIMAL(3,2)&lt;br&gt;
) ENGINE=MEMORY;&lt;br&gt;
INSERT INTO StudentsHash SELECT * FROM Students;&lt;br&gt;
CREATE INDEX idx_dept_hash USING HASH ON StudentsHash(dept);&lt;br&gt;
SELECT * FROM StudentsHash WHERE dept = 'CSBS';&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>sql</category>
      <category>indexing</category>
      <category>database</category>
    </item>
    <item>
      <title>Transactions, Deadlocks &amp; Log-Based Recovery in SQL</title>
      <dc:creator>Pranav Aadithya</dc:creator>
      <pubDate>Wed, 01 Oct 2025 08:02:22 +0000</pubDate>
      <link>https://dev.to/pranav_aadithya_36edf63cb/transactions-deadlocks-log-based-recovery-in-sql-100k</link>
      <guid>https://dev.to/pranav_aadithya_36edf63cb/transactions-deadlocks-log-based-recovery-in-sql-100k</guid>
      <description>&lt;p&gt;In this tutorial, we’ll explore how to work with transactions, simulate deadlocks, and understand log-based recovery using SQL (MySQL/PostgreSQL).&lt;br&gt;
&lt;strong&gt;We’ll use a simple Accounts table:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Accounts (&lt;br&gt;
    acc_no INT PRIMARY KEY,&lt;br&gt;
    name VARCHAR(50),&lt;br&gt;
    balance INT&lt;br&gt;
);&lt;br&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;Screenshot:&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%2F8eh2c1mzf76eza5wbp4h.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%2F8eh2c1mzf76eza5wbp4h.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Goal: Ensure all-or-nothing transactions.&lt;br&gt;
-Start a transaction to transfer 500 from Alice to Bob.&lt;br&gt;
-Rollback before committing.&lt;br&gt;
-- Start transaction&lt;br&gt;
START TRANSACTION;&lt;br&gt;
-- Deduct 500 from Alice&lt;br&gt;
UPDATE Accounts SET balance = balance - 500 WHERE acc_no = 1;&lt;br&gt;
-- Add 500 to Bob&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 2;&lt;br&gt;
-- Rollback the transaction&lt;br&gt;
ROLLBACK;&lt;br&gt;
-- Check balances&lt;br&gt;
SELECT * FROM Accounts;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected Output (balances unchanged):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;+--------+---------+---------+&lt;br&gt;
| acc_no | name    | balance |&lt;br&gt;
+--------+---------+---------+&lt;br&gt;
| 1      | Alice   | 1000    |&lt;br&gt;
| 2      | Bob     | 1500    |&lt;br&gt;
| 3      | Charlie | 2000    |&lt;br&gt;
+--------+---------+---------+&lt;br&gt;
The rollback ensures no partial update occurs.&lt;/p&gt;

&lt;p&gt;screenshot:&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%2Frcqtlxgdrvtb009ubyjp.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%2Frcqtlxgdrvtb009ubyjp.png" alt=" " width="800" height="806"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;2️⃣ Deadlock Simulation&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Observe deadlock when two sessions try to access the same resources in conflicting order.&lt;/p&gt;

&lt;p&gt;Step 1: Open two sessions&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
-- Lock Alice’s account&lt;br&gt;
SELECT * FROM Accounts WHERE acc_no = 1 FOR UPDATE;&lt;br&gt;
-- Try to update Bob (this will wait if Session 2 locks it)&lt;br&gt;
UPDATE Accounts SET balance = balance + 100 WHERE acc_no = 2;&lt;/p&gt;

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

&lt;p&gt;START TRANSACTION;&lt;br&gt;
-- Lock Bob’s account&lt;br&gt;
SELECT * FROM Accounts WHERE acc_no = 2 FOR UPDATE;&lt;br&gt;
-- Try to update Alice (this will wait if Session 1 locks it)&lt;br&gt;
UPDATE Accounts SET balance = balance + 200 WHERE acc_no = 1;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected Outcome:&lt;/strong&gt;&lt;br&gt;
Both sessions are waiting for each other → deadlock detected.&lt;br&gt;
MySQL/PostgreSQL will automatically roll back one transaction to resolve the deadlock.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;3️⃣ Log-Based Recovery&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Verify undo operations are recorded in logs for crash recovery.&lt;/p&gt;

&lt;p&gt;Ensure logging is enabled (MySQL: Binary log; PostgreSQL: WAL).&lt;br&gt;
-- Start transaction&lt;br&gt;
START TRANSACTION;&lt;br&gt;
-- Update a record&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 3;&lt;br&gt;
-- Rollback&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check the log:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MySQL: SHOW BINLOG EVENTS; or inspect binary log.&lt;br&gt;
PostgreSQL: WAL automatically records undo info.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected Result:&lt;/strong&gt;&lt;br&gt;
The update is rolled back, and the log contains the undo operation.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;✅ Full SQL Script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can save the following as transactions_deadlocks.sql and run in MySQL CLI:&lt;br&gt;
CREATE DATABASE IF NOT EXISTS TransactionsDemo;&lt;br&gt;
USE TransactionsDemo;&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;br&gt;
INSERT INTO Accounts VALUES&lt;br&gt;
(1, 'Alice', 1000),&lt;br&gt;
(2, 'Bob', 1500),&lt;br&gt;
(3, 'Charlie', 2000);&lt;br&gt;
-- Transaction and rollback demo&lt;br&gt;
START TRANSACTION;&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;br&gt;
ROLLBACK;&lt;br&gt;
SELECT * FROM Accounts;&lt;br&gt;
-- Deadlock simulation: run in two sessions using SELECT ... FOR UPDATE&lt;br&gt;
-- Session 1 locks Alice, Session 2 locks Bob&lt;br&gt;
-- Attempt conflicting updates to observe deadlock&lt;br&gt;
-- Log-based recovery demo&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 3;&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting Tips&lt;/strong&gt;&lt;br&gt;
1.Rollback not working? Make sure you start the transaction with START TRANSACTION;.&lt;br&gt;
2.Deadlock not detected? Ensure both sessions are using SELECT ... FOR UPDATE or update statements in conflicting order.&lt;br&gt;
3.Logs not visible? Check that binary logging is enabled in MySQL (SHOW VARIABLES LIKE 'log_bin';).&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>programming</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>Understanding ACID Properties with SQL Transactions</title>
      <dc:creator>Pranav Aadithya</dc:creator>
      <pubDate>Wed, 01 Oct 2025 07:50:54 +0000</pubDate>
      <link>https://dev.to/pranav_aadithya_36edf63cb/understanding-acid-properties-with-sql-transactions-6do</link>
      <guid>https://dev.to/pranav_aadithya_36edf63cb/understanding-acid-properties-with-sql-transactions-6do</guid>
      <description>&lt;p&gt;ACID stands for Atomicity, Consistency, Isolation, Durability – the four key properties that ensure reliable database transactions. In this tutorial, we’ll demonstrate ACID concepts using MySQL 8.0 with practical examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We’ll use a simple Accounts table:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Accounts(&lt;br&gt;
  acc_no INT PRIMARY KEY,&lt;br&gt;
  name VARCHAR(50),&lt;br&gt;
  balance INT&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;INSERT INTO Accounts (acc_no, name, balance) VALUES&lt;br&gt;
(101, 'Alice', 5000),&lt;br&gt;
(102, 'Bob', 3000),&lt;br&gt;
(103, 'Charlie', 7000);&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1️⃣ Atomicity&lt;/strong&gt;&lt;br&gt;
Goal: Ensure transactions are all-or-nothing.&lt;br&gt;
1.Start a transaction to transfer money from Alice to Bob.&lt;br&gt;
2.Rollback midway and verify no partial updates occur.&lt;/p&gt;

&lt;p&gt;-- Start transaction&lt;br&gt;
START TRANSACTION; &lt;br&gt;
-- Deduct 1000 from Alice&lt;br&gt;
UPDATE Accounts SET balance = balance - 1000 WHERE acc_no = 101;&lt;br&gt;
-- Simulate an error (e.g., invalid operation)&lt;br&gt;
-- For demonstration, we rollback instead of committing&lt;br&gt;
ROLLBACK;&lt;br&gt;
-- Check balances&lt;br&gt;
SELECT * FROM Accounts;&lt;br&gt;
&lt;strong&gt;Expected Output (balances unchanged):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;+--------+---------+---------+&lt;br&gt;
| acc_no | name    | balance |&lt;br&gt;
+--------+---------+---------+&lt;br&gt;
| 101    | Alice   | 5000    |&lt;br&gt;
| 102    | Bob     | 3000    |&lt;br&gt;
| 103    | Charlie | 7000    |&lt;br&gt;
+--------+---------+---------+ &lt;/p&gt;

&lt;p&gt;The rollback ensures no partial update occurs.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;2️⃣ Consistency&lt;/strong&gt;&lt;br&gt;
Goal: Ensure the database remains in a valid state.&lt;br&gt;
1.Try inserting a record with a negative balance.&lt;br&gt;
2.Define a CHECK constraint to reject invalid balances.&lt;/p&gt;

&lt;p&gt;ALTER TABLE Accounts&lt;br&gt;
ADD CONSTRAINT chk_balance CHECK (balance &amp;gt;= 0);&lt;br&gt;
-- Attempt invalid insert&lt;br&gt;
INSERT INTO Accounts (acc_no, name, balance) VALUES (104, 'David', -500);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected Result:&lt;/strong&gt;&lt;br&gt;
1.MySQL rejects the insert with an error due to the constraint.&lt;br&gt;
2.Database remains consistent.&lt;br&gt;
Screenshot:&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%2F5w1fafxmuexgo4x8wgnk.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%2F5w1fafxmuexgo4x8wgnk.png" alt=" " width="800" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3️⃣ Isolation&lt;/strong&gt;&lt;br&gt;
Goal: Ensure concurrent transactions do not interfere.&lt;br&gt;
Open two MySQL sessions:&lt;br&gt;
&lt;strong&gt;Session 1:&lt;/strong&gt; Update Alice’s balance.&lt;br&gt;
&lt;strong&gt;Session 2:&lt;/strong&gt; Read Alice’s balance before Session 1 commits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session 1:&lt;/strong&gt;&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 2000 WHERE acc_no = 101;&lt;br&gt;
-- Do not commit yet&lt;br&gt;
&lt;strong&gt;Session 2:&lt;/strong&gt;&lt;br&gt;
SELECT * FROM Accounts WHERE acc_no = 101;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
Session 2 does not see uncommitted changes (depending on isolation level).&lt;br&gt;
Commit Session 1:&lt;br&gt;
COMMIT; &lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;4️⃣ Durability&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Ensure changes persist even after a crash.&lt;br&gt;
&lt;strong&gt;Commit a transaction:&lt;/strong&gt;&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 102;&lt;br&gt;
COMMIT;&lt;/p&gt;

&lt;p&gt;-Restart MySQL server.&lt;br&gt;
-Check balances:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
-The update remains permanent.&lt;/p&gt;

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

&lt;p&gt;+--------+---------+---------+&lt;br&gt;
| acc_no | name    | balance |&lt;br&gt;
+--------+---------+---------+&lt;br&gt;
| 101    | Alice   | 5000    |&lt;br&gt;
| 102    | Bob     | 3500    |&lt;br&gt;
| 103    | Charlie | 7000    |&lt;br&gt;
+--------+---------+---------+&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Full SQL Script&lt;/strong&gt;&lt;br&gt;
You can save the following in ACID_demo.sql and run in MySQL CLI:&lt;br&gt;
CREATE DATABASE IF NOT EXISTS ACID_demo;&lt;br&gt;
USE ACID_demo;&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 (acc_no, name, balance) VALUES&lt;br&gt;
(101, 'Alice', 5000),&lt;br&gt;
(102, 'Bob', 3000),&lt;br&gt;
(103, 'Charlie', 7000);&lt;/p&gt;

&lt;p&gt;ALTER TABLE Accounts&lt;br&gt;
ADD CONSTRAINT chk_balance CHECK (balance &amp;gt;= 0);&lt;/p&gt;

&lt;p&gt;-- Atomicity demo&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance - 1000 WHERE acc_no = 101;&lt;br&gt;
ROLLBACK;&lt;/p&gt;

&lt;p&gt;-- Isolation demo (run in two sessions)&lt;br&gt;
-- Session 1&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 2000 WHERE acc_no = 101;&lt;br&gt;
-- Session 2: SELECT * FROM Accounts WHERE acc_no = 101;&lt;br&gt;
-- Then commit Session 1&lt;br&gt;
COMMIT;&lt;/p&gt;

&lt;p&gt;-- Durability demo&lt;br&gt;
START TRANSACTION;&lt;br&gt;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 102;&lt;br&gt;
COMMIT;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Troubleshooting Tips&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.Rollback not working? Ensure you’re in a transaction using START TRANSACTION;.&lt;br&gt;
2.Negative balances accepted? Add CHECK (balance &amp;gt;= 0) constraint.&lt;br&gt;
3.Isolation behavior varies: MySQL default is REPEATABLE READ; change with SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;.&lt;br&gt;
4.Durability: MySQL uses InnoDB engine for ACID support.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>database</category>
      <category>programming</category>
      <category>sql</category>
    </item>
    <item>
      <title>Cursors and Triggers</title>
      <dc:creator>Pranav Aadithya</dc:creator>
      <pubDate>Wed, 01 Oct 2025 07:26:09 +0000</pubDate>
      <link>https://dev.to/pranav_aadithya_36edf63cb/cursors-and-triggers-1085</link>
      <guid>https://dev.to/pranav_aadithya_36edf63cb/cursors-and-triggers-1085</guid>
      <description>&lt;p&gt;&lt;strong&gt;In this tutorial, we’ll explore how to use cursors and triggers in MySQL 8.0.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We will cover:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using a cursor to fetch employees with salary greater than 50,000.&lt;/li&gt;
&lt;li&gt;Creating an AFTER INSERT trigger to automatically log student registrations.
The guide includes ready-to-paste SQL, expected outputs, screenshots, and troubleshooting tips.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Create a fresh database&lt;/strong&gt;&lt;br&gt;
DROP DATABASE IF EXISTS demo_db;&lt;br&gt;
CREATE DATABASE demo_db;&lt;br&gt;
USE demo_db;&lt;/p&gt;

&lt;p&gt;Screenshot:&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%2Fy944n1hzemlmc7s5rn5u.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%2Fy944n1hzemlmc7s5rn5u.png" alt=" " width="742" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Create Employee table and insert sample rows&lt;/strong&gt;&lt;br&gt;
CREATE TABLE Employee (&lt;br&gt;
  EmpID INT PRIMARY KEY,&lt;br&gt;
  EmpName VARCHAR(50),&lt;br&gt;
  Salary DECIMAL(10,2)&lt;br&gt;
);&lt;br&gt;
INSERT INTO Employee (EmpID, EmpName, Salary) VALUES&lt;br&gt;
(1, 'Arjun', 60000),&lt;br&gt;
(2, 'Priya', 45000),&lt;br&gt;
(3, 'Kiran', 75000),&lt;br&gt;
(4, 'Meera', 30000);&lt;/p&gt;

&lt;p&gt;Screenshot:&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%2Fkmvcvpe0k3tdg99c1q9t.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%2Fkmvcvpe0k3tdg99c1q9t.png" alt=" " width="718" height="860"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Create stored procedure with a cursor&lt;/strong&gt;&lt;br&gt;
We’ll create ShowHighSalaryEmployees() to display employees with Salary &amp;gt; 50,000 row by row.&lt;/p&gt;

&lt;p&gt;DROP PROCEDURE IF EXISTS ShowHighSalaryEmployees;&lt;br&gt;
DELIMITER $$&lt;br&gt;
CREATE PROCEDURE ShowHighSalaryEmployees()&lt;br&gt;
BEGIN&lt;br&gt;
  DECLARE done INT DEFAULT 0;&lt;br&gt;
  DECLARE empName VARCHAR(50);&lt;br&gt;
  DECLARE empSalary DECIMAL(10,2);&lt;br&gt;
  DECLARE cur CURSOR FOR&lt;br&gt;
    SELECT EmpName, Salary FROM Employee WHERE Salary &amp;gt; 50000;&lt;br&gt;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;&lt;br&gt;
  OPEN cur;&lt;br&gt;
  read_loop: LOOP&lt;br&gt;
    FETCH cur INTO empName, empSalary;&lt;br&gt;
    IF done = 1 THEN&lt;br&gt;
      LEAVE read_loop;&lt;br&gt;
    END IF;&lt;br&gt;
    SELECT empName AS Employee, empSalary AS Salary;&lt;br&gt;
  END LOOP;&lt;br&gt;
  CLOSE cur;&lt;br&gt;
END$$&lt;br&gt;
DELIMITER ;&lt;/p&gt;

&lt;p&gt;Screenshot:&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%2Fssa3j3qy7pom36ix8b8u.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%2Fssa3j3qy7pom36ix8b8u.png" alt=" " width="378" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Call the procedure&lt;/strong&gt;&lt;br&gt;
CALL ShowHighSalaryEmployees();&lt;/p&gt;

&lt;p&gt;Expected Output:&lt;br&gt;
+----------+---------+&lt;br&gt;
| Employee | Salary  |&lt;br&gt;
+----------+---------+&lt;br&gt;
| Arjun    | 60000.0 |&lt;br&gt;
+----------+---------+&lt;/p&gt;

&lt;p&gt;+----------+---------+&lt;br&gt;
| Employee | Salary  |&lt;br&gt;
+----------+---------+&lt;br&gt;
| Kiran    | 75000.0 |&lt;br&gt;
+----------+---------+&lt;/p&gt;

&lt;p&gt;Each SELECT inside the procedure appears as a separate result set in MySQL CLI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Create Students and Student_Audit tables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
  StudentID INT PRIMARY KEY,&lt;br&gt;
  StudentName VARCHAR(50),&lt;br&gt;
  Dept VARCHAR(30)&lt;br&gt;
);&lt;br&gt;
CREATE TABLE Student_Audit (&lt;br&gt;
  AuditID INT AUTO_INCREMENT PRIMARY KEY,&lt;br&gt;
  StudentID INT,&lt;br&gt;
  Action VARCHAR(100),&lt;br&gt;
  ActionTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Screenshot:&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%2Fro0gtqhk8zia4d66lqqi.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%2Fro0gtqhk8zia4d66lqqi.png" alt=" " width="541" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6 — Create AFTER INSERT trigger on Students&lt;/strong&gt;&lt;br&gt;
DROP TRIGGER IF EXISTS AfterStudentInsert;&lt;br&gt;
DELIMITER $$&lt;br&gt;
CREATE TRIGGER AfterStudentInsert&lt;br&gt;
AFTER INSERT ON Students&lt;br&gt;
FOR EACH ROW&lt;br&gt;
BEGIN&lt;br&gt;
  INSERT INTO Student_Audit (StudentID, Action)&lt;br&gt;
  VALUES (NEW.StudentID, CONCAT('Student ', NEW.StudentName, ' registered'));&lt;br&gt;
END$$&lt;br&gt;
DELIMITER ;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 7 — Insert sample students and view audit log&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;INSERT INTO Students (StudentID, StudentName, Dept) VALUES (101, 'Rahul', 'CSE');&lt;br&gt;
INSERT INTO Students (StudentID, StudentName, Dept) VALUES (102, 'Anita', 'ECE');&lt;br&gt;
SELECT * FROM Student_Audit;&lt;/p&gt;

&lt;p&gt;Expected Output:&lt;br&gt;
+---------+-----------+---------------------------+---------------------+&lt;br&gt;
| AuditID | StudentID | Action                    | ActionTime          |&lt;br&gt;
+---------+-----------+---------------------------+---------------------+&lt;br&gt;
|       1 |       101 | Student Rahul registered  | 2025-10-01 11:30:00 |&lt;br&gt;
|       2 |       102 | Student Anita registered  | 2025-10-01 11:31:00 |&lt;br&gt;
+---------+-----------+---------------------------+---------------------+&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8 — Verification Queries&lt;/strong&gt;&lt;br&gt;
SELECT * FROM Employee;&lt;br&gt;
SELECT * FROM Students;&lt;br&gt;
SELECT * FROM Student_Audit;&lt;br&gt;
SELECT EmpName, Salary FROM Employee WHERE Salary &amp;gt; 50000;&lt;/p&gt;

&lt;p&gt;Screenshot:&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%2Falvyju3ao7q2txpjr4fe.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%2Falvyju3ao7q2txpjr4fe.png" alt=" " width="774" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 10 — Full ready-to-run .sql script&lt;/strong&gt;&lt;br&gt;
Save the SQL from Steps 1–7 into demo_script.sql and run:&lt;br&gt;
mysql -u root -p &amp;lt; demo_script.sql&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%2Fo3aazxyymnodcyjibwnm.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%2Fo3aazxyymnodcyjibwnm.png" alt=" " width="703" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting Tips&lt;/strong&gt;&lt;br&gt;
1.DELIMITER errors — Use MySQL CLI; GUI clients sometimes reject DELIMITER.&lt;br&gt;
2.Cursor/Handler errors — Ensure DECLARE statements are at the start of the block.&lt;br&gt;
3.Trigger not firing — Check table names and case sensitivity.&lt;br&gt;
4.Permission issues — Ensure your MySQL user has CREATE ROUTINE, CREATE TRIGGER, INSERT privileges.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>database</category>
      <category>sql</category>
      <category>programming</category>
    </item>
    <item>
      <title>Database Normalization in MySQL (1NF 2NF 3NF) – Simple Example</title>
      <dc:creator>Pranav Aadithya</dc:creator>
      <pubDate>Wed, 01 Oct 2025 06:52:45 +0000</pubDate>
      <link>https://dev.to/pranav_aadithya_36edf63cb/database-normalization-in-mysql-1nf-2nf-3nf-simple-example-314p</link>
      <guid>https://dev.to/pranav_aadithya_36edf63cb/database-normalization-in-mysql-1nf-2nf-3nf-simple-example-314p</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;br&gt;
In this post, we will understand Database Normalization with a simple student-course example.&lt;br&gt;
We will start from a single table (base table) and convert it step by step into 1NF, 2NF, and 3NF using MySQL 8.0.&lt;br&gt;
Finally, we will run a JOIN query to display students with their courses and instructors.&lt;br&gt;
&lt;strong&gt;🔹Base Table&lt;/strong&gt;&lt;br&gt;
Here is the starting data:&lt;br&gt;
StudentID StudentName CourseID  CourseName Instructor InstructorPhone&lt;br&gt;
S01   Arjun       C101  DBMS       Dr. Kumar    9876543210&lt;br&gt;
S01   Arjun       C102  DataMining Dr. Mehta    9123456780&lt;br&gt;
S02   Priya       C101  DBMS       Dr. Kumar    9876543210&lt;br&gt;
S03   Kiran       C103  AI     Dr. Rao  9988776655    &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹Anomalies in this table:&lt;/strong&gt;&lt;br&gt;
Insert anomaly: Can’t add a new instructor without adding a course.&lt;br&gt;
Update anomaly: If Dr. Kumar’s phone changes, we must update many rows.&lt;br&gt;
Delete anomaly: If S02’s record is deleted, course DBMS info may also be lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹Step 1 — First Normal Form (1NF):&lt;/strong&gt;&lt;br&gt;
In 1NF, all values should be atomic (no repeating groups).&lt;br&gt;
We also add a primary key = (StudentID, CourseID).&lt;br&gt;
CREATE TABLE Base1NF (&lt;br&gt;
  StudentID VARCHAR(10),&lt;br&gt;
  StudentName VARCHAR(50),&lt;br&gt;
  CourseID VARCHAR(10),&lt;br&gt;
  CourseName VARCHAR(50),&lt;br&gt;
  Instructor VARCHAR(50),&lt;br&gt;
  InstructorPhone VARCHAR(20),&lt;br&gt;
  PRIMARY KEY (StudentID, CourseID)&lt;br&gt;
);&lt;br&gt;
INSERT INTO Base1NF VALUES&lt;br&gt;
('S01','Arjun','C101','DBMS','Dr. Kumar','9876543210'),&lt;br&gt;
('S01','Arjun','C102','Data Mining','Dr. Mehta','9123456780'),&lt;br&gt;
('S02','Priya','C101','DBMS','Dr. Kumar','9876543210'),&lt;br&gt;
('S03','Kiran','C103','AI','Dr. Rao','9988776655');&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;🔹Step 2 — Second Normal Form (2NF)&lt;/strong&gt;&lt;br&gt;
In 2NF, we remove partial dependencies.&lt;br&gt;
We create 3 tables: Students, Courses, Enrollments.&lt;br&gt;
CREATE TABLE Students2NF (&lt;br&gt;
  StudentID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  StudentName VARCHAR(50)&lt;br&gt;
);&lt;br&gt;
CREATE TABLE Courses2NF (&lt;br&gt;
  CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR(50),&lt;br&gt;
  Instructor VARCHAR(50),&lt;br&gt;
  InstructorPhone VARCHAR(20)&lt;br&gt;
);&lt;br&gt;
CREATE TABLE Enrollments2NF (&lt;br&gt;
  StudentID VARCHAR(10),&lt;br&gt;
  CourseID VARCHAR(10),&lt;br&gt;
  PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
  FOREIGN KEY (StudentID) REFERENCES Students2NF(StudentID),&lt;br&gt;
  FOREIGN KEY (CourseID) REFERENCES Courses2NF(CourseID)&lt;br&gt;
);&lt;br&gt;
-- Insert Students&lt;br&gt;
INSERT INTO Students2NF VALUES ('S01','Arjun'),('S02','Priya'),('S03','Kiran');&lt;br&gt;
-- Insert Courses&lt;br&gt;
INSERT INTO Courses2NF VALUES&lt;br&gt;
('C101','DBMS','Dr. Kumar','9876543210'),&lt;br&gt;
('C102','Data Mining','Dr. Mehta','9123456780'),&lt;br&gt;
('C103','AI','Dr. Rao','9988776655');&lt;br&gt;
-- Insert Enrollments&lt;br&gt;
INSERT INTO Enrollments2NF VALUES&lt;br&gt;
('S01','C101'),('S01','C102'),('S02','C101'),('S03','C103');&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%2F1hb5eym16eu9lp1ph2ry.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%2F1hb5eym16eu9lp1ph2ry.png" alt=" " width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 Step 3 — Third Normal Form (3NF)&lt;/strong&gt;&lt;br&gt;
In 3NF, we remove transitive dependencies.&lt;br&gt;
Instructor phone depends on Instructor, not Course → so we create a separate Instructors table.&lt;br&gt;
CREATE TABLE Instructors3NF (&lt;br&gt;
  InstructorID INT PRIMARY KEY,&lt;br&gt;
  InstructorName VARCHAR(50),&lt;br&gt;
  InstructorPhone VARCHAR(20)&lt;br&gt;
);&lt;br&gt;
CREATE TABLE Students3NF (&lt;br&gt;
  StudentID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  StudentName VARCHAR(50)&lt;br&gt;
);&lt;br&gt;
CREATE TABLE Courses3NF (&lt;br&gt;
  CourseID VARCHAR(10) PRIMARY KEY,&lt;br&gt;
  CourseName VARCHAR(50),&lt;br&gt;
  InstructorID INT,&lt;br&gt;
  FOREIGN KEY (InstructorID) REFERENCES Instructors3NF(InstructorID)&lt;br&gt;
);&lt;br&gt;
CREATE TABLE Enrollments3NF (&lt;br&gt;
  StudentID VARCHAR(10),&lt;br&gt;
  CourseID VARCHAR(10),&lt;br&gt;
  PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
  FOREIGN KEY (StudentID) REFERENCES Students3NF(StudentID),&lt;br&gt;
  FOREIGN KEY (CourseID) REFERENCES Courses3NF(CourseID)&lt;br&gt;
);&lt;br&gt;
-- Insert Instructors&lt;br&gt;
INSERT INTO Instructors3NF VALUES&lt;br&gt;
(1,'Dr. Kumar','9876543210'),&lt;br&gt;
(2,'Dr. Mehta','9123456780'),&lt;br&gt;
(3,'Dr. Rao','9988776655');&lt;br&gt;
-- Insert Students&lt;br&gt;
INSERT INTO Students3NF VALUES&lt;br&gt;
('S01','Arjun'),('S02','Priya'),('S03','Kiran');&lt;br&gt;
-- Insert Courses&lt;br&gt;
INSERT INTO Courses3NF VALUES&lt;br&gt;
('C101','DBMS',1),&lt;br&gt;
('C102','Data Mining',2),&lt;br&gt;
('C103','AI',3);&lt;br&gt;
-- Insert Enrollments&lt;br&gt;
INSERT INTO Enrollments3NF VALUES&lt;br&gt;
('S01','C101'),('S01','C102'),('S02','C101'),('S03','C103');&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%2F68wnopcorgukxpknn4g8.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%2F68wnopcorgukxpknn4g8.png" alt=" " width="777" height="961"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹Step 4 — JOIN Query&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we can easily display all students with their courses and instructors.&lt;br&gt;&lt;br&gt;
SELECT s.StudentID, s.StudentName,&lt;br&gt;
       c.CourseID, c.CourseName,&lt;br&gt;
       i.InstructorName, i.InstructorPhone&lt;br&gt;
FROM Enrollments3NF e&lt;br&gt;
JOIN Students3NF s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Courses3NF c ON e.CourseID = c.CourseID&lt;br&gt;
JOIN Instructors3NF i ON c.InstructorID = i.InstructorID;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 Output:&lt;/strong&gt;&lt;br&gt;
S01 | Arjun | C101 | DBMS        | Dr. Kumar | 9876543210&lt;br&gt;
S01 | Arjun | C102 | Data Mining | Dr. Mehta | 9123456780&lt;br&gt;
S02 | Priya | C101 | DBMS        | Dr. Kumar | 9876543210&lt;br&gt;
S03 | Kiran | C103 | AI          | Dr. Rao   | 9988776655&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;✅ Conclusion&lt;/strong&gt;&lt;br&gt;
1NF: atomic values, primary key added.&lt;br&gt;
2NF: separated Students, Courses, Enrollments.&lt;br&gt;
3NF: separated Instructors table, removed redundancy.&lt;br&gt;
Now our database is clean, consistent, and free from anomalies 🎉.&lt;/p&gt;

</description>
      <category>normalization</category>
      <category>mysql</category>
      <category>database</category>
      <category>command</category>
    </item>
    <item>
      <title>Build a College Database in Oracle LiveSQL – Step-by-Step Guide</title>
      <dc:creator>Pranav Aadithya</dc:creator>
      <pubDate>Wed, 20 Aug 2025 16:07:43 +0000</pubDate>
      <link>https://dev.to/pranav_aadithya_36edf63cb/build-a-college-database-in-oracle-livesql-step-by-step-guide-281l</link>
      <guid>https://dev.to/pranav_aadithya_36edf63cb/build-a-college-database-in-oracle-livesql-step-by-step-guide-281l</guid>
      <description>&lt;p&gt;🎓 College Database Management System – Oracle LiveSQL&lt;/p&gt;

&lt;p&gt;This project demonstrates how to design and query a simple College Database using Oracle SQL on LiveSQL&lt;br&gt;
.&lt;br&gt;
We create tables, insert data, apply constraints, run queries, and even build views &amp;amp; stored procedures.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Schema Design&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We define four tables:&lt;/p&gt;

&lt;p&gt;Faculty – stores teacher details.&lt;/p&gt;

&lt;p&gt;Students – student records with department, DOB, email &amp;amp; phone.&lt;/p&gt;

&lt;p&gt;Courses – subject details with credits (1–5 only).&lt;/p&gt;

&lt;p&gt;Enrollments – junction table mapping students ↔ courses with grades.&lt;/p&gt;

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

&lt;p&gt;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;
    PhoneNo NUMBER(10)&lt;br&gt;
);&lt;/p&gt;

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

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

&lt;p&gt;✅ Here we use PRIMARY KEY, UNIQUE, and CHECK constraints to ensure data integrity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inserting Data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We add sample students, courses, and enrollments.&lt;/p&gt;

&lt;p&gt;-- Students&lt;br&gt;
INSERT INTO Students VALUES (1, 'Arjun', 'CSE', DATE '2004-05-15', '&lt;a href="mailto:arjun@college.com"&gt;arjun@college.com&lt;/a&gt;', 9876543210);&lt;br&gt;
INSERT INTO Students VALUES (2, 'Meera', 'ECE', DATE '2003-11-20', '&lt;a href="mailto:meera@college.com"&gt;meera@college.com&lt;/a&gt;', 9876543211);&lt;br&gt;
INSERT INTO Students VALUES (3, 'Rahul', 'Mechanical', DATE '2004-02-10', '&lt;a href="mailto:rahul@college.com"&gt;rahul@college.com&lt;/a&gt;', 9876543212);&lt;/p&gt;

&lt;p&gt;-- Courses&lt;br&gt;
INSERT INTO Courses VALUES (101, 'Database Systems', 4);&lt;br&gt;
INSERT INTO Courses VALUES (102, 'Operating Systems', 3);&lt;br&gt;
INSERT INTO Courses VALUES (103, 'Networks', 2);&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Queries&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, let’s explore the data.&lt;/p&gt;

&lt;p&gt;a) String Functions &amp;amp; Aggregates&lt;br&gt;
SELECT UPPER(Name) AS StudentNameUpper, LENGTH(Email) AS EmailLength&lt;br&gt;
FROM Students;&lt;/p&gt;

&lt;p&gt;👉 Converts names to uppercase &amp;amp; shows email length.&lt;/p&gt;

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

&lt;p&gt;👉 Finds average course credits &amp;amp; total number of students.&lt;/p&gt;

&lt;p&gt;b) Joins&lt;br&gt;
SELECT s.Name, 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 e.CourseID = c.CourseID;&lt;/p&gt;

&lt;p&gt;👉 Displays each student with their enrolled course and grade.&lt;/p&gt;

&lt;p&gt;c) Group By + Having&lt;br&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; 0;&lt;/p&gt;

&lt;p&gt;👉 Shows number of students per department (only departments with students).&lt;/p&gt;

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

&lt;p&gt;👉 A view gives a reusable query showing student ↔ course ↔ grade.&lt;/p&gt;

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

&lt;p&gt;👉 Procedure to update a student’s grade in a course easily.&lt;/p&gt;

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

&lt;p&gt;This LiveSQL use case covers:&lt;br&gt;
✔️ Table creation with constraints&lt;br&gt;
✔️ Data insertion&lt;br&gt;
✔️ String, aggregate &amp;amp; join queries&lt;br&gt;
✔️ Group By with Having&lt;br&gt;
✔️ Views for easy access&lt;br&gt;
✔️ Stored procedure for updates&lt;/p&gt;

&lt;p&gt;A neat mini College Database Management System! 🚀&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%2Fn1hzxn4jbm3fuqf77wz1.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%2Fn1hzxn4jbm3fuqf77wz1.png" alt=" " width="800" height="400"&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%2Flbvrch4xcvbc4clmi9v5.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%2Flbvrch4xcvbc4clmi9v5.png" alt=" " width="800" height="405"&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%2F3fzsoqix1oizs9t17vo6.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%2F3fzsoqix1oizs9t17vo6.png" alt=" " width="800" height="401"&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%2Fcl1idjtkaub0v13t2l8g.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%2Fcl1idjtkaub0v13t2l8g.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>dbms</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
