Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Chèn lệnh so với Cú pháp truy vấn T-SQL với các ví dụ

Các nhà phát triển là sinh viên suốt đời. Tiếp thu kiến ​​thức mới nhanh nhất có thể luôn là mục tiêu của chúng tôi. Nếu bạn đến từ trại T-SQL, cách nhanh hơn để học MySQL là gì? Thường thì bạn muốn so sánh các cú pháp. Lần trước, bạn đã tìm hiểu về cách tạo bảng trong MySQL. Bài đăng hôm nay của chúng tôi sẽ đưa bạn đến một bước xa hơn. Chúng tôi sẽ chèn các bản ghi bằng MySQL INSERT.

Làm thế nào dễ dàng nó có thể được? Cả hai nền tảng cơ sở dữ liệu đều sử dụng SQL, nhưng chúng ta biết rằng cả hai sản phẩm cơ sở dữ liệu này đều có một số bổ sung cho cú pháp SQL chuẩn. MySQL INSERT cũng không ngoại lệ.

Vì vậy, nếu bạn cảm thấy mệt mỏi khi so sánh các tài liệu tham khảo cho MySQL và SQL Server, thì hôm nay là ngày may mắn của bạn. Tôi đã quản lý cú pháp và thực hiện so sánh cho bạn. Ngoài ra, chúng tôi sẽ có các ví dụ để kiểm tra. Cuối cùng, chúng tôi sẽ có một bảng gian lận miễn phí khác.

Bây giờ, trước khi chúng tôi đi sâu vào, bạn cũng có thể nhận được một bản tóm tắt PDF MIỄN PHÍ về bài viết này bằng cách điền vào biểu mẫu chọn tham gia bên dưới.

[sendpulse-form id =”12097 ″]

Sẵn sàng? Tuyệt vời!

CHÈN MySQL VÀO Cú pháp truy vấn (Trình tạo giá trị bảng)

Nhưng trước khi đi sâu vào chi tiết, hãy làm rõ một vài điều sau:

  • Phiên bản MySQL mà tôi đang sử dụng ở đây là 8.0.23, với công cụ lưu trữ InnoDB.
  • Phiên bản SQL Server là 2019.

Trước tiên, hãy thử chèn một bản ghi vào bảng. Cú pháp cơ bản tương tự như cú pháp cho SQL Server. Tuy nhiên, đó là nếu bạn không bao gồm cơ sở dữ liệu và tên lược đồ cũng như không bao gồm các tên cột bằng dấu gạch ngược.

CREATE TABLE testdatabase.people
(`ID` int NOT NULL PRIMARY KEY,
 `Lastname` varchar(50) NOT NULL,
 `FirstName` varchar(50) NOT NULL,
 `MiddleName` varchar(50) NULL DEFAULT '',
 `Rank` varchar(20) NOT NULL,
 `Ship` varchar(50) NOT NULL,
 `ShipRegistry` varchar(20) NOT NULL,
 `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP());
  
INSERT INTO people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Việc chỉ định vị trí thực tế của bảng sẽ hơi khác một chút. Như tôi đã chỉ ra trong bài đăng này, cơ sở dữ liệu đồng nghĩa với một lược đồ trong MySQL. Kiểm tra mẫu đã sửa đổi bên dưới:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Bạn có nhận thấy sự vắng mặt của tên lược đồ ở trên không?

Trong khi đó, mệnh đề VALUES ở trên tạo thành một hàm tạo giá trị bảng. Tương tự như vậy, SQL Server cũng có tính năng đó.

Chèn nhiều hàng vào bảng trong MySQL

Hãy thử chèn nhiều hàng.

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES (4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       (5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Đoạn mã trên sẽ chèn hai bản ghi bằng cách sử dụng hai hàm tạo giá trị bảng. Bạn cũng có thể sử dụng các biểu thức thay vì các giá trị theo nghĩa đen. Ví dụ dưới đây sử dụng một truy vấn con cho mỗi cột:

CREATE TABLE testdatabase.people2 LIKE people;

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (5, (SELECT Lastname FROM people WHERE ID=5), 
           (SELECT Firstname FROM people WHERE ID=5), 
           (SELECT MiddleName FROM people WHERE ID=5),
           (SELECT `Rank` FROM people WHERE ID=5),
           (SELECT Ship FROM people WHERE ID=5),
           (SELECT ShipRegistry FROM people WHERE ID=5));

Các truy vấn con trông thừa trong truy vấn trên. Nhưng điều này sẽ tạo ra lỗi:

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (SELECT `ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, 
        `Ship`, `ShipRegistry` FROM people);    -- ERROR!

