<?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: Tom Chege</title>
    <description>The latest articles on DEV Community by Tom Chege (@tom_chege).</description>
    <link>https://dev.to/tom_chege</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%2F3818282%2Faee19086-1cab-428d-af04-c2182bd89c5f.png</url>
      <title>DEV Community: Tom Chege</title>
      <link>https://dev.to/tom_chege</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tom_chege"/>
    <language>en</language>
    <item>
      <title>How to publish a Power BI report and embed it into a website</title>
      <dc:creator>Tom Chege</dc:creator>
      <pubDate>Sun, 05 Apr 2026 09:43:14 +0000</pubDate>
      <link>https://dev.to/tom_chege/how-to-publish-a-power-bi-report-and-embed-it-into-a-website-181k</link>
      <guid>https://dev.to/tom_chege/how-to-publish-a-power-bi-report-and-embed-it-into-a-website-181k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Power BI is a tool used for data cleaning, analysis, and presentation. Once you build your report locally, the next step is making it accessible to others.&lt;/p&gt;

&lt;p&gt;In this guide, I will walk you through the process step by step. The end goal is to generate a shareable dashboard that can be viewed in a browser using an embedded iframe.&lt;/p&gt;




&lt;h2&gt;
  
  
  Items Needed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Your organization’s Power BI credentials: &lt;a href="https://app.powerbi.com" rel="noopener noreferrer"&gt;https://app.powerbi.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A completed dashboard report available locally on your machine
&lt;/li&gt;
&lt;li&gt;A text editor such as VS Code or Sublime
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have the above, you can follow through the process to completion.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Open Your Dashboard Report
&lt;/h2&gt;

&lt;p&gt;Open your Power BI report on your local machine.&lt;/p&gt;

&lt;p&gt;Click on &lt;strong&gt;Sign in&lt;/strong&gt; on the far right of the screen as shown in the image below.&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%2Fvnmtv8tjjwbhmxriwez0.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%2Fvnmtv8tjjwbhmxriwez0.PNG" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Sign In to Power BI
&lt;/h2&gt;

&lt;p&gt;Proceed and provide the necessary credentials.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Power BI Service requires an organization email. Personal emails such as Gmail will not work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once successful, your account will appear on the top right.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Select or Create a Workspace
&lt;/h2&gt;

&lt;p&gt;On the left navigation bar in the Power BI Service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on &lt;strong&gt;Workspaces&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Either:

&lt;ul&gt;
&lt;li&gt;Create a new workspace, or
&lt;/li&gt;
&lt;li&gt;Use an existing one provided by your organization
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Workspaces are where your reports are stored after publishing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Publish the Report
&lt;/h2&gt;

&lt;p&gt;On Power BI Desktop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Publish&lt;/strong&gt; on the top navigation&lt;/li&gt;
&lt;li&gt;Choose your workspace&lt;/li&gt;
&lt;li&gt;Select from the dropdown or search for it&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%2Ftrw000zvgm0zge7txjuu.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%2Ftrw000zvgm0zge7txjuu.PNG" alt=" " width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Confirm Publishing
&lt;/h2&gt;

&lt;p&gt;Once the workspace is selected, proceed to publish.&lt;/p&gt;

&lt;p&gt;You will receive a confirmation screen with a link indicating that the report has been successfully published.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Generate the Embed Code
&lt;/h2&gt;

&lt;p&gt;Go to the Power BI Service in your browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refresh your workspace&lt;/li&gt;
&lt;li&gt;Open the report you just uploaded&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;File → Embed report&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will see the following options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SharePoint Online
&lt;/li&gt;
&lt;li&gt;Website or portal
&lt;/li&gt;
&lt;li&gt;Publish to web (public)
&lt;/li&gt;
&lt;li&gt;Developer playground
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this tutorial, select &lt;strong&gt;Website or portal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Copy the iFrame code that is generated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Create an HTML File
&lt;/h2&gt;

