<?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: John Kamau</title>
    <description>The latest articles on DEV Community by John Kamau (@johnnyk).</description>
    <link>https://dev.to/johnnyk</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%2F1153030%2F50e069b6-318d-40ce-aa69-672b5042ea63.jpeg</url>
      <title>DEV Community: John Kamau</title>
      <link>https://dev.to/johnnyk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johnnyk"/>
    <language>en</language>
    <item>
      <title>Asynchronous JavaScript: Callbacks, Promises, and Async/Await</title>
      <dc:creator>John Kamau</dc:creator>
      <pubDate>Fri, 21 Jun 2024 11:29:57 +0000</pubDate>
      <link>https://dev.to/johnnyk/asynchronous-javascript-callbacks-promises-and-asyncawait-57ei</link>
      <guid>https://dev.to/johnnyk/asynchronous-javascript-callbacks-promises-and-asyncawait-57ei</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;One of the most powerful features of the JavaScript language is the ability to handle asynchronous operations. Asynchronous programming allows developers to perform tasks like fetching data from a server or reading a file without blocking the main execution thread. This ensures that applications remain responsive and efficient, providing a smoother user experience and better performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basics of Asynchronous Programming
&lt;/h2&gt;

&lt;p&gt;In programming, operations can be either synchronous or asynchronous. Understanding the difference between these two types is crucial for effective programming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Synchronous Programming
&lt;/h2&gt;

&lt;p&gt;Synchronous programming blocks the execution of subsequent code until the current operation completes. This means that each task is performed one after the other, waiting for the previous one to finish.&lt;/p&gt;

&lt;p&gt;Consider a scenario where you need to book a flight, reserve a hotel room, and rent a car for a trip. In a synchronous world, you would call each service one by one, waiting on hold until each booking is confirmed before moving to the next. This approach can be problematic in certain situations, particularly when dealing with tasks that take a significant amount of time to complete.&lt;/p&gt;

&lt;p&gt;A good example is when a synchronous program performs a task that requires waiting for a response from a remote server. The program will be stuck waiting for the response and cannot do anything else until the response is returned. This is known as blocking, and it can lead to the application appearing unresponsive or “frozen” to the user.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvcrtislxp5wfp2cr0zg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvcrtislxp5wfp2cr0zg.png" alt="synchronous" width="720" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Asynchronous Programming
&lt;/h2&gt;

&lt;p&gt;In contrast, asynchronous programming allows the execution of subsequent code to proceed independently while waiting for the current operation to complete.&lt;/p&gt;

&lt;p&gt;Using the same scenario where you need to book a flight, reserve a hotel room, and rent a car for a trip, in an asynchronous world, you could call all three services simultaneously. While waiting for each service to confirm your booking, you can continue with other trip preparations, making the overall process faster and more efficient.&lt;/p&gt;

&lt;p&gt;Asynchronous programming allows a program to continue working on other tasks while waiting for external events, such as network requests, to occur. For example, while a program retrieves data from a remote server, it can continue to execute other tasks such as responding to user inputs. This greatly improves the performance and responsiveness of a program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friiogkmoe63dwg5pzz13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Friiogkmoe63dwg5pzz13.png" alt="asynchronous" width="590" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Asynchronous Operations
&lt;/h2&gt;

&lt;p&gt;In JavaScript, asynchronous programming can be achieved through a variety of techniques. In this article, we are going to cover ways in which you can do this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Callbacks
&lt;/h2&gt;

&lt;p&gt;Callbacks are one of the oldest and most widely used methods for handling asynchronous operations in JavaScript. A callback function is simply a function that is passed as an argument to another function and is executed after the completion of a task.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Declare function&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Execute function with a callback&lt;/span&gt;
&lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Data is being fetched...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We declare a function named fetchData that takes a callback function as an argument.&lt;/li&gt;
&lt;li&gt;Inside fetchData, the setTimeout function is used to simulate an asynchronous operation by delaying the execution of a callback function for 3 seconds.&lt;/li&gt;
&lt;li&gt;After the 3-second delay, the callback function passed to fetchData is invoked with a mock data object as its argument.&lt;/li&gt;
&lt;li&gt;The callback function passed to fetchData is an anonymous function that logs the received data object to the console.&lt;/li&gt;
&lt;li&gt;Output: Initially, a message “Data is being fetched…” is logged to the console. After 3 seconds, the mock data object is fetched, and the callback function is executed, logging the data object to the console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Callbacks are powerful because they allow us to continue with other tasks while waiting for asynchronous operations to complete. However, they can lead to callback hell, a situation where multiple nested callbacks make the code difficult to read and maintain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;processData1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;processData2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;processData3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// and so on...&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, each asynchronous operation depends on the result of the previous one, leading to deeply nested callbacks. As more operations are added, the code becomes increasingly difficult to manage, often resulting in bugs and decreased readability.&lt;/p&gt;

&lt;p&gt;Despite their drawbacks, callbacks are still widely used, especially in older codebases and libraries. Understanding how to use callbacks effectively is essential for any JavaScript developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Promises
&lt;/h2&gt;

&lt;p&gt;Promises provide a more elegant way to handle asynchronous operations compared to callbacks. A Promise represents a value that may be available now, in the future, or never. Promises have three states: Pending, Fulfilled, and Rejected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the fetchData function returns a Promise. Inside the Promise constructor, an asynchronous operation is simulated using setTimeout. Once the operation is complete, the resolve function is called with the fetched data.&lt;/p&gt;

&lt;p&gt;Promises allow for chaining using the then method, making it easy to perform sequential asynchronous operations. Additionally, error handling is simplified with the catch method, which handles any errors that occur during the execution of the Promise chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Async/Await: Simplifying Asynchronous Code
&lt;/h2&gt;

&lt;p&gt;Async/Await is a powerful feature in JavaScript that simplifies asynchronous programming by providing a more synchronous-looking syntax. While it builds on top of Promises, it offers a more intuitive way to handle asynchronous operations without directly dealing with Promise chains.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the fetchData function returns a Promise, as it did before. However, instead of chaining .then() and .catch() methods, the getData function is defined as an async function. Inside getData, the await keyword is used to pause the execution until the fetchData Promise resolves, making the asynchronous code flow appear synchronous.&lt;/p&gt;