Hàm tạo giá trị bảng mong đợi một ký tự hoặc một biểu thức cho mỗi trường trong danh sách cột. Hơn nữa, các truy vấn con trong ví dụ trước trả về một hàng có một giá trị và giá trị đó hợp lệ. Tuy nhiên, câu lệnh SELECT ở trên sẽ gây ra lỗi vì nó trả về nhiều hàng và cột.

Một tùy chọn khác là chỉ định từ khóa ROW như trong ví dụ bên dưới:

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES ROW(4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       ROW(5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Nhưng từ khóa ROW trong câu lệnh INSERT không được hỗ trợ trong SQL Server.

CHÈN MySQL VÀO bằng CHỌN từ một bảng khác

Bạn có thể thêm bản ghi vào bảng bằng câu lệnh SELECT:

INSERT INTO people2
(ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry)
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry FROM people;

Như bạn có thể thấy, T-SQL cũng giống như vậy khi không có tên cơ sở dữ liệu, tên lược đồ và ký tự backtick. Nhân tiện, xếp hạng là một từ dành riêng.

Do đó, các ký tự hình nền bao quanh từ Xếp hạng là điều bắt buộc.

Bạn có thể thể hiện nó mà không cần danh sách cột. Chỉ cần chỉ định tên cột theo cùng một trình tự như cách sắp xếp cột của bảng mục tiêu.

TRUNCATE TABLE testdatabase.people2;

INSERT INTO testdatabase.people2
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry, ModifiedDate 
FROM people;

SELECT * FROM testdatabase.people2

Xem kết quả đầu ra bên dưới từ dbForge Studio cho MySQL:

Nghe hay không? Hãy mở rộng thêm về chủ đề xử lý các giá trị cột.

INSERT và Giá trị cột bảng

Phần này sẽ đào sâu hơn về các giá trị cột khi sử dụng MySQL INSERT. Có bốn trong số chúng:

  • Các giá trị Unicode.
  • Giá trị mặc định.
  • Sử dụng tính năng tự động tăng.
  • Giá trị từ các biến do người dùng xác định.

Chèn chuỗi Unicode

Trong T-SQL, bạn đã quen với việc đặt trước giá trị chuỗi bằng N . Khi sử dụng điều đó, SQL Server giả định rằng giá trị là một giá trị Unicode. Trong MySQL, bạn không cần điều đó.

Hãy xem ví dụ dưới đây:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES ('김지수'),('김제니'),('박채영'),('ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Có một số điểm cần lưu ý:

  1. Việc sử dụng NVARCHAR để tạo bảng trong MySQL 8 sẽ tự động được đổi thành VARCHAR.
  2. Không cần đặt trước giá trị Unicode bằng N , như N ’김지수’.
  3. Bạn cần chỉnh sửa đoạn mã trên một chút để mã chạy thành công trong SQL Server.

Kiểm tra kết quả bên dưới:

Đây là mã tương đương trong T-SQL:

CREATE TABLE UnicodeNames
(ID int NOT NULL IDENTITY PRIMARY KEY,
 FullName nvarchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES (N'김지수'),(N'김제니'),(N'박채영'),(N'ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Thử xóa chữ ‘N’ khỏi một trong các giá trị Unicode ở trên. Mã sẽ chạy tốt, nhưng bạn kiểm tra đầu ra bên dưới trong SQL Server Management Studio:

Cách Chèn Giá trị Mặc định trong MySQL

Giá trị mặc định của cột hoạt động khi bạn chèn bản ghi mà không chỉ định giá trị. Chúng tôi đã sử dụng điều đó trong ví dụ đầu tiên ở trên. Sau đây là định nghĩa cột một lần nữa:


`ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()

Cột Ngày được sửa đổi mặc định là ngày và giờ hiện tại trên máy chủ. Đó là lý do tại sao khi chúng tôi làm điều này:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Kết quả là:

Rất gọn gàng và tiết kiệm thao tác gõ phím. Hành vi tương tự này cũng xảy ra trong SQL Server.

Trong khi đó, nếu bạn muốn làm cho nó rõ ràng, chỉ cần chỉ định tên cột với giá trị là DEFAULT:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (6, 'Pyke','Christopher','','Captain','USS Enterprise','NCC 1701', DEFAULT);

Nó cũng hoạt động trong SQL Server với một chút sửa đổi.

Có một trình tiết kiệm thời gian và tổ hợp phím khác. Nó đang có một giá trị cột tự động tăng.

CHÈN vào Cột AUTO_INCREMENT

Thay vì lấy giá trị số nguyên cuối cùng trên bảng và thêm 1, tốt hơn nên xác định cột tự động tăng. nó tốt cho các khóa chính. Chúng tôi đã làm điều đó trong ví dụ bảng Unicode.

Đây là một phần của nó một lần nữa:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

Trong khi đó, trong SQL Server, chúng tôi sử dụng từ khóa IDENTITY thay vì AUTO_INCREMENT.

Hình 2 cho thấy kết quả của việc xác định một cột tự động tăng. Các giá trị số nguyên được tạo mà không chỉ định nó trong câu lệnh INSERT.

Sử dụng các biến do người dùng xác định để đặt giá trị cột

Một trường hợp phổ biến khác để chèn bản ghi trong T-SQL là áp dụng các biến do người dùng xác định để đặt giá trị cột. Nó rất hữu ích cho việc tạo các tập lệnh đặc biệt và các thủ tục được lưu trữ.

Nhưng trước tiên, việc xác định các biến trong MySQL có thể được thực hiện bằng SET. Không giống như trong SQL Server, bạn sử dụng DECLARE. Hãy xem ví dụ:

SET @stringValue = 'string value';
SET @numericValue = 1287;
SET @booleanValue = TRUE;
SET @dateValue = CURRENT_DATE();

CREATE TABLE IF NOT EXISTS TableDataTypeValues
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 stringValue varchar(50) NOT NULL,
 numericValue int NOT NULL,
 BooleanValue bit not NULL DEFAULT FALSE,
 dateValue date NULL);

INSERT INTO TableDataTypeValues
(stringValue, numericValue, BooleanValue, dateValue)
VALUES (@stringValue, @numericValue, @booleanValue, @dateValue);

Như bạn có thể thấy ở trên, các biến hoạt động như biểu thức để điền vào các giá trị cột trong mệnh đề VALUES.

Chèn vào Bảng tạm thời trong MySQL

Ở đây, chúng tôi xem xét việc sử dụng MySQL INSERT trong các bảng tạm thời. Các nhà phát triển T-SQL đã quen thuộc với ‘ # Ký hiệu ‘đứng trước tên bảng tạm thời. Trong MySQL, các bảng tạm thời được tạo bằng TẠO BẢNG TẠM THỜI table_name . Nó không có ‘ # ' Biểu tượng. Do đó, trong số các dòng của tập lệnh của bạn, tên bảng tạm thời có thể giống với tên bảng thông thường:

CREATE TEMPORARY TABLE tmpkpopgroup
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 GroupName varchar(50) NOT NULL,
 ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP());

INSERT INTO tmpkpopgroup
(GroupName)
VALUES ('BTS'),('SEVENTEEN'),('TWICE'),('MOMOLAND'),('GIRLS GENERATION'),('BLACKPINK'),('OH MY GIRL'),('RED VELVET');

SELECT * FROM tmpkpopgroup
ORDER BY GroupName;

Nói cách khác, việc chèn các bản ghi vào các bảng tạm thời trông giống như các bảng thông thường.

Đây là kết quả:

CHÈN MySQL… TRÊN CẬP NHẬT KHÓA DUPLICATE - Cú pháp không được hỗ trợ trong T-SQL

Cuối cùng, MySQL INSERT có các trường hợp cú pháp không được hỗ trợ trong T-SQL. Một trong số đó là CHÈN… TRÊN CẬP NHẬT KHÓA DUPLICATE. Nó có thể làm gì?

Khi một bảng có một khóa duy nhất và bạn tình cờ chèn một giá trị sẽ gây ra sự trùng lặp, thì INSERT sẽ không thành công. Tuy nhiên, khi bạn sử dụng INSERT… ON DUPLICATE KEY UPDATE, một bản cập nhật của hàng hiện có sẽ xảy ra thay thế. Lỗi sẽ không xảy ra.

Giả sử chúng tôi có những hồ sơ này trong mọi người bảng:

Lưu ý giá trị của sổ đăng ký tàu được đánh dấu màu đỏ và toàn bộ dòng đó. Vấn đề là, chúng tôi sẽ chèn cùng một bản ghi với CẬP NHẬT KHÓA DUPLICATE.

Bây giờ, hãy bắt đầu tuyên bố dưới đây:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT)
ON DUPLICATE KEY UPDATE ShipRegistry = 'NCC-75633';

SELECT * FROM testdatabase.people;

Có lỗi không? Hãy kiểm tra nó!

Thật tuyệt, phải không?

Hiệu ứng tương tự cũng xảy ra khi bạn làm điều này:

UPDATE people 
SET ShipRegistry = 'NCC-75633'
WHERE ID = 5

Trong khi đó, bạn có thể thể hiện ý định trong T-SQL như thế này:

IF EXISTS(SELECT id FROM people WHERE id = 5)
	UPDATE people 
	SET ShipRegistry = 'NCC-75633'
	WHERE ID = 5
ELSE
	INSERT INTO people
	(ID, LastName, FirstName, MiddleName, [Rank], Ship, ShipRegistry, ModifiedDate)
	VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT);

Kết quả tương tự sẽ xảy ra.

Kết luận

Benjamin Franklin đã từng nói, “Đầu tư vào kiến ​​thức luôn mang lại lợi ích tốt nhất”. Tôi hy vọng bài viết này sẽ đền đáp kịp thời cho bạn.

Hãy tóm tắt lại:

  1. Cú pháp INSERT cơ bản của MySQL gần như giống nhau trong T-SQL ngoại trừ việc không có tên lược đồ và sử dụng dấu gạch ngược.
  2. Chèn các bản ghi trong MySQL từ một bảng khác gần giống như trong T-SQL.
  3. Các giá trị cột được xử lý khác nhau trong MySQL INSERT. Giá trị Unicode là đáng chú ý nhất. Ngoài ra, cú pháp sử dụng AUTO_INCREMENT cũng khác.
  4. Chèn các bản ghi vào bảng tạm thời trong MySQL có sự khác biệt nhỏ trong T-SQL với ‘ # Ký hiệu ‘.
  5. CHÈN… TRÊN BẢN CẬP NHẬT KHÓA DUPLICATE có vẻ tốt trong việc rút ngắn cú pháp để tránh các lỗi trùng lặp.

Tôi hy vọng bài viết hữu ích cho bạn khi bạn đang học MySQL. Nếu bạn thích bài đăng này, hãy chia sẻ nó trên các nền tảng mạng xã hội yêu thích của bạn!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ví dụ SECOND () - MySQL

  2. Những sai lầm hàng đầu cần tránh trong MySQL Replication

  3. Cách sao lưu cơ sở dữ liệu MySQL bằng AutoMySQLBackup

  4. Java:Chèn nhiều hàng vào MySQL với PreparedStatement

  5. Truy vấn MySQL để có được các sản phẩm bán chạy nhất