-
Giới thiệu về phân tích dữ liệu và các công cụ
-
Ngôn ngữ SQL Cơ bản
-
Ngôn ngữ SQL nâng cao
-
Giới thiệu về Power BI và các kỹ thuật tổng hợp làm sạch dữ liệu
-
Trực quan hóa dữ liệu với Power BI
-
Xuất bản và chia sẻ
Chèn dữ liệu với INSERT
Chèn dữ liệu với lệnh INSERT trong SQL
Giới thiệu
Trong chương này, chúng ta sẽ tìm hiểu cách INSERT INTO Câu lệnh SQL hoạt động và các tùy chọn khác nhau được sử dụng với câu lệnh INSERT.
Chèn câu lệnh INTO trong SQL
Câu lệnh INSERT INTO trong SQL được sử dụng để chèn một bản ghi hoặc nhiều bản ghi vào một bảng cơ sở dữ liệu bằng SQL.
Câu lệnh INSERT INTO trong SQL thêm dữ liệu của một hoặc nhiều bản ghi vào cơ sở dữ liệu. Tất cả các hàng có thể được chèn vào hoặc một tập hợp con có thể được chọn bằng cách sử dụng một điều kiện.
Đây là cú pháp của câu lệnh INSERT INTO. INSERT INTO được theo sau bởi một tên bảng với các cột của nó và theo sau là VALUES và các giá trị của các cột tương ứng.
Cú pháp
- INSERT INTO table
- (column1, column2, … )
- VALUES
- (expression1, expression2, … ),
- (expression1, expression2, … ),
- …;
Chèn một hàng vào bảng
Ví dụ sau chèn một hàng vào bảng EmployeeDetails trong cơ sở dữ liệu mẫu.
Các cột trong bảng này là EmpId, EmpName, EmpAddress và EmpCity. Vì các giá trị cho tất cả các cột được cung cấp và được liệt kê theo thứ tự giống như các cột trong bảng nên không cần phải chỉ định tên cột trong danh sách cột.
Cú pháp
- Insert into EmployeeDetails values(‘Ravi’,‘c-321 Sector55 Noida’,‘Noida’,‘Noida’,9978654332)
Ví dụ
Chèn nhiều hàng vào một bảng
Câu lệnh INSERT INTO có thể được sử dụng để chèn nhiều hàng bằng cách nhóm câu lệnh. SQL sau chèn ba hàng vào bảng EmployeeDetail trong cơ sở dữ liệu mẫu. Vì các giá trị cho tất cả các cột được cung cấp và được liệt kê theo thứ tự giống như các cột trong bảng nên không cần phải chỉ định tên cột trong danh sách cột.
Cú pháp
- Insert into EmployeeDetails values(‘Ravi’,‘c-321 Sector55 Noida’,‘Noida’,‘Noida’,9978654332,‘Rohan’,
- ‘D-211 NoidaSector44’,‘Noida’,‘GauthamBudhNagar’,9865454398,
- ‘Rohit’,‘C-321 Sector 64 Faridabad’,‘Faridabad’,‘OldFaridabad’,9892124359)
Ví dụ
Chèn dữ liệu không theo cùng thứ tự với các cột trong bảng
Ví dụ này sử dụng danh sách cột để xác định rõ ràng các giá trị được chèn vào mỗi cột.
Thứ tự cột trong bảng EmployeeDetail trong cơ sở dữ liệu Mẫu là EmpName, EmpAddress, EmpCity; tuy nhiên, các cột không được liệt kê theo thứ tự đó trong column_list .
Cú pháp
- Insert into EmployeeDetails values(‘PriyanK’,‘Indrapuram,’,‘Ghaziabd’, ‘Ghaziabad’,9055345544, GETDATE());
Chèn dữ liệu vào bảng với các cột có giá trị mặc định
Câu lệnh này cho thấy việc chèn hàng vào bảng có cột tự động tạo giá trị hoặc có giá trị mặc định. Column_1 là cột được tính toán tự động tạo giá trị bằng cách nối chuỗi có giá trị được chèn vào column_2. Column_2 được xác định với một ràng buộc mặc định.
Nếu một giá trị không được chỉ định cho cột này, thì giá trị mặc định sẽ được sử dụng.
Column_3 được xác định bằng kiểu dữ liệu phiên bản hàng, kiểu này sẽ tự động tạo một số nhị phân tăng dần, duy nhất.
Column_4 không tự động tạo giá trị. Khi một giá trị cho cột này không được chỉ định, NULL sẽ được chèn vào. Câu lệnh INSERT chèn các hàng chứa giá trị cho một số cột nhưng không phải tất cả. Trong câu lệnh INSERT cuối cùng, không có cột nào được chỉ định và chỉ các giá trị mặc định được chèn bằng cách sử dụng mệnh đề DEFAULT VALUES.
Cú pháp
- CREATE TABLE Employee
- (
- column_1 AS ‘Computed column ‘ + column_2,
- column_2 varchar(30)
- CONSTRAINT default_name DEFAULT (‘my column default’),
- column_3 rowversion,
- column_4 varchar(40) NULL
- );
- GO
- INSERT INTO Employee (column_4)
- VALUES (‘Explicit value’);
- INSERT INTO Employee (column_2, column_4)
- VALUES (‘Explicit value’, ‘Explicit value’);
- INSERT INTO Employee (column_2)
- VALUES (‘Explicit value’);
- INSERT INTO Employee DEFAULT VALUES;
- GO
- SELECT column_1, column_2, column_3, column_4
- FROM Employee;
- GO
Chèn dữ liệu vào bảng có cột nhận dạng
INSERT dữ liệu vào một cột nhận dạng. Hai câu lệnh INSERT đầu tiên cho phép tạo các giá trị nhận dạng cho các hàng mới.
Câu lệnh INSERT thứ ba ghi đè thuộc tính IDENTITY cho cột bằng câu lệnh SET IDENTITY_INSERT và chèn một giá trị rõ ràng vào cột nhận dạng.
Cú pháp
- CREATE TABLE StudentDetail (
- StudentID int IDENTITY(1,1),
- StudentName varchar(50),
- StudentAddress varchar(50),
- StudentCiy varchar(50)
- )
- Go
- INSERT StudentDetail VALUES (‘Ravin’,‘101 Noida Sector 63’,‘Noida’);
- INSERT StudentDetail VALUES (‘Rohit’,‘103 Rahul Vihar’,‘NewDelhi’);
- GO
- SET IDENTITY_INSERT StudnetDetail ON;
- GO
- INSERT INTO StudentDetail(StudentID,StudentName,StudentAddress,StudentCiy)
- VALUES (‘Amar’,‘flatNo108 Preet Vihar’,‘NewDelhi’);
- GO
- SELECT StudentID,StudentName,StudentAddress,StudentCiy
- FROM StudentDetail
- GO
Ví dụ
Chèn dữ liệu vào cột định danh duy nhất bằng cách sử dụng NEWID()
Cột uniquidentifier sử dụng hàm NEWID() để lấy GUID cho column_2. Không giống như các cột nhận dạng, Database Engine không tự động tạo các giá trị cho các cột có kiểu dữ liệu định danh duy nhất, như được hiển thị bởi câu lệnh INSERT thứ hai.
Cú pháp
- CREATE TABLE CollegeDetail
- (
- CollegeId int IDENTITY,
- CollegeName uniqueidentifier,
- );
- GO
- INSERT INTO dbo.CollegeDetail(CollegeName)
- VALUES (NEWID());
- INSERT INTO CollegeDetail DEFAULT VALUES;
- GO
- SELECT CollegeId, CollegeName
- FROM CollegeDetail
Ví dụ
INSERT INTO với các tùy chọn SELECT và EXECUTE để chèn dữ liệu từ các bảng khác
Ví dụ sau đây cho thấy cách chèn dữ liệu từ một bảng vào một bảng khác bằng cách sử dụng lệnh INSERT…SELECT hoặc INSERT…EXECUTE. Mỗi cái dựa trên một câu lệnh SELECT nhiều bảng bao gồm một biểu thức và một giá trị bằng chữ trong danh sách cột.
Câu lệnh INSERT đầu tiên sử dụng câu lệnh SELECT để lấy dữ liệu từ các bảng nguồn (Employee, EmployeeDetails, and EmployeeDetail) trong cơ sở dữ liệu Sample và lưu trữ tập hợp kết quả trong bảng EmployeeDetails. Câu lệnh INSERT thứ hai sử dụng mệnh đề EXECUTE để gọi một thủ tục được lưu trữ có chứa câu lệnh SELECT và câu lệnh INSERT thứ ba sử dụng mệnh đề EXECUTE để tham chiếu câu lệnh SELECT dưới dạng một chuỗi ký tự.
Cú pháp
- CREATE TABLE NewEmployeeDetail
- (
- Id int Primary kei Identity(1,1),
- DataSource varchar(20) NOT NULL,
- BusinessEntityID varchar(11) NOT NULL,
- LastName varchar(40) NOT NULL,
- SalesDollars money NOT NULL
- );
- GO
- CREATE PROCEDURE dbo.uspGetEmployeeSales
- AS
- SET NOCOUNT ON;
- SELECT ‘PROCEDURE’, sp.BusinessEntityID, c.LastName,
- sp.SalesYTD
- FROM Sales.SalesPerson AS sp
- INNER JOIN Person.Person AS c
- ON sp.BusinessEntityID = c.BusinessEntityID
- WHERE sp.BusinessEntityID LIKE ‘2%’
- ORDER BY sp.BusinessEntityID, c.LastName;
- GO
- –INSERT…SELECT example
- INSERT INTO dbo.EmployeeSales
- SELECT ‘SELECT’, sp.BusinessEntityID, c.LastName, sp.SalesYTD
- FROM Sales.SalesPerson AS sp
- INNER JOIN Person.Person AS c
- ON sp.BusinessEntityID = c.BusinessEntityID
- WHERE sp.BusinessEntityID LIKE ‘2%’
- ORDER BY sp.BusinessEntityID, c.LastName;
- GO
- –INSERT…EXECUTE procedure example
- INSERT INTO dbo.EmployeeSales
- EXECUTE dbo.uspGetEmployeeSales;
- GO
- –INSERT…EXECUTE(‘string’) example
- INSERT INTO dbo.EmployeeSales
- EXECUTE
- (‘
- SELECT ”EXEC STRING”, sp.BusinessEntityID, c.LastName,
- sp.SalesYTD
- FROM Sales.SalesPerson AS sp
- INNER JOIN Person.Person AS c
- ON sp.BusinessEntityID = c.BusinessEntityID
- WHERE sp.BusinessEntityID LIKE ”2%”
- ORDER BY sp.BusinessEntityID, c.LastName
- ‘);
- GO
- –Show results.
- SELECT DataSource,BusinessEntityID,LastName,SalesDollars
- FROM dbo.EmployeeSales;
Chèn biểu thức bảng chung để xác định dữ liệu
Câu lệnh INSERT tạo bảng NewEmployee trong Sampledatabase. Một biểu thức bảng chung (EmployeeDetails) xác định các hàng từ một hoặc nhiều bảng sẽ được chèn vào bảng NewEmployee. Câu lệnh INSERT tham chiếu đến các cột trong biểu thức bảng chung.
Cú pháp
- CREATE TABLE NewEmployee
- (
- EmployeeID int NOT NULL,
- LastName nvarchar(50) NOT NULL,
- FirstName nvarchar(50) NOT NULL,
- PhoneNumber Phone NULL,
- AddressLine1 nvarchar(60) NOT NULL,
- City nvarchar(30) NOT NULL,
- State nchar(3) NOT NULL,
- PostalCode nvarchar(15) NOT NULL,
- CurrentFlag Flag
- );
- GO
- WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,
- Address, City, StateProvince,
- PostalCode, CurrentFlag)
- AS (SELECT
- e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,
- a.AddressLine1, a.City, sp.StateProvinceCode,
- a.PostalCode, e.CurrentFlag
- FROM HumanResources.Employee e
- INNER JOIN Person.BusinessEntityAddress AS bea
- ON e.BusinessEntityID = bea.BusinessEntityID
- INNER JOIN Person.Address AS a
- ON bea.AddressID = a.AddressID
- INNER JOIN Person.PersonPhone AS pp
- ON e.BusinessEntityID = pp.BusinessEntityID
- INNER JOIN Person.StateProvince AS sp
- ON a.StateProvinceID = sp.StateProvinceID
- INNER JOIN Person.Person as c
- ON e.BusinessEntityID = c.BusinessEntityID
- )
- INSERT INTO NewEmployee
- SELECT EmpID, LastName, FirstName, Phone,
- Address, City, StateProvince, PostalCode, CurrentFlag
- FROM EmployeeTemp;
- GO
INSERT TOP để giới hạn dữ liệu được chèn từ bảng nguồn
INSERT tạo bảng Employee và chèn tên cũng như dữ liệu bán hàng từ đầu năm đến nay cho 5 nhân viên ngẫu nhiên hàng đầu từ bảng EmployeeDetails. EmployeeId trong cơ sở dữ liệu Sample database. Câu lệnh INSERT chọn bất kỳ 5 hàng nào được trả về bởi câu lệnh SELECT.
Mệnh đề OUTPUT hiển thị các hàng được chèn vào bảng EmployeeDetails. Lưu ý rằng mệnh đề ORDER BY trong câu lệnh SELECT không được sử dụng để xác định 5 nhân viên hàng đầu.
Cú pháp
- CREATE TABLE Employee
- ( EmployeeID nvarchar(11) NOT NULL,
- LastName nvarchar(20) NOT NULL,
- FirstName nvarchar(20) NOT NULL,
- YearlySales money NOT NULL
- );
- GO
- INSERT TOP(5)INTO employeeDetails
- OUTPUT inserted.EmployeeID, inserted.FirstName,
- inserted.LastName, inserted.YearlySales
- SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
- FROM Employee AS sp
- INNER JOIN Person.Person AS c
- ON sp.BusinessEntityID = c.BusinessEntityID
- WHERE sp.SalesYTD > 250000.00
- ORDER BY sp.SalesYTD DESC;
INSERT dữ liệu bằng cách chỉ định dạng xem trong SQL
INSERT chỉ định tên chế độ xem làm đối tượng đích; tuy nhiên, hàng mới được chèn vào bảng cơ sở bên dưới. Thứ tự của các giá trị trong câu lệnh INSERT phải khớp với thứ tự cột của dạng xem.
Cú pháp
- CREATE TABLE Students (StudentID int, StudentName varchar(30));
- GO
- CREATE VIEW Student AS
- SELECT StudentID, StudentName
- FROM Students
- GO
- INSERT INTO Student
- VALUES (1,‘Ravi’);
- GO
- SELECT StudentID, StudentName from Students
- GO
- SELECT StudentID,StudentName
- FROM Student
- GO
Ví dụ
Chèn dữ liệu vào một biến bảng
Dữ liệu INSERT chỉ định một biến bảng làm đối tượng đích trong cơ sở dữ liệu Sample database.
Cú pháp
- — Create the table variable.
- DECLARE @MyTableVar table(
- LocationID int NOT NULL,
- CostRate smallmoney NOT NULL,
- NewCostRate AS CostRate * 1.5,
- ModifiedDate datetime);
- — Insert values into the table variable.
- INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)
- SELECT LocationID, CostRate, GETDATE()
- FROM Production.Location
- WHERE CostRate > 0;
- — View the table variable result set.
- SELECT * FROM @MyTableVar;
- GO
Chèn hàng vào bảng từ xa
Phần này trình bày cách chèn các hàng vào bảng mục tiêu từ xa bằng cách sử dụng máy chủ được liên kết hoặc chức năng tập hợp hàng để tham chiếu bảng từ xa.
Chèn dữ liệu vào bảng từ xa bằng cách sử dụng máy chủ được liên kết
Điều này INSERT các hàng vào một bảng từ xa. Ví dụ bắt đầu bằng cách tạo một liên kết đến nguồn dữ liệu từ xa bằng cách sử dụng sp_addlinkedserver. Tên máy chủ được liên kết, MyLinkServer, sau đó được chỉ định như một phần của tên đối tượng gồm bốn phần ở dạng server.catalog.schema.object .
Cú pháp
- USE master;
- GO
- — Create a link to the remote data source.
- — Specify a valid server name for @datasrc as ‘server_name’
- — or ‘server_nameinstance_name’.
- EXEC sp_addlinkedserver @server = N‘MyLinkServer’,
- @srvproduct = N‘ ‘,
- @provider = N‘SQLNCLI’,
- @datasrc = N‘server_name’,
- @catalog = N‘Sample’;
- GO
Chèn dữ liệu vào một bảng từ xa bằng cách sử dụng hàm OPENQUERY
INSERT một hàng vào một bảng từ xa bằng cách chỉ định hàm OPENQUERY rowset.
Tên máy chủ được liên kết được tạo trong ví dụ trước được sử dụng trong ví dụ này.
Cú pháp
- INSERT OPENQUERY (MyLinkServer,
- ‘SELECT EmployeeName, EmployeeAddress
- FROM Sample.EmployeeDetails’)
- VALUES (‘Ravi’, ‘Noida’);
- GO
Chèn dữ liệu vào một bảng từ xa bằng cách sử dụng chức năng OPENDATASOURCE
Cú pháp
- INSERT INTO OPENDATASOURCE(‘SQLNCLI’,
- ‘Data Source= <server_name>; Integrated Security=SSPI’)
- EmployeeDetail (EmpName, EmpAddress)
- VALUES (‘Rahul’, ‘Noida63’);
- GO
Chèn vào một bảng bên ngoài được tạo bằng PolyBase
INSERT có thể được sử dụng để Xuất dữ liệu từ SQL Server sang Hadoop hoặc Azure Storage. Đầu tiên, chúng tôi tạo một bảng bên ngoài trỏ đến tệp hoặc thư mục đích.
Sau đó, sử dụng INSERT INTO để xuất dữ liệu từ bảng SQL Server cục bộ sang nguồn dữ liệu ngoài. Câu lệnh INSERT INTO tạo tệp hoặc thư mục đích nếu nó không tồn tại và kết quả của câu lệnh SELECT được xuất sang vị trí đã chỉ định ở định dạng tệp đã chỉ định.
cú pháp
- CREATE EXTERNAL TABLE [dbo].[CustomerDetails] (
- [FirstName] char(25) NOT NULL,
- [LastName] char(25) NOT NULL,
- [YearlyIncome] float NULL,
- [MaritalStatus] char(1) NOT NULL
- )
- WITH (
- LOCATION=‘/old_data/2009/customerdata.tbl’,
- DATA_SOURCE = HadoopHDP2,
- FILE_FORMAT = TextFileFormat,
- REJECT_TYPE = VALUE,
- REJECT_VALUE = 0
- );
- — Export data: Move old data to Hadoop while keeping
- — it query-able via an external table.
- INSERT INTO CustomerDetails
- SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2
- ON (T1.CustomerKey = T2.CustomerKey)
- WHERE T2.YearMeasured = 2009 and T2.Speed > 40;
Chèn dữ liệu bằng hàm OPENROWSET với BULK để tải dữ liệu hàng loạt vào bảng
Câu lệnh INSERT chèn các hàng từ tệp dữ liệu vào một bảng bằng cách chỉ định hàm OPENROWSET. Gợi ý bảng IGNORE_TRIGGERS được chỉ định để tối ưu hóa hiệu suất. Để biết thêm ví dụ, hãy xem Nhập dữ liệu hàng loạt bằng cách sử dụng BULK INSERT hoặc OPENROWSET(BULK…) (Máy chủ SQL).
Cú pháp
- INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)
- SELECT b.Name, b.GroupName
- FROM OPENROWSET (
- BULK ‘C:SQLFilesDepartmentData.txt’,
- FORMATFILE = ‘C:SQLFilesBulkloadFormatFile.xml’,
- ROWS_PER_BATCH = 15000)AS b ;
Gợi ý TABLOCK để chỉ định phương pháp khóa
Phần sau đây chỉ định rằng khóa độc quyền (X) được thực hiện trên EmployeeDetail và được giữ cho đến khi kết thúc câu lệnh INSERT.
Cú pháp
- INSERT INTO Production.Location WITH (XLOCK)
- (Name, CostRate, Availability)
- VALUES ( N‘Final Inventory’, 15.00, 80.00);
Chèn dữ liệu bằng tùy chọn SELECT
Dữ liệu INSERT cho biết cách chèn nhiều hàng dữ liệu bằng cách sử dụng câu lệnh INSERT với tùy chọn CHỌN. Câu lệnh INSERT đầu tiên sử dụng câu lệnh SELECT trực tiếp để truy xuất dữ liệu từ bảng nguồn và sau đó lưu trữ tập kết quả trong bảng EmployeeTitles.
Cú pháp
- CREATE TABLE EmployeeData
- ( EmployeeKey INT NOT NULL,
- LastName varchar(40) NOT NULL,
- Title varchar(50) NOT NULL
- );
- INSERT INTO EmployeeData
- SELECT EmployeeKey, LastName, Title
- FROM EmployeeData
- WHERE EndDate IS NULL;
(Source: https://www.c-sharpcorner.com/)