&lt;p&gt;Using Async/Await simplifies error handling with traditional try/catch blocks, providing a more natural way to handle errors in asynchronous code. Overall, Async/Await makes asynchronous programming in JavaScript more readable and maintainable by allowing developers to write asynchronous code that looks and behaves like synchronous code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Applications of Asynchronous JavaScript
&lt;/h2&gt;

&lt;p&gt;Asynchronous JavaScript is essential for creating responsive and efficient applications. Here are some practical applications where asynchronous operations play a crucial role:&lt;/p&gt;

&lt;h2&gt;
  
  
  1.Fetching Data from APIs
&lt;/h2&gt;

&lt;p&gt;Applications often need to retrieve data from external APIs. Asynchronous operations allow the application to continue running while waiting for the data to be fetched.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchUserData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching user data:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;fetchUserData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the fetch API is used to retrieve user data. The await keyword ensures the code waits for the response before proceeding, without blocking the main thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.File Operations
&lt;/h2&gt;

&lt;p&gt;When working with files, such as reading or writing to the file system, asynchronous operations are essential to prevent the main thread from freezing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error reading file:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;File contents:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This message will be printed first&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, when fs.readFile() is called, Node.js initiates the file read operation but doesn't wait for it to complete. Instead, it registers the provided callback function and immediately continues executing the next line, which logs the message 'This message will be printed first'. When the file read operation completes, Node.js places the callback function in the event queue, and the event loop eventually dequeues and executes it on the main thread, logging the file contents or an error message.&lt;/p&gt;

&lt;p&gt;By using asynchronous programming for file operations, the main execution thread remains responsive and can handle other tasks while waiting for the file operation to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.Timers
&lt;/h2&gt;

&lt;p&gt;JavaScript provides the setTimeout and setInterval functions for scheduling code execution after a specified delay or at regular intervals, respectively. These functions are asynchronous, meaning they don't block the main execution thread while waiting for the specified time to elapse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Scheduling a recurring execution every second&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intervalId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This message will be displayed every second&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// After 5 seconds, stop the recurring execution&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intervalId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Interval cleared&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we store the identifier returned by setInterval in the intervalId variable. After 5 seconds (using setTimeout), we call clearInterval(intervalId), which stops the recurring execution scheduled by setInterval.&lt;/p&gt;

&lt;p&gt;The clearInterval function is useful when you want to stop a recurring task based on certain conditions, such as user interactions, state changes, or timers. Without clearInterval, the recurring execution would continue indefinitely unless the page is reloaded or the script is terminated.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.Animations
&lt;/h2&gt;

&lt;p&gt;Creating smooth animations is another important use case for asynchronous JavaScript. The requestAnimationFrame function is designed specifically for this purpose. It tells the browser to update an animation before the next repaint, ensuring optimal performance and efficient use of system resources.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myElement&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;animateElement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;position&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Update the position&lt;/span&gt;
  &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Move the element&lt;/span&gt;

  &lt;span class="c1"&gt;// Request the next animation frame&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animateElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Start the animation&lt;/span&gt;
&lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animateElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the animateElement function is recursively called using requestAnimationFrame until the desired position is reached. The browser handles these function calls asynchronously, ensuring that the animation runs smoothly without blocking the main execution thread, ensuring a seamless user experience in web applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  5.Event Handling
&lt;/h2&gt;

&lt;p&gt;Event handling in the browser is inherently asynchronous, as events are triggered by user interactions or other external factors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myButton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Button clicked!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This message will be displayed first&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, when the script runs, it logs the message 'This message will be displayed first' to the console immediately. However, the event handler function (() =&amp;gt; { console.log('Button clicked!'); }) is not executed until the user actually clicks the button.&lt;/p&gt;

&lt;p&gt;When the user clicks the button, the browser generates a click event and adds it to the event queue. The event loop detects the event in the queue and executes the registered event handler function, which logs the message 'Button clicked!' to the console.&lt;/p&gt;

&lt;p&gt;This asynchronous nature of event handling ensures that the JavaScript code doesn’t block the main execution thread while waiting for user interactions or other external events. The browser can continue to update the UI, parse HTML, execute other scripts, and perform other tasks while waiting for events to occur.&lt;/p&gt;

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

&lt;p&gt;The practical applications discussed are indeed among the most important and widely-used cases where asynchronous JavaScript is employed. However, these examples do not represent an exhaustive list.&lt;/p&gt;

&lt;p&gt;It is crucial to recognize that asynchronous programming is a widespread concept that finds applications in numerous other scenarios within the constantly evolving field of web development and beyond. As new technologies and use cases emerge, the significance of asynchronous programming in JavaScript is likely to continue increasing, ensuring efficient, responsive, and scalable applications across various domains.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Understanding SQL Joins: A Comprehensive Guide</title>
      <dc:creator>John Kamau</dc:creator>
      <pubDate>Wed, 05 Jun 2024 09:34:59 +0000</pubDate>
      <link>https://dev.to/johnnyk/understanding-sql-joins-a-comprehensive-guide-3c9g</link>
      <guid>https://dev.to/johnnyk/understanding-sql-joins-a-comprehensive-guide-3c9g</guid>
      <description>&lt;p&gt;SQL (Structured Query Language) is a powerful tool used for managing and manipulating relational databases. One of the most fundamental and essential features of SQL is the ability to join tables. Joins allow us to combine rows from two or more tables based on a related column between them.&lt;/p&gt;

&lt;p&gt;In this article we will explore the different types of SQL joins, their syntax, and examples to help you understand how to use them effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Joins?
&lt;/h2&gt;

