<?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: Lohita M</title>
    <description>The latest articles on DEV Community by Lohita M (@lohita_blue_d6409977eec4c).</description>
    <link>https://dev.to/lohita_blue_d6409977eec4c</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%2F3546771%2Fe30a72e3-779c-41c0-bf84-acb3ba1ef210.png</url>
      <title>DEV Community: Lohita M</title>
      <link>https://dev.to/lohita_blue_d6409977eec4c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lohita_blue_d6409977eec4c"/>
    <language>en</language>
    <item>
      <title>Amazon RDS (Relational Database Service)</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Mon, 22 Dec 2025 05:52:30 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/amazon-rds-relational-database-service-52d9</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/amazon-rds-relational-database-service-52d9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In today’s digital world, applications need reliable and scalable databases to store and manage data. Amazon Web Services (AWS) provides Amazon RDS (Relational Database Service) to make database management easier without worrying about infrastructure. RDS helps developers focus on application development instead of database maintenance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Amazon RDS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Amazon RDS is a managed relational database service offered by AWS. It allows users to create, operate, and scale relational databases in the cloud with just a few clicks. AWS takes care of tasks like backups, patching, and scaling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supported Database Engines&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Amazon RDS supports multiple popular database engines:&lt;br&gt;
     -MySQL&lt;br&gt;
     -PostgreSQL&lt;br&gt;
     -MariaDB&lt;br&gt;
     -Oracle&lt;br&gt;
     -SQL Server&lt;br&gt;
     -Amazon Aurora (AWS-optimised database)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of Amazon RDS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-Fully Managed Service – No need to manage servers manually&lt;br&gt;
  -Automatic Backups – Data is backed up regularly&lt;br&gt;
  -High Availability – Multi-AZ deployment for fault tolerance&lt;br&gt;
  -Scalability – Easily increase storage or computing power&lt;br&gt;
  -Security – Encryption, IAM roles, and VPC support&lt;br&gt;
  -Monitoring – Performance insights using Amazon CloudWatch&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Amazon RDS Works&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose a database engine&lt;/li&gt;
&lt;li&gt;Select instance type and storage&lt;/li&gt;
&lt;li&gt;Configure security and network settings&lt;/li&gt;
&lt;li&gt;Launch the database instance&lt;/li&gt;
&lt;li&gt;Connect your application to the database
AWS manages maintenance tasks like updates, backups, and recovery.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Advantages of Amazon RDS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-Reduces operational overhead&lt;br&gt;
  -Easy to use and deploy&lt;br&gt;
  -Cost-effective (pay only for what you use)&lt;br&gt;
  -Highly reliable and scalable&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4th0df8vgmfdh6dp4uw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4th0df8vgmfdh6dp4uw.jpg" alt=" " width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-Web and mobile applications&lt;br&gt;
  -E-commerce platforms&lt;br&gt;
  -Content management systems&lt;br&gt;
  -Data-driven applications&lt;br&gt;
  -Startup and enterprise workloads&lt;/p&gt;

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

&lt;p&gt;Amazon RDS simplifies database management by offering a secure, scalable, and managed solution. It is ideal for developers, startups, and enterprises who want reliable databases without handling complex infrastructure.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>database</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>Liquibase in DevOps: Managing Databases the Right Way</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Thu, 18 Dec 2025 17:35:36 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/liquibase-in-devops-managing-databases-the-right-way-cg2</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/liquibase-in-devops-managing-databases-the-right-way-cg2</guid>
      <description>&lt;p&gt;&lt;strong&gt;🔍 1. Overview of the Tool (DevOps Periodic Table Context)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the DevOps Periodic Table, Liquibase belongs to the Database Change Management category. It is a powerful tool used to track, version, and automate database schema changes, much like Git is used for source code. Liquibase ensures that database updates are consistent, reliable, and repeatable across all environments, such as development, testing, and production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ 2. Key Features of Liquibase&lt;/strong&gt;   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Database Version Control – Tracks every database change with history and rollback support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changelog-Based Approach – Uses XML, YAML, JSON, or SQL changelogs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rollback Support – Safely undo database changes when needed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-Database Support – Works with MySQL, PostgreSQL, Oracle, SQL Server, MongoDB, and more&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CI/CD Integration – Easily integrates with Jenkins, GitHub Actions, GitLab CI, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Environment Consistency – Prevents “works on my system” database issues&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔄 3. How Liquibase Fits into DevOps / DevSecOps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Liquibase plays a critical role in DevOps pipelines by automating database changes along with application deployments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enables Database as Code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supports continuous integration &amp;amp; continuous delivery (CI/CD)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduces manual database errors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Helps implement DevSecOps by auditing database changes and maintaining compliance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensures faster, safer releases with controlled schema evolution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;💻 4. Programming Language Used&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Liquibase is primarily written in Java.&lt;br&gt;