&lt;p&gt;Open your text editor and create a new file such as &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can use a basic HTML boilerplate such as the one from:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.w3schools.com/html/default.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/html/default.asp&lt;/a&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Sample Dashboard&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;My First Power BI Dashboard Website&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Kenya crop data"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"1140"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"541.25"&lt;/span&gt; &lt;span class="na"&gt;src=
&lt;/span&gt;&lt;span class="s"&gt;"https://app.powerbi.com/reportEmbed?reportId=YOUR EMBEDDED LINK"&lt;/span&gt; 
&lt;span class="na"&gt;frameborder=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;allowFullScreen=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste your copied iFrame into the HTML file.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Open and Test
&lt;/h2&gt;

&lt;p&gt;Save the file.&lt;/p&gt;

&lt;p&gt;Right-click on &lt;code&gt;index.html&lt;/code&gt; and open it with your browser.&lt;/p&gt;

&lt;p&gt;It should render a page similar to the image below:&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%2Frdbsx6qxhw4859ozdwbc.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%2Frdbsx6qxhw4859ozdwbc.PNG" alt=" " width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may be prompted to sign in to Power BI to access the dashboard.&lt;/p&gt;




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

&lt;p&gt;You have successfully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Published a Power BI report to the cloud
&lt;/li&gt;
&lt;li&gt;Generated an embedded link
&lt;/li&gt;
&lt;li&gt;Displayed the report in a web page using an iFrame
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach allows you to share dashboards in a more interactive and accessible way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Users will need Power BI access to view the embedded report
&lt;/li&gt;
&lt;li&gt;For public sharing, &lt;strong&gt;Publish to web&lt;/strong&gt; can be used, but this should be handled carefully since it exposes your data
&lt;/li&gt;
&lt;li&gt;Ensure the right workspace permissions are set if other users cannot access the report
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Congratulations — you have now built and shared your first embedded Power BI dashboard.&lt;/p&gt;

</description>
      <category>data</category>
      <category>powerfuldevs</category>
      <category>newbie</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Understanding Data Modelling in Power BI: Joins, Relationships, and Schemas Explained</title>
      <dc:creator>Tom Chege</dc:creator>
      <pubDate>Sun, 29 Mar 2026 18:10:19 +0000</pubDate>
      <link>https://dev.to/tom_chege/understanding-data-modelling-in-power-bi-joins-relationships-and-schemas-explained-e3g</link>
      <guid>https://dev.to/tom_chege/understanding-data-modelling-in-power-bi-joins-relationships-and-schemas-explained-e3g</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Working with raw data often introduces challenges such as duplication, inconsistency, and difficulty in extracting meaningful insights.&lt;/p&gt;

&lt;p&gt;Data modelling in Power BI addresses these challenges by structuring data into related tables, enabling efficient querying, accurate calculations, and scalable reporting.&lt;/p&gt;

&lt;p&gt;This article explores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL joins and their behaviour&lt;/li&gt;
&lt;li&gt;Power BI relationships and how they differ from joins&lt;/li&gt;
&lt;li&gt;Data modelling schemas&lt;/li&gt;
&lt;li&gt;Practical implementation in Power BI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll use a simple school dataset to ground these concepts.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1. Sample Dataset&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We will work with three core tables:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Students (Dimension Table)&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Form 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Brian&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Form 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;Catherine&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Form 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;David&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Form 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Test Scores (Fact Table)&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ScoreID&lt;/th&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;Science&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️ Note: Student &lt;strong&gt;105&lt;/strong&gt; does not exist in the Students table—this represents a referential integrity issue.&lt;/p&gt;

&lt;h5&gt;
  
  
  📊 View Dataset Online
&lt;/h5&gt;