&lt;p&gt;In SQL, joins are operations used to combine rows from two or more tables based on a related column between them. Joins are essential in relational databases because they allow you to retrieve data that is spread across multiple tables and present it in a unified way. This is particularly useful in normalized databases where related data is stored in separate tables to reduce redundancy and improve data integrity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Joins?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Data Normalization: In relational databases, data is often divided into multiple tables to eliminate redundancy. Joins allow you to reassemble this data as needed.&lt;/li&gt;
&lt;li&gt;Complex Queries: Joins enable complex queries that can extract meaningful insights from multiple related tables.&lt;/li&gt;
&lt;li&gt;Data Integrity: By linking tables through joins, you maintain data integrity and consistency, ensuring that related data is accurate and synchronized.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Types of SQL Joins
&lt;/h2&gt;

&lt;p&gt;There are various types of SQL joins. Let’s explore some of the most widely used ones:&lt;/p&gt;

&lt;h2&gt;
  
  
  1.INNER JOIN
&lt;/h2&gt;

&lt;p&gt;An INNER JOIN is one of the most commonly used joins in SQL. It returns only the rows that have matching values in both tables. If there is no match, the row is not included in the result set.&lt;/p&gt;

&lt;p&gt;The INNER JOIN essentially combines the data from two or more tables based on a related column, and it filters out rows that do not satisfy the join condition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fneaoxkhi8ucp4sc22hlb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fneaoxkhi8ucp4sc22hlb.png" alt="inner join" width="598" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax of INNER JOIN&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;columns&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;table1&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;table2&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;table1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;table1 and table2 are the names of the tables you want to join.&lt;/li&gt;
&lt;li&gt;common_column is the column that exists in both tables and is used as the join condition.&lt;/li&gt;
&lt;li&gt;columns are the columns you want to select in the result set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of INNER JOIN&lt;/strong&gt;&lt;br&gt;
Let’s consider two example tables: Employees and Departments.&lt;/p&gt;

&lt;p&gt;employees table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|---------|---------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;             &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;             &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;             &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;departments table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;department_name&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|-----------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;HR&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Finance&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;IT&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Marketing&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query&lt;br&gt;
&lt;/p&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;employees&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;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&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;departments&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;department_name&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;---------|-----------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;HR&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Finance&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;IT&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the INNER JOIN matches the department_id in the Employees table with the id in the Departments table. Only the rows where there is a match (i.e., department.id 1, 2, and 3) are included in the result set.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.LEFT JOIN
&lt;/h2&gt;

&lt;p&gt;A LEFT JOIN, also referred to as a LEFT OUTER JOIN, is a type of SQL join where all rows from the left table (table1) are returned regardless of whether there is a match in the right table (table2). It includes the matching rows from the right table based on a related column specified in the ON clause of the LEFT JOIN statement.&lt;/p&gt;

&lt;p&gt;This join condition ensures that for each row from the left table, the LEFT JOIN includes the corresponding matching rows from the right table in the result set. If there is no match found in the right table, NULL values are returned for the columns from the right table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg5arqdnmo34ivuifttf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg5arqdnmo34ivuifttf.png" alt="left join" width="591" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax of LEFT JOIN&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;columns&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;table1&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;table2&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;table1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;SELECT columns specifies the columns you want to select from the combined result set.&lt;/li&gt;
&lt;li&gt;table1 and table2 are the names of the tables you want to join.&lt;/li&gt;
&lt;li&gt;LEFT JOIN indicates that you're performing a left join.&lt;/li&gt;
&lt;li&gt;ON table1.common_column = table2.common_column specifies the join condition, where common_column is the column that exists in both tables and is used to match rows between them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of LEFT JOIN&lt;/strong&gt;&lt;br&gt;
Let’s consider two example tables: Customers and Orders.&lt;/p&gt;

&lt;p&gt;customers table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|---------|--------------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bob&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;charlie&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;david&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;orders table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|-------------|------------|----------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Laptop&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Smartphone&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Headphones&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Tablet&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query&lt;br&gt;
&lt;/p&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;customers&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;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&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;orders&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;---------|----------|------------|----------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Laptop&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Headphones&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Smartphone&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Tablet&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This query retrieves the name column from the customers table and the id (renamed to order_id), product, and quantity columns from the orders table, joining them on the id column of customers and the customer_id column of orders.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.RIGHT JOIN
&lt;/h2&gt;

&lt;p&gt;A RIGHT JOIN, also known as RIGHT OUTER JOIN, is a type of SQL join that returns all rows from the right table (table2) and includes matching rows from the left table (table1). The join condition is based on a related column between the two tables, specified in the ON clause of the RIGHT JOIN statement.&lt;/p&gt;

&lt;p&gt;The RIGHT JOIN ensures that all rows from the right table are retained in the result set, and for each row from the right table, it includes the corresponding matching rows from the left table based on the join condition. If there is no match found in the left table, NULL values are returned for the columns from the left table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85jjr0a199o26puvsd86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85jjr0a199o26puvsd86.png" alt="right join" width="575" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax of RIGHT JOIN&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;columns&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;table1&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;table2&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;table1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;SELECT columns specifies the columns you want to select from the combined result set.&lt;/li&gt;
&lt;li&gt;table1 and table2 are the names of the tables you want to join.&lt;/li&gt;
&lt;li&gt;RIGHT JOIN indicates that you're performing a right join.&lt;/li&gt;
&lt;li&gt;ON table1.common_column = table2.common_column specifies the join condition, where common_column is the column that exists in both tables and is used to match rows between them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of RIGHT JOIN&lt;/strong&gt;&lt;br&gt;
Let’s consider two example tables: Customers and Orders.&lt;/p&gt;

&lt;p&gt;customers table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|---------|--------------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bob&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;charlie&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;david&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;orders table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|-------------|------------|----------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Laptop&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Smartphone&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Headphones&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Tablet&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Keyboard&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;  &lt;span class="c1"&gt;-- Order with no associated customer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query&lt;br&gt;
&lt;/p&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;customers&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;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&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;orders&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;---------|----------|------------|----------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Laptop&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Smartphone&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Headphones&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Tablet&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Keyboard&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt;  &lt;span class="c1"&gt;-- Order with no associated customer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this result, you can see that the order with order_id 5, which has no associated customer (customer_id is NULL), appears in the result set with the customer name as NULL. This demonstrates the use of RIGHT JOIN to include records from the right table (orders table in this case) even if there is no matching record in the left table (customers table).&lt;/p&gt;