However, developers interact with it using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;XML&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;YAML&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JSON&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it flexible and developer-friendly across teams.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;🏢 5. Parent Company&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Liquibase is developed and maintained by Liquibase, Inc., a company focused on database DevOps and automation solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔓 6. Open Source or Paid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Liquibase Open Source – Free and open-source under Apache License 2.0&lt;/p&gt;

&lt;p&gt;💼 Liquibase Pro – Paid enterprise version with advanced features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Advanced security&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance optimizations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enterprise support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced compliance features&lt;br&gt;
&lt;strong&gt;🚀Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Liquibase is an essential DevOps tool that bridges the gap between application code and database changes. By treating database updates as version-controlled assets, Liquibase enables faster, safer, and more reliable software delivery.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>database</category>
      <category>automation</category>
    </item>
    <item>
      <title>CRUD (Create, Read, Update, Delete) operations in MongoDB using a simple college student schema.</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Wed, 08 Oct 2025 18:47:37 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/crud-create-read-update-delete-operations-in-mongodb-using-a-simple-college-student-schema-4lj8</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/crud-create-read-update-delete-operations-in-mongodb-using-a-simple-college-student-schema-4lj8</guid>
      <description>&lt;p&gt;To gain hands-on experience in performing CRUD (Create, Read, Update, Delete) operations in MongoDB using a simple college student schema.&lt;/p&gt;

&lt;p&gt;🧱 Schema (Collection: students)&lt;/p&gt;

&lt;p&gt;Each document follows this structure:&lt;/p&gt;

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

&lt;p&gt;⚙️ 1️⃣ CREATE (INSERT)&lt;br&gt;
Insert at least 5 student records into the students collection:&lt;/p&gt;

