SQLite Update from Select Query

Imagine you’re working on a project that involves managing customer orders and their shipping information. You find yourself in a situation where you need to update data in one table based on information from another table in SQLite. This scenario is common among developers, and it can be a bit challenging at first.

Don’t worry, though! This article will guide you through the process of updating data using SELECT statements in SQLite. We’ll explore practical examples, showcase sample outputs, and discuss real-world use cases to help you master this crucial skill. So, let’s dive in and unlock the power of updating data in SQLite!

Creating Sample Tables and Data

To begin, let’s set up some sample tables and data to work with. Consider the following table structure for tracking customer orders and their shipping details:

-- Create the customers table
CREATE TABLE customers (
  customer_id INTEGER PRIMARY KEY,
  name TEXT,
  email TEXT
);

-- Create the orders table
CREATE TABLE orders (
  order_id INTEGER PRIMARY KEY,
  customer_id INTEGER,
  order_date TEXT,
  total_amount DECIMAL(10, 2),
  shipping_status TEXT,
  FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);

Let’s populate these tables with some sample data:

-- Insert sample data into the customers table
INSERT INTO customers (name, email) VALUES
  ('John Doe', '[email protected]'),
  ('Jane Smith', '[email protected]'),
  ('Mike Johnson', '[email protected]');

-- Insert sample data into the orders table
INSERT INTO orders (customer_id, order_date, total_amount, shipping_status) VALUES
  (1, '2023-06-01', 100.50, 'Pending'),
  (2, '2023-06-02', 75.25, 'Shipped'),
  (1, '2023-06-03', 200.00, 'Pending'),
  (3, '2023-06-04', 50.00, 'Delivered');

With our sample tables and data ready, let’s explore the different ways to update data using SELECT statements in SQLite.

Updating Data Using a SELECT Statement

The most straightforward approach to update data in one table based on information from another table is to use a SELECT statement within the UPDATE statement. Here’s the general syntax:

UPDATE table1
SET column1 = (
  SELECT column2
  FROM table2
  WHERE table1.column3 = table2.column4
);

In this syntax, table1 represents the table you want to update, and column1 is the column you want to update with values from table2. The SELECT statement retrieves the desired value from table2 based on a condition that relates the two tables.

Let’s apply this technique to our sample tables. Suppose we want to update the shipping_status of an order based on the customer’s email address. Here’s how you can achieve that:

UPDATE orders
SET shipping_status = (
  SELECT CASE
    WHEN email LIKE '%@example.com' THEN 'Shipped'
    ELSE 'Pending'
  END
  FROM customers
  WHERE orders.customer_id = customers.customer_id
);

This example utilizes a CASE expression within the SELECT statement to determine the new value for the shipping_status column. If the customer’s email address ends with “@example.com“, we set the status to “Shipped”; otherwise, we set it to “Pending”. The WHERE clause ensures that we match the orders with their corresponding customers based on the customer_id foreign key.

After executing this UPDATE statement, the orders table will have the following data:

order_id | customer_id | order_date | total_amount | shipping_status
---------+-------------+------------+--------------+----------------
       1 |           1 | 2023-06-01 |       100.50 | Shipped        
       2 |           2 | 2023-06-02 |        75.25 | Shipped        
       3 |           1 | 2023-06-03 |       200.00 | Shipped        
       4 |           3 | 2023-06-04 |        50.00 | Shipped        

All the orders now have the shipping status set to “Shipped” because all the customers in our sample data have email addresses ending with “@example.com“.

Updating Multiple Columns

Sometimes, you may need to update multiple columns in a table based on information from another table. You can achieve this by modifying the SET clause in the UPDATE statement to include multiple-column assignments. Here’s an example:

UPDATE orders
SET
  shipping_status = (
    SELECT CASE
      WHEN email LIKE '%@example.com' THEN 'Shipped'
      ELSE 'Pending'
    END
    FROM customers
    WHERE orders.customer_id = customers.customer_id
  ),
  total_amount = (
    SELECT total_amount * 0.9
    FROM orders AS o
    WHERE o.order_id = orders.order_id
  )
WHERE order_date < '2023-06-03';

This example updates both the shipping_status and total_amount columns of the orders table. The shipping_status is updated based on the customer’s email address, similar to the previous example. The total_amount is updated by applying a 10% discount to the original amount, using a self-join on the orders table. The WHERE clause filters the orders to only update those placed before ‘2023-06-03’.

After executing this UPDATE statement, the orders table will have the following data:

order_id | customer_id | order_date | total_amount | shipping_status
---------+-------------+------------+--------------+----------------
       1 |           1 | 2023-06-01 |        90.45 | Shipped        
       2 |           2 | 2023-06-02 |        67.72 | Shipped        
       3 |           1 | 2023-06-03 |       200.00 | Pending        
       4 |           3 | 2023-06-04 |        50.00 | Shipped        

The orders placed before ‘2023-06-03’ have their total_amount discounted by 10%, while the shipping_status is updated based on the customer’s email address.

Updating with Joins

Another way to update data is by using information from multiple tables and joining it in the UPDATE statement. This approach allows you to combine data from multiple tables and use the combined result set to update the target table. Here’s an example:

UPDATE orders
SET shipping_status = CASE
    WHEN c.email LIKE '%@example.com' THEN 'Shipped'
    ELSE 'Pending'
  END
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.customer_id;

This example utilizes an inner join between the orders and customers tables based on the customer_id column. The join allows us to access the customer’s email address directly in the SET clause. We use a CASE expression to determine the new value for the shipping_status column based on the email address.

After executing this UPDATE statement, the orders table will have the following data:

order_id | customer_id | order_date | total_amount | shipping_status
---------+-------------+------------+--------------+----------------
       1 |           1 | 2023-06-01 |       100.50 | Shipped        
       2 |           2 | 2023-06-02 |        75.25 | Shipped        
       3 |           1 | 2023-06-03 |       200.00 | Shipped        
       4 |           3 | 2023-06-04 |        50.00 | Shipped        

All the orders now have the shipping status set to “Shipped” because all the customers in our sample data have email addresses ending with “@example.com“.

Summary

Updating data in one table based on information from another table is a common requirement in many database-driven applications. SQLite offers several ways to achieve this using SELECT statements within the UPDATE statement. Whether you need to update a single column or multiple columns, or use joins to combine data from multiple tables, SQLite has you covered.

Understanding and applying the techniques discussed in this article will enable you to efficiently update your SQLite database tables based on dynamic conditions and relationships between tables. Always consider the specific requirements of your application and choose the approach that best suits your needs.

With these powerful tools at your disposal, you’ll be well-equipped to handle complex data update scenarios in your SQLite database. Feel free to experiment with the provided examples and unleash the full potential of updating data using SELECT statements in SQLite!