&lt;h2&gt;
  
  
  4.FULL JOIN
&lt;/h2&gt;

&lt;p&gt;A FULL JOIN, also known as a FULL OUTER JOIN, is a type of SQL join that returns all rows from both the left table (table1) and the right table (table2). When there is a match between the tables based on the join condition, the result set includes the matched rows from both tables. When there is no match, the result set includes NULL values for columns from the table without a match.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo75ufkfeucbaqmncezog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo75ufkfeucbaqmncezog.png" alt="full join" width="200" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax of FULL JOIN&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;columns&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;table1&lt;/span&gt;
&lt;span class="k"&gt;FULL&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;table2&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;table1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;columns specifies the columns you want to select.&lt;/li&gt;
&lt;li&gt;table1 and table2 are the names of the tables you want to join.&lt;/li&gt;
&lt;li&gt;FULL JOIN indicates that you're performing a full outer join.&lt;/li&gt;
&lt;li&gt;common_column is the column that exists in both tables and is used as the join condition.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of FULL JOIN&lt;/strong&gt;&lt;br&gt;
Let’s consider two example tables: customers and orders.&lt;/p&gt;

&lt;p&gt;customers table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|---------|--------------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bob&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;charlie&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;david&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;orders table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;order_date&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;total_amount&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|-------------|------------|--------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query:&lt;br&gt;
&lt;/p&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;customers&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;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_amount&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;FULL&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;order_date&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;total_amount&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;---------|----------|------------|--------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The FULL JOIN ensures that all rows from both tables are included in the result, with NULLs in place where there is no match.&lt;/p&gt;

&lt;h2&gt;
  
  
  5.CROSS JOIN
&lt;/h2&gt;

&lt;p&gt;A CROSS JOIN is a type of SQL join that returns the Cartesian product of the two joined tables. This means that each row from the first table is combined with each row from the second table. The result set includes all possible combinations of rows from both tables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt49o5dtrbczz85voo4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt49o5dtrbczz85voo4u.png" alt="cross join" width="290" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of CROSS JOIN&lt;/strong&gt;&lt;br&gt;
Let’s consider two example tables: customers and orders.&lt;/p&gt;

&lt;p&gt;customers table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|---------|--------------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;bob&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;charlie&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;david&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;products table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|------------|--------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;laptop&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mouse&lt;/span&gt;      &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;speaker&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We want to create a Cartesian product of the customers and products tables.&lt;/p&gt;

&lt;p&gt;Query:&lt;br&gt;
&lt;/p&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;customers&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;AS&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;products&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;AS&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;CROSS&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The CROSS JOIN will combine each row from the customers table with each row from the products table, resulting in the Cartesian product of the two tables. Here is what the result will look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;---------------|--------------|--------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;laptop&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mouse&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;speaker&lt;/span&gt;      &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;laptop&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mouse&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;speaker&lt;/span&gt;      &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;laptop&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mouse&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;speaker&lt;/span&gt;      &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;laptop&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mouse&lt;/span&gt;        &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;speaker&lt;/span&gt;      &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CROSS JOIN is especially useful for generating combinations and creating test data, but it should be used with caution due to the potential size of the result set. Understanding how to use CROSS JOIN can greatly enhance your ability to work with and analyze relational data.&lt;/p&gt;

&lt;h2&gt;
  
  
  6.SELF JOIN
&lt;/h2&gt;

&lt;p&gt;A SELF JOIN is a type of SQL join where a table is joined with itself. This is useful when you want to compare rows within the same table. It allows you to create relationships between rows in the same table based on certain conditions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax of SELF JOIN&lt;/strong&gt;&lt;br&gt;
&lt;/p&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;t1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;column2&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;t1 and t2 are aliases for the same table.&lt;/li&gt;
&lt;li&gt;common_column is the column that exists in both instances of the table and is used as the join condition.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example of SELF JOIN&lt;/strong&gt;&lt;br&gt;
Let’s consider an example with an employee table named employees.&lt;/p&gt;

&lt;p&gt;employees table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;manager_id&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;----|---------|------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NULL&lt;/span&gt;       &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We want to retrieve the names of employees and their respective managers.&lt;/p&gt;

&lt;p&gt;Query:&lt;br&gt;
&lt;/p&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;e1&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;AS&lt;/span&gt; &lt;span class="n"&gt;employee_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e2&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;AS&lt;/span&gt; &lt;span class="n"&gt;manager_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="n"&gt;e2&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The table employees is joined with itself using aliases e1 and e2. The join condition is based on the manager_id column in e1 matching the employee_id column in e2, establishing a relationship between employees and their respective managers.&lt;/p&gt;

&lt;p&gt;Here is what the result will look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;employee_name&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;manager_name&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;---------------|--------------|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alice&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt;      &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;           &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Charlie&lt;/span&gt;      &lt;span class="err"&gt;|&lt;/span&gt;
&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;David&lt;/span&gt;         &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Bob&lt;/span&gt;          &lt;span class="err"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SELF JOIN is a powerful SQL technique that enables you to join a table with itself, allowing for comparisons and relationships between rows within the same table. Understanding how to use SELF JOIN can be beneficial in various scenarios, especially when dealing with hierarchical data or comparing records within a dataset.&lt;/p&gt;

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

&lt;p&gt;Understanding SQL joins is necessary for anyone working with relational databases, as it allows for efficient data manipulation and extraction. By mastering these join techniques, you gain the ability to combine data from multiple tables, extract valuable insights, and make informed decisions based on relational data.&lt;/p&gt;

&lt;p&gt;Whether you’re a beginner learning SQL or an experienced professional, having a solid understanding of SQL joins is a foundational skill that will serve you well in your database querying endeavors.&lt;/p&gt;

&lt;p&gt;To further enhance your knowledge and skills in SQL, consider exploring advanced topics such as subqueries, window functions, and data modeling. Additionally, practice implementing SQL joins in real-world scenarios to reinforce your understanding and proficiency.&lt;/p&gt;

