Sql Insert Into Select Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of SQL INSERT INTO SELECT

SQL INSERT INTO SELECT: Detailed Explanation and Important Information

Basic Syntax

The basic syntax for the INSERT INTO SELECT statement is as follows:

INSERT INTO target_table (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM source_table
WHERE condition;
  • target_table: The table where you want to insert data.
  • column1, column2, column3, ...: The columns in the target_table where you want to insert the new data. It's optional to specify column names if you are inserting data into all columns of the target_table in the same order as the SELECT statement.
  • source_table: The table from which you want to copy data.
  • WHERE condition: An optional condition to filter the rows you want to copy.

Example

Let's consider an example to make the concept clearer.

Suppose you have two tables, employees_source and employees_target, and you want to copy all employees from France into the employees_target table.

employees_source Table:

| employee_id | first_name | last_name | country | |-------------|------------|-----------|---------| | 1 | John | Doe | France | | 2 | Jane | Smith | USA | | 3 | Claude | Bernard | France |

employees_target Table (Initially Empty):

| employee_id | first_name | last_name | country | |-------------|------------|-----------|---------|

You can use the following SQL statement:

INSERT INTO employees_target (employee_id, first_name, last_name, country)
SELECT employee_id, first_name, last_name, country
FROM employees_source
WHERE country = 'France';

Result:

employees_target Table After Insert:

| employee_id | first_name | last_name | country | |-------------|------------|-----------|---------| | 1 | John | Doe | France | | 3 | Claude | Bernard | France |

Important Considerations

  1. Data Type Compatibility: Ensure that the data types of the columns in the target_table match the data types of the columns in the source_table.

  2. Column Count and Order: Make sure the number of columns and their order in the INSERT INTO clause match the number of columns and their order in the SELECT clause.

  3. Primary Key/Unique Constraints: If the target_table has a primary key or unique constraints, ensure that the data being inserted does not violate these constraints.

  4. Source Data Constraints: Review any constraints, triggers, or indexes on the source_table that might affect the data being selected.

  5. Performance Considerations: For large datasets, the INSERT INTO SELECT statement can be resource-intensive. Optimize your query with indexes and consider breaking it into smaller chunks if necessary.

  6. Default Values and NULLs: If a column in the target_table includes a default value and you don't specify that column in the INSERT INTO clause, the default value will be used. Conversely, if you want to insert NULL values, ensure that the column allows NULL values and explicitly specify NULL in the SELECT clause.

Advanced Usage

  1. Inserting Only Specific Columns: You can modify the INSERT INTO SELECT statement to insert only specific columns, which is useful when the target_table has columns that do not exist in the source_table.

    INSERT INTO employees_target (employee_id, first_name, last_name)
    SELECT employee_id, first_name, last_name
    FROM employees_source
    WHERE country = 'France';
    
  2. Combining INSERT INTO SELECT with Other Tables: You can also use subqueries or join statements within the SELECT clause to combine data from multiple tables before inserting it into the target_table.

    INSERT INTO employees_target (employee_id, first_name, last_name, country)
    SELECT s.employee_id, s.first_name, s.last_name, c.country_name
    FROM employees_source s
    JOIN countries c ON s.country_id = c.country_id
    WHERE c.country_name = 'France';
    
  3. Using NOT EXISTS or JOIN to Avoid Duplicates: To prevent inserting duplicate records, you can use NOT EXISTS or LEFT JOIN with a WHERE clause.

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement SQL INSERT INTO SELECT

Complete Example, Step-by-Step for a Beginner

1. Creating Source and Destination Tables

Let's start by creating two tables: a source table called EmployeesSource and a destination table called EmployeesArchive.

-- Create the source table with some initial data
CREATE TABLE EmployeesSource (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Department VARCHAR(50),
    Salary DECIMAL(10,2)
);

-- Insert some sample data into the source table
INSERT INTO EmployeesSource (EmployeeID, FirstName, LastName, Department, Salary) VALUES
(1, 'John', 'Doe', 'Finance', 50000.00),
(2, 'Jane', 'Smith', 'IT', 60000.00),
(3, 'Alex', 'Johnson', 'HR', 55000.00),
(4, 'Emily', 'Brown', 'Marketing', 48000.00),
(5, 'Michael', 'Davis', 'Marketing', 49000.00);
-- Create the destination table
CREATE TABLE EmployeesArchive (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Department VARCHAR(50),
    Salary DECIMAL(10,2)
);

2. Copying All Data Without Condition

If you want to copy all the data from EmployeesSource to EmployeesArchive, you can use the following SQL statement:

-- Insert all employees from EmployeesSource to EmployeesArchive
INSERT INTO EmployeesArchive (EmployeeID, FirstName, LastName, Department, Salary)
SELECT EmployeeID, FirstName, LastName, Department, Salary FROM EmployeesSource;

3. Copying Specific Columns and Data

Suppose you only want to copy specific columns and only those employees who work in the 'Marketing' department:

-- Insert marketing employees from EmployeesSource to EmployeesArchive
INSERT INTO EmployeesArchive (EmployeeID, FirstName, LastName, Department, Salary)
SELECT EmployeeID, FirstName, LastName, Department, Salary 
FROM EmployeesSource 
WHERE Department = 'Marketing';

4. Inserting Data Using Calculated Values

You can also perform calculations or transformations during the insertion process. For example, if you want to copy only the marketing employees and double their salaries:

-- Insert marketing employees with doubled salary
INSERT INTO EmployeesArchive (EmployeeID, FirstName, LastName, Department, Salary)
SELECT EmployeeID, FirstName, LastName, Department, Salary * 2
FROM EmployeesSource 
WHERE Department = 'Marketing';

5. Handling Primary Key Conflicts when Copying Data

If you are copying data into a table that already has some entries and you need to handle primary key conflicts, you might consider inserting only unique entries or updating existing ones. Here’s an example where we ensure that we do not insert duplicate employee IDs:

-- Insert only unique marketing employees
INSERT INTO EmployeesArchive (EmployeeID, FirstName, LastName, Department, Salary)
SELECT EmployeeID, FirstName, LastName, Department, Salary
FROM EmployeesSource 
WHERE Department = 'Marketing' AND EmployeeID NOT IN (SELECT EmployeeID FROM EmployeesArchive);

6. Combining Data from Several Tables

Sometimes, you may need to combine data from several tables before inserting it into a destination table. Let's say we have another table named Departments and we want to archive employees' information along with their department name only.

First, let's create the Departments table.

-- Create Departments table
CREATE TABLE Departments (
    DepartmentID INT PRIMARY KEY,
    DepartmentName VARCHAR(50)
);

-- Insert some sample data into the Departments table
INSERT INTO Departments (DepartmentID, DepartmentName) VALUES
(1, 'Finance'),
(2, 'IT'),
(3, 'HR'),
(4, 'Marketing');

Now, let's see how to combine data from EmployeesSource and Departments tables and insert into EmployeesArchive.

-- Clear existing data in EmployeesArchive to demonstrate combining from multiple tables
DELETE FROM EmployeesArchive;

-- Combine EmployeesSource and Departments data and insert into EmployeesArchive
INSERT INTO EmployeesArchive (EmployeeID, FirstName, LastName, Department, Salary)
SELECT es.EmployeeID, es.FirstName, es.LastName, d.DepartmentName, es.Salary
FROM EmployeesSource es
JOIN Departments d ON es.Department = d.DepartmentName
WHERE es.Department = 'Marketing';

7. Verifying the Data

Finally, let’s verify that the data was inserted correctly into EmployeesArchive.

Top 10 Interview Questions & Answers on SQL INSERT INTO SELECT

Top 10 Questions & Answers about SQL INSERT INTO SELECT

1. What is the purpose of the INSERT INTO SELECT statement in SQL?

Answer: The INSERT INTO SELECT statement allows you to copy data from one table and insert it into another table. This statement requires that both tables have similar structures (number of columns and data types should match). It can also be used to combine data from multiple tables or add specific rows based on conditions.

Example:

INSERT INTO CustomersBackup (CustomerID, CustomerName, City)
SELECT CustomerID, CustomerName, City FROM Customers;

2. Can I use INSERT INTO SELECT when the target and source tables have different structures?

Answer: No, typically you cannot directly use INSERT INTO SELECT if the target and source tables have different structures. They need to have compatible column types and counts. However, you can selectively map columns that match.

Example with Different Structures:

INSERT INTO NewTable (Column1, Column3)
SELECT ColumnX, ColumnZ FROM SourceTable;

Here, NewTable has at least two columns: Column1 and Column3, while SourceTable has ColumnX and ColumnZ which need to be compatible in terms of data type.

3. How do I handle NULL values in an INSERT INTO SELECT statement?

Answer: If a source column contains NULL, it will be inserted into the target column as NULL unless the target column is defined with a NOT NULL constraint. In such cases, you may need to explicitly handle NULLs using functions like ISNULL(), COALESCE(), etc.

Example Handling NULLs:

INSERT INTO OrdersBackup (OrderID, OrderDate, CustomerID)
SELECT OrderID, COALESCE(OrderDate, '2023-01-01'), CustomerID 
FROM Orders;

In this example, if OrderDate in the Orders table is NULL, it gets replaced by '2023-01-01'.

4. Can I insert data from multiple tables into another table using INSERT INTO SELECT?

Answer: Yes, you can use JOIN clauses within your INSERT INTO SELECT statement to join data from multiple tables before inserting it into another table.

Example:

INSERT INTO CombinedTable (OrderID, CustomerName, Country)
SELECT Orders.OrderID, Customers.CustomerName, Customers.Country
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

5. How can I insert only distinct records from the source table into the target table?

Answer: You can use the DISTINCT keyword within your SELECT clause to ensure that only unique records are inserted into the target table from the source table.

Example:

INSERT INTO UniqueCustomers (CustomerID, CustomerName)
SELECT DISTINCT CustomerID, CustomerName
FROM Customers;

6. Is it possible to use conditions in an INSERT INTO SELECT statement?

Answer: Yes, conditions can indeed be used via the WHERE clause to filter which rows should be inserted into the target table from the source table.

Example:

INSERT INTO ActiveCustomers (CustomerID, CustomerName, Country, Status)
SELECT CustomerID, CustomerName, Country, Status
FROM Customers
WHERE Status = 'Active';

7. What happens if the INSERT INTO SELECT statement results in a violation of primary key constraints?

Answer: An error will be thrown if trying to insert duplicate primary keys. To prevent this, you can use conditional logic to avoid inserting duplicates or ensure uniqueness.

Example Avoiding Duplicates:

INSERT INTO CustomersBackup (CustomerID, CustomerName, City)
SELECT CustomerID, CustomerName, City
FROM Customers
WHERE CustomerID NOT IN (SELECT CustomerID FROM CustomersBackup);

8. How can I copy all the records from a table to another one using INSERT INTO SELECT?

Answer: If you want to copy all records from one table to another, and the structure matches, you can use SELECT *.

Example:

INSERT INTO CustomersBackup (CustomerID, CustomerName, Country, City)
SELECT * FROM Customers;

Make sure that the number, order, and data types of all columns in the source table exactly match those required by the target table.

9. Can INSERT INTO SELECT statement cause performance issues?

Answer: Yes, INSERT INTO SELECT can potentially result in performance issues, especially with large tables. This occurs because it involves reading from one table and writing to another in a single operation. Some strategies to mitigate this include indexing appropriately, updating statistics, and optimizing queries.

10. How can I ensure transactional integrity when performing bulk insert operations using INSERT INTO SELECT?

Answer: To ensure transactional integrity, you should wrap the INSERT INTO SELECT statement inside a transaction block. If something goes wrong, you can roll back and maintain data consistency.

Example:

BEGIN TRANSACTION;

INSERT INTO SalesBackups (SaleID, ProductID, QuantitySold, SaleDate)
SELECT SaleID, ProductID, QuantitySold, SaleDate FROM Sales
WHERE SaleDate BETWEEN '2021-01-01' AND '2021-12-31';

COMMIT TRANSACTION; -- Or ROLLBACK TRANSACTION;

This ensures that either all rows are inserted or none are, maintaining database consistency.

You May Like This Related .NET Topic

Login to post a comment.