&lt;p&gt;db.students.insertMany([&lt;br&gt;
  {&lt;br&gt;
    "student_id": "S001",&lt;br&gt;
    "name": "Santhosh",&lt;br&gt;
    "age": 20,&lt;br&gt;
    "department": "CSBS",&lt;br&gt;
    "year": 2,&lt;br&gt;
    "cgpa": 9&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "S002",&lt;br&gt;
    "name": "Baviya",&lt;br&gt;
    "age": 19,&lt;br&gt;
    "department": "CSE",&lt;br&gt;
    "year": 1,&lt;br&gt;
    "cgpa": 8.7&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "S003",&lt;br&gt;
    "name": "Karthik",&lt;br&gt;
    "age": 21,&lt;br&gt;
    "department": "ECE",&lt;br&gt;
    "year": 3,&lt;br&gt;
    "cgpa": 7.2&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "S004",&lt;br&gt;
    "name": "Anu",&lt;br&gt;
    "age": 20,&lt;br&gt;
    "department": "CSE",&lt;br&gt;
    "year": 2,&lt;br&gt;
    "cgpa": 9.3&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "student_id": "S005",&lt;br&gt;
    "name": "Ravi",&lt;br&gt;
    "age": 22,&lt;br&gt;
    "department": "MECH",&lt;br&gt;
    "year": 3,&lt;br&gt;
    "cgpa": 6.8&lt;br&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%2Fldg0as97fhbvm3kkmgnj.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%2Fldg0as97fhbvm3kkmgnj.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔍 2️⃣ READ (QUERY)&lt;/p&gt;

&lt;p&gt;Find all students with CGPA &amp;gt; 8:&lt;/p&gt;

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

&lt;p&gt;Find students belonging to the Computer Science department:&lt;/p&gt;

&lt;p&gt;db.students.find({ department: { $in: ["CSE", "CSBS"] } }).pretty()&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%2F10gmh30y7gysqyqpb7dr.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%2F10gmh30y7gysqyqpb7dr.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✏️ 3️⃣ UPDATE&lt;br&gt;
(a) Update the CGPA of a specific student&lt;/p&gt;

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

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

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

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

&lt;p&gt;4️⃣ DELETE&lt;br&gt;
(a) Delete one student record by student_id:&lt;/p&gt;

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

&lt;p&gt;(b) Delete all students having CGPA &amp;lt; 7.5&lt;/p&gt;

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

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

&lt;p&gt;AFTER DELETION:&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%2Fdvs2q2d6ncfuebdv8vit.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%2Fdvs2q2d6ncfuebdv8vit.png" alt=" " width="385" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>mongodb</category>
      <category>database</category>
    </item>
    <item>
      <title>Database Normalization</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Wed, 08 Oct 2025 18:22:19 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/database-normalization-3igm</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/database-normalization-3igm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction:-&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database Normalization:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-Database Normalization is the process of organizing data in a relational database to reduce data redundancy (repeated data) and improve data integrity (accuracy and consistency).&lt;br&gt;
-It involves dividing a large, unstructured table into smaller, well-structured tables and establishing relationships between them using keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps 1: Base Table&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The initial unnormalized table includes details of students, their courses, instructors, and corresponding grades.&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%2Fcx95r2gecffehx5wq0qf.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%2Fcx95r2gecffehx5wq0qf.png" alt=" " width="800" height="335"&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%2Frgppdlf5aowkyu24flpo.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%2Frgppdlf5aowkyu24flpo.png" alt=" " width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Identifying Anomalies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Insertion anomaly&lt;/strong&gt;: A new course cannot be added unless it is linked to a student.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update anomaly&lt;/strong&gt;: Modifying a course name requires updating it in several rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deletion anomaly&lt;/strong&gt;: Removing a student may also remove valuable course details if that student was the only enrollee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Converting to 1NF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First Normal Form (1NF) rules:&lt;/p&gt;

&lt;p&gt;Every column should hold atomic (indivisible) values.&lt;/p&gt;

&lt;p&gt;Each record must be unique.&lt;/p&gt;

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

&lt;p&gt;Divided multivalued attributes into individual rows.&lt;/p&gt;

&lt;p&gt;Ensured that each column stores only one value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Table in 1 NF,&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students_1NF (&lt;br&gt;
Student_ID INT,&lt;br&gt;
Student_Name VARCHAR2(100),&lt;br&gt;
Course_ID INT,&lt;br&gt;
Course_Name VARCHAR2(100),&lt;br&gt;
Instructor VARCHAR2(100),&lt;br&gt;
Grade CHAR(2),&lt;br&gt;
PRIMARY KEY (Student_ID, Course_ID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Conversion to 2NF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2NF Rule:&lt;/strong&gt; Remove partial dependency, ensuring that non-key attributes rely on the entire composite primary key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observations:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Student_Name depends only on Student_ID.&lt;/p&gt;

&lt;p&gt;Course_Name, Instructor, Instructor_Phone depend only on Course_ID.&lt;/p&gt;

&lt;p&gt;Grade (if existed) would depend on both Student_ID + Course_ID.&lt;/p&gt;

&lt;p&gt;Solution: Split into three tables:&lt;/p&gt;

&lt;p&gt;Students → Student_ID, Student_Name&lt;/p&gt;

&lt;p&gt;Courses → Course_ID, Course_Name, Instructor, Instructor_Phone&lt;/p&gt;

&lt;p&gt;Enrollments → Student_ID, Course_ID&lt;/p&gt;

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

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

&lt;p&gt;CREATE TABLE Enrollments (&lt;br&gt;
StudentID VARCHAR2(10),&lt;br&gt;
CourseID VARCHAR2(10),&lt;br&gt;
PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
FOREIGN KEY (StudentID) REFERENCES Student(StudentID),&lt;br&gt;
FOREIGN KEY (CourseID) REFERENCES Course(CourseID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Create Tables (2NF):&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 5: Conversion to 3NF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3NF Rule: Remove transitive dependencies (non-prime attributes must depend only on primary key).&lt;/p&gt;

&lt;p&gt;Instructor’s phone depends on Instructor, not Course_ID → we can split Courses into:&lt;/p&gt;

&lt;p&gt;Courses → Course_ID, Course_Name, Instructor_ID&lt;/p&gt;

&lt;p&gt;Instructors → Instructor_ID, Instructor_Name, Instructor_Phone&lt;/p&gt;

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

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

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

&lt;p&gt;CREATE TABLE Enrollments3NF (&lt;br&gt;
StudentID VARCHAR2(10),&lt;br&gt;
CourseID VARCHAR2(10),&lt;br&gt;
PRIMARY KEY (StudentID, CourseID),&lt;br&gt;
FOREIGN KEY (StudentID) REFERENCES Student3NF(StudentID),&lt;br&gt;
FOREIGN KEY (CourseID) REFERENCES Course3NF(CourseID)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Create Tables (3NF):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Insert Sample Data&lt;/strong&gt;&lt;/p&gt;

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

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

&lt;p&gt;-- Students&lt;br&gt;
INSERT INTO Student3NF VALUES ('S01', 'Arjun');&lt;br&gt;
INSERT INTO Student3NF VALUES ('S02', 'Priya');&lt;br&gt;
INSERT INTO Student3NF VALUES ('S03', 'Kiran');&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 7: Query with JOINs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SELECT s.StudentName, c.CourseName, i.InstructorName&lt;br&gt;
FROM Enrollment3NF e&lt;br&gt;
JOIN Student3NF s ON e.StudentID = s.StudentID&lt;br&gt;
JOIN Course3NF c ON e.CourseID = c.CourseID&lt;br&gt;
JOIN Instructor i ON c.InstructorID = i.InstructorID;&lt;/p&gt;

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

&lt;p&gt;Normalization helps achieve:&lt;/p&gt;

&lt;p&gt;Reduced data redundancy&lt;/p&gt;

&lt;p&gt;Improved data integrity&lt;/p&gt;

&lt;p&gt;Simplified maintenance and updates&lt;/p&gt;

&lt;p&gt;Following the progression from 1NF → 2NF → 3NF in Oracle SQL enables the creation of scalable and efficient database designs.&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Transactions, Deadlocks &amp; Log-Based Recovery in Oracle SQL</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Wed, 08 Oct 2025 17:15:05 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/transactions-deadlocks-log-based-recovery-in-oracle-sql-558p</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/transactions-deadlocks-log-based-recovery-in-oracle-sql-558p</guid>
      <description>&lt;p&gt;We will explore key DBMS concepts: Transactions, Deadlocks, and Log-Based Recovery using an Accounts table in Oracle SQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1️⃣ Schema Setup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BEGIN
EXECUTE IMMEDIATE 'DROP TABLE Accounts';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/

CREATE TABLE Accounts (
acc_no NUMBER PRIMARY KEY,
name VARCHAR2(50),
balance NUMBER
);

INSERT INTO Accounts VALUES (1, 'Alice', 1000);
INSERT INTO Accounts VALUES (2, 'Bob', 1500);
INSERT INTO Accounts VALUES (3, 'Charlie', 2000);

COMMIT;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;NUMBER is used for numeric columns in Oracle.
-VARCHAR2 is used for text columns.
-COMMIT finalizes the inserts so other sessions can see the data.
-After this, the Accounts table has three accounts with initial balances.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE Accounts SET balance = balance - 500 WHERE name = 'Alice';
UPDATE Accounts SET balance = balance + 500 WHERE name = 'Bob';
ROLLBACK;
SELECT * FROM Accounts;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;-Oracle automatically starts a transaction with any DML statement.&lt;br&gt;
-Atomicity ensures that either all updates succeed or none do.&lt;br&gt;
-ROLLBACK cancels changes.&lt;br&gt;
-After rollback, balances of Alice and Bob remain unchanged, ensuring data consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3️⃣ Deadlock Simulation&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE Accounts SET balance = balance - 100 WHERE name = 'Alice';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE Accounts SET balance = balance + 100 WHERE name = 'Bob';
UPDATE Accounts SET balance = balance + 100 WHERE name = 'Alice';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;-Session 1 locks Alice’s account.&lt;br&gt;
-Session 2 locks Bob’s account.&lt;br&gt;
-When each session tries to update the other’s locked row, Oracle detects a deadlock.&lt;br&gt;
-Oracle automatically rolls back one transaction to resolve the deadlock.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4️⃣ Log-Based Recovery&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE Accounts SET balance = 2500 WHERE name = 'Charlie';
ROLLBACK;
SELECT * FROM Accounts;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;-Oracle writes all changes to redo logs.&lt;br&gt;
-When we ROLLBACK, Oracle uses the logs to undo changes.&lt;br&gt;
-This ensures the database stays consistent even if a failure occurs.&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%2F0i31co5i3dg1cydrk9tw.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%2F0i31co5i3dg1cydrk9tw.png" alt=" " width="719" height="791"&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%2Fbiev45mpftcau4qy290w.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%2Fbiev45mpftcau4qy290w.png" alt=" " width="754" height="797"&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%2Fx29ldj61xnjnn3nmuxqs.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%2Fx29ldj61xnjnn3nmuxqs.png" alt=" " width="760" height="737"&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%2Fupnc8bn1jfyd6jtbrvd6.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%2Fupnc8bn1jfyd6jtbrvd6.png" alt=" " width="673" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>sql</category>
      <category>tutorial</category>
      <category>database</category>
    </item>
    <item>
      <title>ACID PROPERTIES WITH SQL TRNSACTIONS</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Wed, 08 Oct 2025 16:48:00 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/acid-properties-with-sql-trnsactions-4ji8</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/acid-properties-with-sql-trnsactions-4ji8</guid>
      <description>&lt;p&gt;&lt;strong&gt;Step 1: Create the Accounts Table &amp;amp; Insert Sample Data&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE Accounts (
    acc_no INT PRIMARY KEY,
    name VARCHAR(50),
    balance INT CHECK (balance &amp;gt;= 0) 
);

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Atomicity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Transfer money from Alice → Bob, but rollback midway to prevent partial update.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START TRANSACTION;
UPDATE Accounts SET balance = balance - 1000 WHERE acc_no = 101;
UPDATE Accounts SET balance = balance + 1000 WHERE acc_no = 102;
ROLLBACK;
SELECT * FROM Accounts;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Result: No changes happen. Alice still has 5000, Bob 3000.&lt;br&gt;
This shows atomicity — either all updates succeed, or none do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Consistency&lt;/strong&gt;&lt;br&gt;
Goal: Reject invalid state (negative balance).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO Accounts (acc_no, name, balance) VALUES (104, 'David', -500);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Result: Error due to CHECK (balance &amp;gt;= 0).&lt;br&gt;
This preserves data consistency — database rules are enforced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Isolation&lt;/strong&gt;&lt;br&gt;
Goal: Observe isolation between concurrent transactions.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START TRANSACTION;
UPDATE Accounts SET balance = balance + 2000 WHERE acc_no = 103;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Session 2 (another terminal/session):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM Accounts WHERE acc_no = 103;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Result:&lt;/p&gt;

&lt;p&gt;Depending on isolation level (REPEATABLE READ default in MySQL), Session 2 may not see uncommitted changes.&lt;br&gt;
Session 1 commits → changes become visible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COMMIT;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows isolation — transactions do not interfere unexpectedly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Durability&lt;/strong&gt;&lt;br&gt;
Goal: Data persists after commit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START TRANSACTION;
UPDATE Accounts SET balance = balance + 500 WHERE acc_no = 102;
COMMIT;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the database.&lt;br&gt;
Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM Accounts WHERE acc_no = 102;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Result: Bob’s balance is updated permanently. ✅&lt;br&gt;
This demonstrates durability — committed transactions survive crashes.&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%2Fn3tkw30gq1iekribzsg0.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%2Fn3tkw30gq1iekribzsg0.png" alt=" " width="800" height="539"&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%2Fsd83iq9h10ndqx31t770.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%2Fsd83iq9h10ndqx31t770.png" alt=" " width="800" height="443"&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%2Fq92dh9uzy6qag9s8sd1b.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%2Fq92dh9uzy6qag9s8sd1b.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Indexing, Hashing &amp; Query Optimization</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Wed, 08 Oct 2025 15:38:29 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/indexing-hashing-query-optimization-2imk</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/indexing-hashing-query-optimization-2imk</guid>
      <description>&lt;p&gt;🎯** Objective**&lt;br&gt;
To understand how to improve query performance using B-Tree, B+ Tree, and Hash indexing in MySQL.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE Students (
    roll_no INT PRIMARY KEY,
    name VARCHAR(50),
    dept VARCHAR(10),
    cgpa DECIMAL(3,2)
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;`&lt;br&gt;
🧾** Step 2: Insert Sample Records**&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
INSERT INTO Students VALUES &lt;br&gt;
(101, 'Aarav', 'CSBS', 8.9),&lt;br&gt;
(102, 'Diya', 'ECE', 7.8),&lt;br&gt;
(103, 'Karthik', 'IT', 9.1),&lt;br&gt;
(104, 'Meena', 'CSBS', 8.2),&lt;br&gt;
(105, 'Rohit', 'EEE', 7.6),&lt;br&gt;
(106, 'Isha', 'MECH', 8.0),&lt;br&gt;
(107, 'Ravi', 'CIVIL', 7.4),&lt;br&gt;
(108, 'Sneha', 'IT', 9.3),&lt;br&gt;
(109, 'Vikram', 'CSBS', 8.7),&lt;br&gt;
(110, 'Priya', 'CSE', 9.0),&lt;br&gt;
(111, 'Hari', 'ECE', 8.4),&lt;br&gt;
(112, 'Ananya', 'EEE', 7.9),&lt;br&gt;
(113, 'Kavin', 'MECH', 8.1),&lt;br&gt;
(114, 'Swathi', 'IT', 9.5),&lt;br&gt;
(115, 'Teja', 'CSBS', 8.8),&lt;br&gt;
(116, 'Vishwa', 'CSE', 9.2),&lt;br&gt;
(117, 'Divya', 'ECE', 7.7),&lt;br&gt;
(118, 'Suresh', 'CIVIL', 8.3),&lt;br&gt;
(119, 'Kiran', 'IT', 8.6),&lt;br&gt;
(120, 'Pooja', 'CSBS', 9.4);&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
CREATE INDEX idx_roll_no ON Students(roll_no);&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br&gt;
✅ &lt;strong&gt;Query:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
SELECT * FROM Students WHERE roll_no = 110;&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br&gt;
💡 &lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-B-Tree indexes help in range-based and sorted searches efficiently.&lt;br&gt;
-The lookup time reduces from O(n) to O(log n).&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
CREATE INDEX idx_cgpa_bplustree ON Students(cgpa);&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅** Query:**&lt;/p&gt;

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

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;⚙️ &lt;strong&gt;Step 5: Create a Hash Index on dept&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
CREATE INDEX idx_dept_hash ON Students USING HASH(dept);&lt;/p&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
✅** Query:**&lt;/p&gt;

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

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
💡** Explanation:**&lt;/p&gt;

&lt;p&gt;-Hash Index is best for exact match lookups (e.g., =).&lt;br&gt;
-It is not used for range queries like &amp;gt; or &amp;lt;.&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%2Fhc4q2i1hkdqfx5oaemmx.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%2Fhc4q2i1hkdqfx5oaemmx.png" alt=" " width="800" height="382"&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%2Fzga0t8qx8xcblihed7ey.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%2Fzga0t8qx8xcblihed7ey.png" alt=" " width="800" height="484"&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%2Fuxofyy34ro87wyoxgcd1.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%2Fuxofyy34ro87wyoxgcd1.png" alt=" " width="800" height="507"&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%2Fnq8ps21oebqve1s97wbu.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%2Fnq8ps21oebqve1s97wbu.png" alt=" " width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>database</category>
      <category>performance</category>
    </item>
    <item>
      <title>Working with Cursors and Triggers in Oracle Live SQL</title>
      <dc:creator>Lohita M</dc:creator>
      <pubDate>Sun, 05 Oct 2025 14:46:19 +0000</pubDate>
      <link>https://dev.to/lohita_blue_d6409977eec4c/working-with-cursors-and-triggers-in-oracle-live-sql-i72</link>
      <guid>https://dev.to/lohita_blue_d6409977eec4c/working-with-cursors-and-triggers-in-oracle-live-sql-i72</guid>
      <description>&lt;p&gt;In this post, we’ll learn how to use Cursors and Triggers in Oracle SQL with simple examples.&lt;br&gt;
Let’s dive in! ⚡&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;1. Cursor with Condition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A cursor in Oracle is used when you want to process query results row by row.&lt;br&gt;
 👉Example: Display employee names whose salary &amp;gt; 50,000 from the Employee table.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Steps&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;1.Declare a cursor with the condition.&lt;br&gt;
2.Open the cursor.&lt;br&gt;
3.Fetch each row into a variable.&lt;br&gt;
4.Process inside a loop.&lt;br&gt;
5.Close the cursor.&lt;/p&gt;

&lt;p&gt;👉Example (Oracle PL/SQL)&lt;/p&gt;

&lt;p&gt;DECLARE&lt;br&gt;
  emp_name Employee.Emp_Name%TYPE;&lt;/p&gt;

&lt;p&gt;CURSOR emp_cursor IS&lt;br&gt;
    SELECT Emp_Name FROM Employee WHERE Salary &amp;gt; 50000;&lt;br&gt;
BEGIN&lt;br&gt;
  OPEN emp_cursor;&lt;br&gt;
  LOOP&lt;br&gt;
    FETCH emp_cursor INTO emp_name;&lt;br&gt;
    EXIT WHEN emp_cursor%NOTFOUND;&lt;br&gt;
    DBMS_OUTPUT.PUT_LINE('Employee: ' || emp_name);&lt;br&gt;
  END LOOP;&lt;br&gt;
  CLOSE emp_cursor;&lt;br&gt;
END;&lt;br&gt;
/&lt;/p&gt;

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

&lt;p&gt;📌 &lt;strong&gt;2. AFTER INSERT Trigger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A trigger in Oracle is a stored PL/SQL block that automatically executes when a specific event occurs on a table.&lt;br&gt;
👉 Example: Whenever a new student is inserted into the Students table, add a log entry in Student_Audit table.&lt;/p&gt;

&lt;p&gt;✅** Steps:**&lt;/p&gt;

&lt;p&gt;Create an audit table.&lt;br&gt;
Write an AFTER INSERT trigger.&lt;br&gt;
Insert log details inside the trigger.&lt;/p&gt;

&lt;p&gt;👉 Example (Oracle PL/SQL):&lt;/p&gt;

&lt;p&gt;CREATE TABLE Students (&lt;br&gt;
  Student_ID INT PRIMARY KEY,&lt;br&gt;
  Student_Name VARCHAR(50),&lt;br&gt;
  Course VARCHAR(30)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE TABLE Student_Audit (&lt;br&gt;
  Audit_ID INT PRIMARY KEY,&lt;br&gt;
  Student_ID INT,&lt;br&gt;
  Action VARCHAR(20),&lt;br&gt;
  Log_Time TIMESTAMP&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;CREATE SEQUENCE STUDENT_AUDIT_SEQ&lt;br&gt;
START WITH 1&lt;br&gt;
INCREMENT BY 1;&lt;/p&gt;

&lt;p&gt;CREATE OR REPLACE TRIGGER trg_student_audit&lt;br&gt;
AFTER INSERT&lt;br&gt;
ON STUDENTS&lt;br&gt;
FOR EACH ROW&lt;br&gt;
BEGIN&lt;br&gt;
  INSERT INTO STUDENT_AUDIT (AUDIT_ID, STUDENT_ID, ACTION, LOG_TIME)&lt;br&gt;
  VALUES (STUDENT_AUDIT_SEQ.NEXTVAL, :NEW.STUDENT_ID, 'INSERT', SYSTIMESTAMP);&lt;br&gt;
END;&lt;br&gt;
/&lt;/p&gt;

&lt;p&gt;INSERT INTO STUDENTS VALUES (1, 'Sowmya', 'Biology');&lt;/p&gt;

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

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

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

&lt;p&gt;1.Cursors are useful when you need row-by-row processing.&lt;br&gt;
2.Triggers automate tasks like auditing changes.&lt;/p&gt;

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