&lt;p&gt;By continually learning and practicing SQL joins, you’ll be better equipped to handle complex data analysis tasks and contribute effectively to data-driven decision-making processes in your organization.&lt;/p&gt;

&lt;p&gt;Happy querying!&lt;/p&gt;

</description>
      <category>sql</category>
      <category>database</category>
      <category>sqljoins</category>
      <category>data</category>
    </item>
    <item>
      <title>React Hooks : A Comprehensive Beginner’s Guide</title>
      <dc:creator>John Kamau</dc:creator>
      <pubDate>Thu, 09 May 2024 10:28:57 +0000</pubDate>
      <link>https://dev.to/johnnyk/react-hooks-a-comprehensive-beginners-guide-3bgc</link>
      <guid>https://dev.to/johnnyk/react-hooks-a-comprehensive-beginners-guide-3bgc</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;React is an open-source JavaScript-based user interface library, highly popular for web and mobile app development. It adheres to the principle of component-based architecture, where a component serves as an isolated and reusable piece of code. Components in React can be classified into two types: class components and functional components.&lt;/p&gt;

&lt;p&gt;Before version 16.8, React developers could only manage state and other features using class components. However, with the introduction of version 16.8, React introduced a new pattern known as Hooks. Hooks enable developers to utilize state and other React features within functional components, empowering them to apply functional programming principles in React.&lt;/p&gt;

&lt;p&gt;Throughout this article, we will delve into the fundamentals of React Hooks, exploring core concepts such as useState, useEffect, useContext, and the art of crafting custom hooks. By the end, you'll not only grasp the syntax and usage of Hooks but also gain a deeper appreciation for their role in streamlining React development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding React Hooks
&lt;/h2&gt;

&lt;p&gt;React Hooks are functions that enable functional components to “hook into” React features like state and life-cycle methods. They provide a more flexible and straightforward way to manage component logic, allowing developers to encapsulate behavior within functional components without using the class syntax.&lt;/p&gt;

&lt;p&gt;Before the introduction of Hooks, managing state and side effects in React components was primarily done using class components. However, class components come with their own set of complexities, such as handling this binding, and this lead to verbose code. Hooks were introduced to fix these problems and give an easier way to handle component logic.&lt;/p&gt;

&lt;p&gt;React Hooks offer several advantages over class components. Here are some of the key advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Simplified Syntax: Hooks offer cleaner and more concise code compared to class components.&lt;/li&gt;
&lt;li&gt;Reusability: Hooks enable the creation of custom reusable logic, enhancing modularity.&lt;/li&gt;
&lt;li&gt;Improved Readability: Co-locating logic with components improves code readability and reduces cognitive load.&lt;/li&gt;
&lt;li&gt;No this Keyword: Hooks eliminate the need for this, reducing confusion and potential bugs.&lt;/li&gt;
&lt;li&gt;Better Performance Optimization: Hooks enable React to optimize functional components more effectively.&lt;/li&gt;
&lt;li&gt;Easier Testing: Functional components with Hooks are easier to test compared to class components.&lt;/li&gt;
&lt;li&gt;Support for Functional Programming: Hooks encourage functional programming principles, leading to more predictable and maintainable code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A Practical View
&lt;/h2&gt;

&lt;p&gt;Now that we’ve discussed the two methods for creating React components — using functions and classes — let’s start by creating a simple class component. This component will display a counter with a button to increase the count. Afterward, we’ll convert it to a functional component using hooks and observe the differences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component without Hook: Class Component&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;import React, { Component } from 'react';