&lt;p&gt;Explore the dataset directly: 👉&lt;a href="https://docs.google.com/spreadsheets/d/e/2PACX-1vQJi3siC_IO_hsG7fUmNr-CKfB9aLifLiyCNCxhjRMuzpn5TTRuJ4SZNt2hcDbO3NhwAO3TEBTdC30t/pubhtml" rel="noopener noreferrer"&gt;here!&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Teachers (Dimension Table)&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TeacherID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;td&gt;Mr. Kim&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2&lt;/td&gt;
&lt;td&gt;Ms. Asha&lt;/td&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3&lt;/td&gt;
&lt;td&gt;Mr. Otieno&lt;/td&gt;
&lt;td&gt;Science&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Data Roles&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fact Table:&lt;/strong&gt; Test Scores (transactional/measurable data)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimension Tables:&lt;/strong&gt; Students, Teachers (descriptive attributes)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. What is Data Modelling?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Data modelling is the process of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Organizing data into structured tables and defining relationships that enable efficient querying and accurate analysis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In analytical systems like Power BI, this typically involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separating &lt;strong&gt;facts&lt;/strong&gt; from &lt;strong&gt;dimensions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Establishing &lt;strong&gt;keys&lt;/strong&gt; (e.g., &lt;code&gt;StudentID&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Designing a schema optimized for performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Joins vs Relationships&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Joins (Power Query Layer)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A join is a &lt;strong&gt;data transformation operation&lt;/strong&gt; that combines rows from two or more tables based on a matching condition.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Characteristics:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Produces a &lt;strong&gt;new table&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Data is &lt;strong&gt;physically merged&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Can introduce &lt;strong&gt;duplication&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;

&lt;p&gt;Joining Students and Test Scores results in repeated student records for each score.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Relationships (Model Layer)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A relationship is a &lt;strong&gt;logical link&lt;/strong&gt; between tables based on matching columns.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Characteristics:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tables remain &lt;strong&gt;separate&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Data is combined &lt;strong&gt;at query time&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enables efficient filtering and aggregation via DAX&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Critical Difference&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Join&lt;/th&gt;
&lt;th&gt;Relationship&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Physical transformation&lt;/td&gt;
&lt;td&gt;Logical connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;Power Query&lt;/td&gt;
&lt;td&gt;Model View&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data duplication&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance impact&lt;/td&gt;
&lt;td&gt;Higher memory usage&lt;/td&gt;
&lt;td&gt;Optimized&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. SQL Joins Explained (with Examples)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Joins determine how rows from two tables are combined based on a matching condition.&lt;/p&gt;

&lt;p&gt;We will use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Students table (left table)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test Scores table (right table)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;INNER JOIN&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Definition
&lt;/h4&gt;

&lt;p&gt;Returns only rows where a match exists in both tables.&lt;/p&gt;

&lt;h4&gt;
  
  
  SQL Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Score&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Students&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;TestScores&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Result
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Brian&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Explanation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Student 103 and 104 are excluded (no scores)&lt;/li&gt;
&lt;li&gt;Score with StudentID 105 is excluded (no matching student)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;LEFT JOIN&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Definition
&lt;/h4&gt;

&lt;p&gt;Returns all rows from the left table, with matching rows from the right.&lt;/p&gt;

&lt;h4&gt;
  
  
  SQL Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Score&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Students&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;TestScores&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Result
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Brian&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;Catherine&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;David&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Explanation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;All students are included&lt;/li&gt;
&lt;li&gt;Missing scores appear as NULL&lt;/li&gt;
&lt;li&gt;Useful for identifying missing activity&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;RIGHT JOIN&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Definition
&lt;/h4&gt;

&lt;p&gt;Returns all rows from the right table and matching rows from the left.&lt;/p&gt;

&lt;h4&gt;
  
  
  SQL Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Score&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Students&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;RIGHT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;TestScores&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Result
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Brian&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;Science&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Explanation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Score for StudentID 105 appears&lt;/li&gt;
&lt;li&gt;Missing student info is NULL&lt;/li&gt;
&lt;li&gt;Highlights data inconsistencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;FULL OUTER JOIN&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Definition
&lt;/h4&gt;

&lt;p&gt;Returns all rows from both tables, matched where possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  SQL Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Score&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Students&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;FULL&lt;/span&gt; &lt;span class="k"&gt;OUTER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;TestScores&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Result
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Brian&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;Catherine&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;David&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;Science&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Explanation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Combines LEFT and RIGHT JOIN behavior&lt;/li&gt;
&lt;li&gt;Shows all matched and unmatched records&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;LEFT ANTI JOIN&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Definition
&lt;/h4&gt;

&lt;p&gt;Returns rows from the left table with no match in the right.&lt;/p&gt;

&lt;h4&gt;
  
  
  SQL Equivalent
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Students&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;TestScores&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Result
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;Catherine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;David&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Explanation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;These students have no test scores&lt;/li&gt;
&lt;li&gt;Useful for identifying inactivity&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;RIGHT ANTI JOIN&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Definition
&lt;/h4&gt;

&lt;p&gt;Returns rows from the right table with no match in the left.&lt;/p&gt;

&lt;h4&gt;
  
  
  SQL Equivalent
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;TestScores&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;Students&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentID&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Result
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;StudentID&lt;/th&gt;
&lt;th&gt;Subject&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;Science&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Explanation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;This score has no valid student&lt;/li&gt;
&lt;li&gt;Indicates a data quality issue&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Key Insight&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each join answers a specific business question:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Join Type&lt;/th&gt;
&lt;th&gt;Business Question&lt;/th&gt;
&lt;th&gt;Example from Our Dataset&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INNER&lt;/td&gt;
&lt;td&gt;What data exists in both tables?&lt;/td&gt;
&lt;td&gt;Which students have recorded test scores? → Alice and Brian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LEFT&lt;/td&gt;
&lt;td&gt;What records are missing related data?&lt;/td&gt;
&lt;td&gt;Which students are in the system but have not taken any tests? → Catherine and David&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RIGHT&lt;/td&gt;
&lt;td&gt;What data exists on the secondary side?&lt;/td&gt;
&lt;td&gt;Are there any test scores without valid student records? → Score for StudentID 105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FULL&lt;/td&gt;
&lt;td&gt;What does the complete dataset look like?&lt;/td&gt;
&lt;td&gt;What is the full picture of students and scores, including missing or unmatched data?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LEFT ANTI&lt;/td&gt;
&lt;td&gt;What records in the main table have no matches?&lt;/td&gt;
&lt;td&gt;Which students have no test scores at all? → Catherine and David&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RIGHT ANTI&lt;/td&gt;
&lt;td&gt;What records are invalid or inconsistent?&lt;/td&gt;
&lt;td&gt;Which test scores do not belong to any student? → StudentID 105&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. Power BI Relationships&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cardinality&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Defines how rows relate between tables.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1:M&lt;/td&gt;
&lt;td&gt;One dimension record relates to many fact records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M:M&lt;/td&gt;
&lt;td&gt;Multiple matches on both sides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:1&lt;/td&gt;
&lt;td&gt;Unique mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 Best practice:&lt;br&gt;
Use &lt;strong&gt;1:M from Dimension → Fact&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Cross-Filter Direction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Defines how filters propagate between tables.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single&lt;/td&gt;
&lt;td&gt;One-way filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Bi-directional filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️ Overusing bi-directional filtering can introduce ambiguity.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Active vs Inactive Relationships&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Only one relationship can be active between two tables&lt;/li&gt;
&lt;li&gt;Inactive relationships can be used via DAX (&lt;code&gt;USERELATIONSHIP&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. Fact vs Dimension Tables&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Fact Table&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Contains measurable data&lt;/li&gt;
&lt;li&gt;Often large&lt;/li&gt;
&lt;li&gt;Example: Test Scores&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Dimension Table&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Contains descriptive attributes&lt;/li&gt;
&lt;li&gt;Used for filtering and grouping&lt;/li&gt;
&lt;li&gt;Example: Students&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;7. Schemas&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Star Schema&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          Students
             |
Teachers — Test Scores — Subjects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Characteristics:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Central fact table&lt;/li&gt;
&lt;li&gt;Denormalized dimensions&lt;/li&gt;
&lt;li&gt;Optimized for performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Snowflake Schema&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Students
   |
Address
   |
Region
   |
Test Scores
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Characteristics:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Normalized dimensions&lt;/li&gt;
&lt;li&gt;Reduced redundancy&lt;/li&gt;
&lt;li&gt;Increased complexity&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Flat Table (Denormalized Model)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;All data stored in one table.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trade-offs:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Simpler structure&lt;/li&gt;
&lt;li&gt;Poor scalability&lt;/li&gt;
&lt;li&gt;High duplication&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;8. Implementation in Power BI&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Power Query (Data Preparation)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clean data&lt;/li&gt;
&lt;li&gt;Perform joins&lt;/li&gt;
&lt;li&gt;Handle missing values&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Model View (Data Modelling)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create relationships&lt;/li&gt;
&lt;li&gt;Define cardinality&lt;/li&gt;
&lt;li&gt;Configure filters&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Best Practice Workflow&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Load data&lt;/li&gt;
&lt;li&gt;Clean in Power Query&lt;/li&gt;
&lt;li&gt;Avoid unnecessary joins&lt;/li&gt;
&lt;li&gt;Build relationships in Model View&lt;/li&gt;
&lt;li&gt;Validate using visuals&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;9. Common Modelling Issues&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data duplication from excessive joins&lt;/li&gt;
&lt;li&gt;Incorrect cardinality&lt;/li&gt;
&lt;li&gt;Ambiguous filter paths&lt;/li&gt;
&lt;li&gt;Missing or inconsistent keys&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion and Key Takeaways&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Data modelling&lt;/strong&gt; is the foundation of effective analysis in Power BI. It defines how data is structured, interpreted, and ultimately how insights are derived.&lt;/p&gt;

&lt;p&gt;Throughout this article, we’ve seen how:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Joins&lt;/strong&gt; are used to reshape and prepare data by combining tables in Power Query&lt;br&gt;
&lt;strong&gt;Relationships&lt;/strong&gt; allow Power BI to connect tables logically, enabling efficient analysis without duplication&lt;br&gt;
&lt;strong&gt;Schemas&lt;/strong&gt;, particularly the &lt;strong&gt;star schema&lt;/strong&gt;, provide a scalable structure for organizing fact and dimension tables&lt;br&gt;
&lt;strong&gt;Data integrity&lt;/strong&gt; (e.g., handling missing or invalid records like StudentID 105) directly impacts the quality of insights&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Practical Takeaways&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;em&gt;Power Query&lt;/em&gt; for data cleaning and controlled joins&lt;/li&gt;
&lt;li&gt;Use &lt;em&gt;Model View&lt;/em&gt; to define relationships and control how data interacts&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Prefer 1:M relationships&lt;/em&gt; from dimension to fact tables&lt;/li&gt;
&lt;li&gt;Default to &lt;em&gt;single-direction filtering&lt;/em&gt; unless there is a clear need for bi-directional filtering&lt;/li&gt;
&lt;li&gt;Adopt a &lt;em&gt;star schema&lt;/em&gt; for most analytical scenarios&lt;/li&gt;
&lt;li&gt;Treat &lt;em&gt;missing or unmatched data&lt;/em&gt; as valuable signals, not just errors&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>data</category>
      <category>powerfuldevs</category>
      <category>newbie</category>
    </item>
    <item>
      <title>How Excel is Used in Real-World Data Analysis</title>
      <dc:creator>Tom Chege</dc:creator>
      <pubDate>Tue, 24 Mar 2026 06:13:39 +0000</pubDate>
      <link>https://dev.to/tom_chege/excel-data-cleaning-31p2</link>
      <guid>https://dev.to/tom_chege/excel-data-cleaning-31p2</guid>
      <description>&lt;p&gt;Working with real-world data is rarely clean. Unlike textbook examples, datasets often contain inconsistencies like text mixed with numbers, duplicate values, missing fields, and ambiguous identifiers.&lt;/p&gt;

&lt;p&gt;Over the past week, I’ve been exploring key Excel concepts such as error handling, aggregation, lookup functions, and data cleaning. Each of these plays a critical role in transforming raw, messy data into reliable insights.&lt;/p&gt;

&lt;p&gt;In this article, I’ll focus specifically on &lt;strong&gt;error handling&lt;/strong&gt; which is a foundational skill that helps ensure your formulas remain robust even when your data isn’t.&lt;/p&gt;




&lt;h2&gt;
  
  
  What are Excel errors and why do they matter?
&lt;/h2&gt;

&lt;p&gt;Excel errors are often seen as problems to eliminate, but they are actually signals. Each error tells you something specific about your data or logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#DIV/0!&lt;/code&gt; → You’re dividing by zero or an empty cell&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#N/A&lt;/code&gt; → A lookup couldn’t find a match&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#VALUE!&lt;/code&gt; → The data type is incorrect (e.g., text instead of a number)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#NAME?&lt;/code&gt; → Excel doesn’t recognize part of your formula&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ignoring these errors or masking them without understanding their cause can lead to misleading results. Instead, they should be treated as indicators of underlying data issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  The role of IFERROR
&lt;/h2&gt;

&lt;p&gt;One of the most commonly used tools for handling errors in Excel is the &lt;code&gt;IFERROR&lt;/code&gt; function. It allows you to return an alternative result when a formula fails.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(Bonus/Salary, 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that if Salary is missing or zero, the formula does not break but instead returns &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;⚠️ While this improves usability, it introduces a new responsibility: ensuring that the fall back value does not distort the meaning of your analysis.&lt;/p&gt;




&lt;h2&gt;
  
  
  The risk of hiding errors
&lt;/h2&gt;

&lt;p&gt;A common mistake is using &lt;code&gt;IFERROR&lt;/code&gt; to suppress errors without considering their implications.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(Salary * 0.1, 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Salary is missing, this formula returns &lt;code&gt;0&lt;/code&gt;, which may incorrectly suggest that the calculated value is genuinely zero.&lt;/p&gt;

&lt;p&gt;A more transparent approach would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(ISBLANK(Salary), "Missing Salary", Salary * 0.1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the issue visible and preserves the integrity of your data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Handling specific errors more intelligently
&lt;/h2&gt;

&lt;p&gt;Not all errors should be treated the same. In many cases, it is better to target specific error types.&lt;/p&gt;

&lt;p&gt;For example, when working with lookups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(ISNA(VLOOKUP(A2, A:B, 2, FALSE)), "Not Found", VLOOKUP(A2, A:B, 2, FALSE))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This distinguishes between a missing value (&lt;code&gt;#N/A&lt;/code&gt;) and other potential issues, allowing for more precise handling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Combining logic and error handling
&lt;/h2&gt;

&lt;p&gt;Robust formulas often combine conditional logic with error handling to cover multiple scenarios.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(
  IF(ISBLANK(A2), "No Input", XLOOKUP(A2, A:A, B:B)),
  "Not Found"
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checks for empty input -- &lt;code&gt;ISBLANK&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Performs a lookup when valid -- &lt;code&gt;XLOOKUP&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Returns a clear message if the lookup fails -- &lt;code&gt;"No Input"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Such layered logic makes your formulas more resilient and easier to interpret.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I have learnt about error handling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treat errors as signals, not just problems&lt;/li&gt;
&lt;li&gt;Avoid blindly replacing errors with default/placeholder values&lt;/li&gt;
&lt;li&gt;Use targeted checks such as &lt;code&gt;ISNA&lt;/code&gt; or &lt;code&gt;ISBLANK&lt;/code&gt; where appropriate&lt;/li&gt;
&lt;li&gt;Ensure default/placeholder values do not distort analysis&lt;/li&gt;
&lt;li&gt;Design formulas with real-world data imperfections in mind&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Final takeaway:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Errors are feedback. By understanding the types of errors, applying functions like &lt;code&gt;IFERROR&lt;/code&gt; thoughtfully, and combining them with logical checks, you can build Excel models that are both reliable and transparent.&lt;/p&gt;




</description>
      <category>learning</category>
      <category>data</category>
    </item>
    <item>
      <title>Creating a windows server VM on Azure</title>
      <dc:creator>Tom Chege</dc:creator>
      <pubDate>Thu, 19 Mar 2026 06:51:07 +0000</pubDate>
      <link>https://dev.to/tom_chege/creating-a-windows-server-vm-on-azure-3h6m</link>
      <guid>https://dev.to/tom_chege/creating-a-windows-server-vm-on-azure-3h6m</guid>
      <description>&lt;p&gt;Some problems in software are complex and then there are the other peculiar problems.&lt;/p&gt;

&lt;p&gt;The ones that appear simple until they quietly refuse to cooperate.&lt;/p&gt;

&lt;p&gt;Recently, I needed to spin up a virtual machine on &lt;strong&gt;Microsoft Azure&lt;/strong&gt;. Nothing fancy. Just a small server running &lt;strong&gt;Windows Server 2025 Datacenter&lt;/strong&gt; for a bit of experimentation.&lt;/p&gt;

&lt;p&gt;In theory, creating a VM in the cloud should be one of the most straightforward tasks in modern computing. Click a few buttons, choose an operating system, wait a moment, and somewhere in a distant datacenter a machine materializes.&lt;/p&gt;

&lt;p&gt;Reality, as it often does, had a slightly different plan.&lt;/p&gt;

&lt;p&gt;The deployment failed with a message that looked innocuous but carried just enough ambiguity to slow things down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The selected image is not valid for the specified location.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, it reads like a configuration mistake. Choose a different option and try again. But cloud systems rarely fail randomly; they fail for reasons that are usually hidden one layer deeper than the interface suggests.&lt;/p&gt;

&lt;p&gt;In this case, the issue was geographical. I discovered this after tinkering with various images and location settings.&lt;/p&gt;

&lt;p&gt;Azure operates dozens of data centers across the world. Each region has slightly different hardware, capacity, and image availability. When you select an operating system image, you are implicitly asking a very physical question: &lt;em&gt;Does this datacenter actually have that image available right now?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the answer is no.&lt;/p&gt;

&lt;p&gt;Once that realization clicks, the error message suddenly makes perfect sense.&lt;/p&gt;

&lt;p&gt;With that small puzzle resolved, I thought it would be useful to write down the exact process for creating a VM in Azure. If nothing else, it may spare someone else a few minutes of head scratching.&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating a Virtual Machine in Azure
&lt;/h2&gt;

&lt;p&gt;The starting point is the Azure portal.&lt;/p&gt;

&lt;p&gt;Open the dashboard and log in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://portal.azure.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This interface is essentially the command center for everything running on &lt;strong&gt;Microsoft&lt;/strong&gt;’s cloud infrastructure.&lt;/p&gt;

&lt;p&gt;Once inside, use the search bar and type &lt;strong&gt;Virtual Machines&lt;/strong&gt;. Select the service and click:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create → Azure Virtual Machine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That opens the configuration wizard where the real work begins.&lt;/p&gt;




&lt;h2&gt;
  
  
  Basic Configuration
&lt;/h2&gt;

&lt;p&gt;The first section defines the environment where the VM will live.&lt;/p&gt;

&lt;p&gt;Start by creating or selecting a &lt;strong&gt;resource group&lt;/strong&gt;. Resource groups act as containers that hold related infrastructure components.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vm-lab-rg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, give the machine a name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-first-vm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Naming may seem trivial, but good naming conventions save time later when environments grow larger.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing the Right Region
&lt;/h2&gt;

&lt;p&gt;Azure requires you to pick a geographic region where the VM will run.&lt;/p&gt;

&lt;p&gt;Some commonly reliable regions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;West Europe&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UK South&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UAE North&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The region choice affects latency, pricing, and as I learned sometimes which operating system images are available.&lt;/p&gt;




&lt;h2&gt;
  
  
  Selecting the Operating System
&lt;/h2&gt;

&lt;p&gt;This is the step where many deployments quietly succeed or fail.&lt;/p&gt;

&lt;p&gt;A widely compatible option is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Windows Server 2025 Datacenter: Azure Edition – x64 Gen2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This image integrates well with Azure’s virtualization environment and is generally available across most regions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing a VM Size
&lt;/h2&gt;

&lt;p&gt;Next comes the machine size. In cloud terms, this defines CPU power, memory, and &lt;code&gt;cost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For experimentation or lightweight workloads, something modest works well.&lt;/p&gt;

&lt;p&gt;Choosing a VM size is essentially selecting how powerful you want your rented computer to be.&lt;/p&gt;




&lt;h2&gt;
  
  
  Administrator Credentials
&lt;/h2&gt;

&lt;p&gt;Azure then asks you to create an administrator account for the machine.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Username: azureadmin
Password: ********
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are creating a Windows machine, enable the option that allows &lt;strong&gt;Remote Desktop (RDP)&lt;/strong&gt; access. This allows you to connect to the server after deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Storage and Networking
&lt;/h2&gt;

&lt;p&gt;For most use cases, the default settings here work perfectly well.&lt;/p&gt;

&lt;p&gt;Azure automatically provisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a virtual network&lt;/li&gt;
&lt;li&gt;a subnet&lt;/li&gt;
&lt;li&gt;a public IP address&lt;/li&gt;
&lt;li&gt;a network security rule for RDP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For storage, the default &lt;strong&gt;Standard SSD&lt;/strong&gt; disk is usually a good balance between performance and cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;p&gt;With the configuration complete, click &lt;strong&gt;Review + Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Azure validates the settings and then begins the deployment process.&lt;/p&gt;

&lt;p&gt;Within a couple of minutes the platform allocates compute resources, attaches storage, configures networking, and boots the virtual machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connecting to the Machine
&lt;/h2&gt;

&lt;p&gt;Once the deployment completes, the next step is actually getting into the server.&lt;/p&gt;

&lt;p&gt;Azure provides a few connection options through the portal, but the simplest approach is to connect using &lt;strong&gt;Microsoft Remote Desktop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After the VM is created, Azure automatically assigns a &lt;strong&gt;public IP address&lt;/strong&gt; to the machine. You can find it in the VM’s overview page inside &lt;strong&gt;Microsoft Azure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In my case, I simply copied that public IP and opened a connection through the Microsoft Remote Desktop client.&lt;/p&gt;

&lt;p&gt;The process looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host: &amp;lt;public-ip-address&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted, enter the administrator credentials you created during the VM setup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Username: azureadmin
Password: ********
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything is configured correctly and the RDP port was allowed during deployment the connection should establish within a few seconds.&lt;/p&gt;

&lt;p&gt;At that point, you are no longer looking at the Azure portal. You are looking at the desktop of a Windows machine running somewhere inside &lt;strong&gt;Microsoft’s global datacenter network.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yet there it is, responding to your keyboard and mouse as if it were sitting right in front of you.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Small Reflection
&lt;/h2&gt;

&lt;p&gt;Cloud computing often feels magical. Servers appear and disappear on command. Storage scales endlessly. Networks stretch across continents.&lt;/p&gt;

&lt;p&gt;But every now and then the illusion cracks just enough to remind you what is happening underneath.&lt;/p&gt;

&lt;p&gt;And sometimes, all it takes to see that reality is &lt;code&gt;a small error message about a missing image in chosen location&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