class CounterClass extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
    this.incrementCount = this.incrementCount.bind(this);
  }

  incrementCount() {
    this.setState(prevState =&amp;gt; ({
      count: prevState.count + 1
    }));
  }

  render() {
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;h2&amp;gt;Counter (Class Component)&amp;lt;/h2&amp;gt;
        &amp;lt;p&amp;gt;Count: {this.state.count}&amp;lt;/p&amp;gt;
        &amp;lt;button onClick={this.incrementCount}&amp;gt;Increment&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Components with Hook:Functional Component:&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;import React, { useState } from 'react';

function CounterFunction() {
  const [count, setCount] = useState(0);

  const incrementCount = () =&amp;gt; {
    setCount(prevCount =&amp;gt; prevCount + 1);
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h2&amp;gt;Counter (Function Component)&amp;lt;/h2&amp;gt;
      &amp;lt;p&amp;gt;Count: {count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={incrementCount}&amp;gt;Increment&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default CounterFunction;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Both the class component and the functional component with Hooks achieve the same functionality — they both render a counter with a button to increment the count. You can experiment with both codes in practice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this practical comparison, we can see how the function component with Hooks achieves the same functionality as the class component but with less boilerplate code. The Hook’s version offers a more concise and readable implementation, demonstrating the simplicity and effectiveness of React Hooks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core React Hooks
&lt;/h2&gt;

&lt;p&gt;When developing React applications, understanding the core React Hooks is paramount. These hooks, including useState, useEffect, and useContext, form the foundation for managing state and side effects within functional components. Each hook serves a specific purpose, offering developers powerful tools to streamline their development workflow and create robust, efficient applications.&lt;/p&gt;

&lt;p&gt;In this section, we will explore each of these core React Hooks in detail, diving into their syntax, usage, and practical applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  useState Hook
&lt;/h2&gt;

&lt;p&gt;The useState hook is a fundamental tool in React for managing state within functional components. Prior to the introduction of hooks, state management was primarily handled in class components. However, with the useState hook, functional components gain the ability to manage state in a straightforward and concise manner.&lt;/p&gt;

&lt;p&gt;The useState hook is used by importing it from the React library. It is then invoked within the functional component, typically during initialization. The hook returns an array containing the current state value and a function to update that state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from "react";

function FormComponent() {
  // Declare state variables for each input field
  const [firstName, setFirstName] = useState("");
  const [lastName, setLastName] = useState("");
  const [email, setEmail] = useState("");
  const [formSubmitted, setFormSubmitted] = useState(false);

  // Event handler for form submission
  const handleSubmit = (e) =&amp;gt; {
    e.preventDefault();
    // Set formSubmitted state to true
    setFormSubmitted(true);
    // Do something with the form data, e.g., submit to a server
    console.log("Form submitted:", { firstName, lastName, email });
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;form onSubmit={handleSubmit}&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor="firstName"&amp;gt;First Name:&amp;lt;/label&amp;gt;
          &amp;lt;input
            type="text"
            id="firstName"
            name="firstName"
            value={firstName}
            onChange={(e) =&amp;gt; setFirstName(e.target.value)}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor="lastName"&amp;gt;Last Name:&amp;lt;/label&amp;gt;
          &amp;lt;input
            type="text"
            id="lastName"
            name="lastName"
            value={lastName}
            onChange={(e) =&amp;gt; setLastName(e.target.value)}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;label htmlFor="email"&amp;gt;Email:&amp;lt;/label&amp;gt;
          &amp;lt;input
            type="email"
            id="email"
            name="email"
            value={email}
            onChange={(e) =&amp;gt; setEmail(e.target.value)}
          /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;button type="submit"&amp;gt;Submit&amp;lt;/button&amp;gt;
      &amp;lt;/form&amp;gt;
      {formSubmitted &amp;amp;&amp;amp; (
        &amp;lt;div&amp;gt;
          &amp;lt;h2&amp;gt;Form Submitted States:&amp;lt;/h2&amp;gt;
          &amp;lt;p&amp;gt;First Name: {firstName}&amp;lt;/p&amp;gt;
          &amp;lt;p&amp;gt;Last Name: {lastName}&amp;lt;/p&amp;gt;
          &amp;lt;p&amp;gt;Email: {email}&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
      )}
    &amp;lt;/div&amp;gt;
  );
}

export default FormComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the useState hook is used to manage both the state of the form input fields (firstName, lastName, and email) and the state to track the form submission status (formSubmitted). Each input field is associated with its own state variable, enabling dynamic updates through the onChange event handler. Upon form submission, the formSubmitted state is toggled to true, triggering the display of the submitted form states.&lt;/p&gt;

&lt;h2&gt;
  
  
  useEffect Hook
&lt;/h2&gt;

&lt;p&gt;The useEffect hook in React allows developers to perform side effects in functional components. These side effects can include fetching data from an API, subscribing to events, updating the DOM, and more.&lt;/p&gt;

&lt;p&gt;useEffect is called after every render of the component, and it enables React developers to encapsulate logic that needs to be executed in response to certain conditions, such as component mount, unmount, or updates to specific props or state variables. This hook takes two arguments: a function containing the side effect logic, and an optional array of dependencies that specify when the effect should be re-executed.&lt;/p&gt;

&lt;h2&gt;
  
  
  useEffect with No Dependencies
&lt;/h2&gt;

&lt;p&gt;When the useEffect hook is used without specifying any dependencies, it runs after the initial render and on every subsequent re-render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useEffect } from "react";

function CounterComponent() {
  const [count, setCount] = useState(0);

  // Effect without dependencies: runs after initial render and on every re-render
  useEffect(() =&amp;gt; {
    console.log('useEffect has been triggered')
    // Update document title with the current count
    document.title = `Clicked ${count} times`;
  });

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Click the button to increase count: {count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;Increase Count&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default CounterComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The useEffect function updates the document title with the current count value, ensuring it reflects the number of times the button has been clicked. When the button is clicked, the setCount function updates the state, triggering a re-render of the component and the execution of useEffect, which updates the document title again.&lt;/p&gt;

&lt;p&gt;This component demonstrates the use of the useEffect hook to perform side effects (updating the document title) that should occur after every render, without depending on any specific variables or state values.&lt;/p&gt;

&lt;h2&gt;
  
  
  useEffect with Empty Dependency Array
&lt;/h2&gt;

&lt;p&gt;The useEffect hook with an empty dependency array ([]) is used to perform side effects that should only occur once, after the initial render of the component. This means the effect runs only after the component mounts, and it doesn't depend on any variables or state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useEffect } from 'react';

function TimerComponent() {
  const [timer, setTimer] = useState(0);

  useEffect(() =&amp;gt; {
    // Setup subscription to a timer when compnent mounts
    const intervalId = setInterval(() =&amp;gt; {
      setTimer(prevTimer =&amp;gt; prevTimer + 1);
    }, 1000);

    // Cleanup function: Clear the subscription when component unmounts
    return () =&amp;gt; {
      clearInterval(intervalId);
    };
  }, []);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Timer: {timer}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default TimerComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this component, we utilize the useState hook to create a timer state variable for tracking elapsed time in secs. Within the useEffect hook, we establish a timer subscription using setInterval, incrementing the timer value every second. To prevent memory leaks, a cleanup function utilizing clearInterval is returned to clear the subscription upon component unmount.&lt;/p&gt;

&lt;p&gt;With an empty dependency array ([]), the effect runs only once after the initial render, ensuring proper setup of the timer subscription. Finally, the component displays the current timer value in a paragraph element.&lt;/p&gt;

&lt;h2&gt;
  
  
  useEffect With Dependencies
&lt;/h2&gt;

&lt;p&gt;When using the useEffect hook with dependencies, the effect will run after the initial render and then re-run whenever any of the dependencies change. This is useful for scenarios where you want to perform certain actions based on changes to specific variables or state values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useEffect } from 'react';

function CounterComponent() {
  const [count, setCount] = useState(0);

  useEffect(() =&amp;gt; {
    console.log('Count has changed:', count);
  }, [count]); // Dependency array with 'count'

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Count: {count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;Increase Count&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default CounterComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this component, we initialize a counter variable count using useState. The useEffect hook is configured with a dependency array [count], so it runs whenever count changes. Inside the effect, we log a message to the console indicating the change in count. Clicking the button updates count, triggering the effect again. If there were multiple dependencies specified in the array, the effect would run whenever any of them change. This allows React developers to perform actions in response to changes in specific variables or state values.&lt;/p&gt;

&lt;p&gt;In summary, the useEffect hook in React is exclusively used within function components and custom hooks to manage side effects. It allows developers to perform actions in response to changes in variables, state, or component lifecycle events. By specifying dependencies, developers can control when the effect runs, ensuring efficient execution. Cleanup functions can also be utilized to manage resource cleanup or subscription unsubscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  useContext Hook
&lt;/h2&gt;

&lt;p&gt;useContext is a React hook that offers a means to share data (context) across multiple components without explicitly passing it through props, thereby addressing the issue of prop drilling. It is part of the React Context API, which is integrated into the React library.&lt;/p&gt;

&lt;p&gt;By utilizing useContext, components can consume context values provided by a Provider higher up in the component tree, eliminating the need to pass data through intermediate components. This approach streamlines code and improves scalability.&lt;/p&gt;

&lt;p&gt;In a typical React project, you would organize your code into different files and folders. Here’s how the project might be structured:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
|-- components/
|   |-- ThemedComponent.jsx      // Contains ThemedComponent code
|-- contexts/
|   |-- ThemeContext.jsx           // Contains ThemeContext code
|-- App.jsx         
|-- main.jsx 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//ThemedComponent.jsx
import React, { useContext } from 'react';
import { ThemeContext } from '../contexts/ThemeContext';

const ThemedComponent = () =&amp;gt; {
  const theme = useContext(ThemeContext);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Current Theme: {theme}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default ThemedComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//ThemeContext.jsx
import React, { createContext } from 'react';

export const ThemeContext = createContext();

export const ThemeProvider = ({ children }) =&amp;gt; {
  const theme = 'light'; // For simplicity, hardcoding the theme here
  return (
    &amp;lt;ThemeContext.Provider value={theme}&amp;gt;
      {children}
    &amp;lt;/ThemeContext.Provider&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//App.jsx
import React from 'react';
import ThemedComponent from './components/ThemedComponent';
import { ThemeProvider } from './contexts/ThemeContext';

const App = () =&amp;gt; {
  return (
    &amp;lt;ThemeProvider&amp;gt;
      &amp;lt;ThemedComponent /&amp;gt;
    &amp;lt;/ThemeProvider&amp;gt;
  );
};

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the provided code, the useContext hook is used within the ThemedComponent functional component to directly consume the theme context from the ThemeContext.Provider. This approach simplifies data access by eliminating the need for prop drilling or callback functions&lt;/p&gt;

&lt;p&gt;By utilizing useContext, the component becomes independent of the specific location where the context is defined, enhancing its reusability and maintainability. Moreover, useContext facilitates cleaner component code, as it abstracts away the complexities of context usage, leading to more comprehensible components.&lt;/p&gt;

&lt;h2&gt;
  
  
  useReducer Hook
&lt;/h2&gt;

&lt;p&gt;This hook is used for managing complex state logic in a more organized and predictable way. It is especially beneficial when dealing with state objects that have multiple properties or when state transitions depend on the previous state&lt;/p&gt;

&lt;p&gt;The useReducer hook in React takes two arguments: a reducer function and an initial state value. The reducer function specifies how the state should be updated based on the action dispatched to it, taking the current state and action as arguments and returning the new state. The initial state value represents the starting state of the component and can be a simple value, object, or array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useReducer } from 'react';

// Define the reducer function
const reducer = (state, action) =&amp;gt; {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
};

const Counter = () =&amp;gt; {
  // Initialize state using useReducer
  const [state, dispatch] = useReducer(reducer, { count: 0 });

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Count: {state.count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; dispatch({ type: 'INCREMENT' })}&amp;gt;Increment&amp;lt;/button&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; dispatch({ type: 'DECREMENT' })}&amp;gt;Decrement&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Counter;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we utilize the useReducer hook to manage state in a React component. We start by defining a reducer function that handles state updates based on dispatched actions. Next, we initialize the state using useReducer, passing the reducer function and initial state as arguments. This hook returns an array containing the current state and a dispatch function.&lt;/p&gt;

&lt;p&gt;Within the component, we render the current count value from the state object and two buttons that dispatch INCREMENT and DECREMENT actions. When an action is dispatched, the reducer function updates the state accordingly, triggering a re-render of the component with the updated state.&lt;/p&gt;

&lt;h2&gt;
  
  
  useCallback Hook
&lt;/h2&gt;

&lt;p&gt;useCallback hook in React is used to memoize functions, optimizing performance by preventing unnecessary re-renders caused by function recreations. When a function is wrapped with useCallback, React will return the same memoized function reference on subsequent renders as long as the dependencies listed in the dependency array remain unchanged.&lt;/p&gt;

&lt;p&gt;The useCallback hook takes two arguments: the callback function and an array of dependencies. If any of the dependencies in the array change, the callback function is re-created; otherwise, the cached version of the function is returned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useCallback } from 'react';

//CounterButton.jsx
const CounterButton = ({ onClick }) =&amp;gt; {
  console.log('Rendering CounterButton');
  return &amp;lt;button onClick={onClick}&amp;gt;Click Me!&amp;lt;/button&amp;gt;;
};

//App.jsx
const App = () =&amp;gt; {
  const [count, setCount] = useState(0);

  // Define a memoized callback function using useCallback
  const handleClick = useCallback(() =&amp;gt; {
    setCount(prevCount =&amp;gt; prevCount + 1);
  }, []); // No dependencies, the function is created only once

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Counter: {count}&amp;lt;/h1&amp;gt;
      &amp;lt;CounterButton onClick={handleClick} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we utilize the useCallback hook to create a memoized callback function named handleClick. This function increments the count state by 1 when invoked. By specifying an empty dependency array [], we ensure that handleClick is memoized and created only once, returning the same function reference on subsequent renders. This optimization prevents unnecessary re-renders of the CounterButton component, as it no longer reacts to changes in the handleClick function reference. As a result, the application's performance is improved by avoiding unnecessary component re-renders.&lt;/p&gt;

&lt;h2&gt;
  
  
  useMemo hook
&lt;/h2&gt;

&lt;p&gt;useMemo hook in React is used to memoize the result of a computation, optimizing performance by caching expensive calculations and returning the cached value when the dependencies remain unchanged.&lt;/p&gt;

&lt;p&gt;It takes a function as its first argument, which computes the value to be memoized, and an array of dependencies as its second argument. When any of the dependencies change, the memoized value is recalculated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useMemo } from 'react';

const fibonacci = n =&amp;gt; {
  if (n &amp;lt;= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
};

const App = () =&amp;gt; {
  const [number, setNumber] = useState(20);
  const [otherState, setOtherState] = useState(false);

  // Memoize the result of the fibonacci calculation
  const fibResult = useMemo(() =&amp;gt; fibonacci(number), [number]);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Calculate Fibonacci Number&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;Number: {number}&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Fibonacci Result: {fibResult}&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Other State: {otherState.toString()}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setNumber(prevNumber =&amp;gt; prevNumber + 1)}&amp;gt;
        Increment Number
      &amp;lt;/button&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setOtherState(prevState =&amp;gt; !prevState)}&amp;gt;
        Toggle State
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we utilize the useMemo hook to optimize the performance of a Fibonacci calculation within a React functional component. The component manages a number state representing the input to the Fibonacci calculation using the useState hook. By employing useMemo, we memoize the result of the Fibonacci calculation based on the number state. This ensures that the expensive computation is only performed when the number state changes, preventing unnecessary recalculations during component re-renders.&lt;/p&gt;

&lt;p&gt;When we click on the “Toggle State” button, the App component re-renders due to the state update of otherState. However, despite the component re-rendering, the Fibonacci calculation is not recomputed unnecessarily. This is because useMemo memoizes the result of the Fibonacci calculation based on the number state, which remains unchanged when toggling otherState.&lt;/p&gt;

&lt;h2&gt;
  
  
  useRef Hook
&lt;/h2&gt;

&lt;p&gt;useRef hook in React is used to create a mutable reference that persists across re-renders of the component. Unlike useState, changes to a useRef value do not trigger a re-render of the component. useRef is commonly used to access and interact with DOM elements or to persist values across renders without triggering re-renders.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useRef } from 'react';

const App = () =&amp;gt; {
  const inputRef = useRef(null);

  const handleFocus = () =&amp;gt; {
    inputRef.current.focus();
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;input ref={inputRef} type="text" /&amp;gt;
      &amp;lt;button onClick={handleFocus}&amp;gt;Focus Input&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we utilize the useRef hook to create a reference named inputRef, which is then assigned to the ref attribute of an input element. When the "Focus Input" button is clicked, invoking the handleFocus function, the input element gains focus via inputRef.current.focus(). Despite this focus action, the component does not re-render because useRef does not trigger re-renders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other React Hooks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;useLayoutEffect Hook&lt;/strong&gt;: is similar to useEffect, but it’s executed synchronously after all DOM mutations have been applied but before the browser paints the changes on the screen. This makes it suitable for tasks that require measurements or DOM manipulations and need to be performed before the user sees the updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useDebugValue hook&lt;/strong&gt;: is a React hook that is used to provide additional debug information about custom hooks in React DevTools. It allows you to display custom labels and values for custom hooks in the React DevTools inspector, making it easier to debug and understand how custom hooks are being used in your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useImperativeHandle hook&lt;/strong&gt;: is used to customize the instance value that is exposed by a parent component when using the forwardRef feature in React. It allows child components to expose specific methods or properties to their parent components, providing a way to interact with the child component's instance from its parent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Hooks
&lt;/h2&gt;

&lt;p&gt;Custom hooks in React are JavaScript functions that utilize one or more built-in React hooks to encapsulate and share reusable logic across components. They allow developers to abstract complex logic into reusable pieces, promoting code reusability and composability.&lt;/p&gt;

&lt;p&gt;They must follow a naming convention where their names start with the prefix “use”. This convention is enforced by React’s ESLint rules to help developers distinguish between regular functions and custom hooks.&lt;/p&gt;

&lt;p&gt;Let’s create a useFetch custom hook that enables us to fetch data from a specified URL and handle loading states and errors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, useEffect } from 'react';

function useFetch(url) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() =&amp;gt; {
    const fetchData = async () =&amp;gt; {
      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error('Failed to fetch data');
        }
        const jsonData = await response.json();
        setData(jsonData);
        setLoading(false);
      } catch (error) {
        setError(error);
        setLoading(false);
      }
    };

    fetchData();
  }, [url]);

  return { data, loading, error };
}

export default useFetch;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This custom hook useFetch takes a URL as its parameter and returns an object containing the fetched data (data), a boolean flag indicating whether the data is still loading (loading), and any error that may occur during the fetch (error).&lt;/p&gt;

&lt;p&gt;You can use this custom hook in your components 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;import React from 'react';
import useFetch from './useFetch';

function MyComponent() {
  const { data, loading, error } = useFetch('https://api.example.com/data');

  if (loading) {
    return &amp;lt;p&amp;gt;Loading...&amp;lt;/p&amp;gt;;
  }

  if (error) {
    return &amp;lt;p&amp;gt;Error: {error.message}&amp;lt;/p&amp;gt;;
  }

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Data:&amp;lt;/h1&amp;gt;
      &amp;lt;pre&amp;gt;{JSON.stringify(data, null, 2)}&amp;lt;/pre&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default MyComponent;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this custom hook, you can easily fetch data from any API endpoint in your React components while handling loading states and errors in a clean and reusable manner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;React hooks have ushered in a new era of efficiency and effectiveness in web development. With hooks like useReducer for state management and useMemo and useCallback for performance optimization, developers can unlock new levels of productivity and innovation.&lt;/p&gt;

&lt;p&gt;They are not limited to experts; developers of all skill levels can leverage these tools. Whether you’re a seasoned professional or new to React, integrating these hooks into your projects can simplify code, improve performance, and elevate user experiences.&lt;/p&gt;

&lt;p&gt;In summary, React hooks are indispensable for React developers aiming to build faster and more responsive web applications.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>reacthooks</category>
      <category>reactjsdevelopment</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
