Câu lệnh DML (Data Manipulation Language) trong SQL là gì?
TM Data School - Người dùng dữ liệu chủ yếu sử dụng SQL để làm việc trực tiếp và thao tác với dữ liệu - trong đó SELECT chắc chắn là câu lệnh phổ biến nhất và là bài học “vỡ lòng” với bất cứ ai lần đầu làm quen với SQL. SELECT là một phần của DML - nhóm lệnh SQL được dùng để thao tác với dữ liệu. Vậy DML là gì, gồm các câu lệnh phổ biến và thường dùng nào? Cùng TM tìm hiểu trong bài viết dưới đây nhé!
Đọc thêm: SQL là gì? Tất tần tật những điều bạn cần biết về SQL
1. DML là gì?
Data Manipulation Language (DML) là một loại câu lệnh SQL được sử dụng để truy vấn, chỉnh sửa, bổ sung hoặc xóa các bản ghi dữ liệu khỏi một bảng/view trong cơ sở dữ liệu nhằm đảm bảo chất lượng dữ liệu đầu vào.
Ví dụ, mặc dù dữ liệu sẽ liên tục được tạo mới và cập nhật dựa theo các function và chương trình của ứng dụng, dù vậy, khi có bug (ví dụ API chết đột ngột) hoặc có những yêu cầu nhập mới các bản ghi từ bên ngoài, người làm dữ liệu vẫn cần trang bị hiểu biết và kiến thức về các câu lệnh DML để chèn mới hoặc thay đổi dữ liệu.
Các câu lệnh DML phổ biến bao gồm: SELECT, INSERT, UPDATE, DELETE, và MERGE.
Các truy vấn DML có thể thay đổi trực tiếp tới dữ liệu của một đối tượng (bảng hoặc view) trong cơ sở dữ liệu.
Trong trường hợp xảy ra lỗi trong quá trình sử dụng DML để cập nhật, dữ liệu có thể được phục hồi nhờ khả năng đảo ngược của các câu lệnh DML.
Một số lưu ý:
Mỗi câu lệnh DML sẽ bắt đầu một giao dịch ngầm định (implicit transaction), nghĩa là thực hiện một chuỗi các lệnh SQL kết nối đến cơ sở dữ liệu. Mỗi giao dịch khi hoàn thành (committed) sẽ thực hiện thay đổi dữ liệu trong bảng, còn khi bị hủy bỏ và phải quay lui (rolled back) sẽ trở lại trạng thái bắt đầu của giao dịch. Nhờ vậy, những yêu cầu thay đổi dữ liệu của câu lệnh DML vẫn có thể được đảo ngược để phục hồi trạng thái ban đầu khi xảy ra lỗi.
Các bản ghi được viết bằng cơ chế streaming insert_all trong 30 phút gần nhất không thể sửa đổi bằng ngôn ngữ thao tác dữ liệu (DML). Dữ liệu truyền trực tiếp có thể mất tới 90 phút mới có sẵn cho các hoạt động sao chép và chỉnh sửa.
Các bản ghi được insert vào bảng bằng Storage Write API có thể được chỉnh sửa bằng UPDATE, DELETE hoặc MERGE.
Truy vấn chứa câu lệnh DML không thể sử dụng bảng ký tự đại diện (wildcard table) làm mục tiêu của truy vấn. Ví dụ: bảng ký tự đại diện có thể được sử dụng trong mệnh đề FROM của truy vấn UPDATE, nhưng bảng ký tự đại diện không thể được sử dụng làm mục tiêu của thao tác UPDATE.
Cần sử dụng DML thận trọng: Với các tác vụ như chèn mới, cập nhật hoặc xóa dữ liệu, cần đảm bảo đã chọn chính xác dữ liệu để thực hiện tác vụ bằng cách thực hiện câu lệnh SELECT trước khi thực hiện các câu lệnh chỉnh sửa, xóa bỏ.
Đọc thêm: Hướng dẫn tự học SQL và các nguồn luyện tập dành cho người mới bắt đầu
2. Các loại DML
Có hai loại câu lệnh DML: High-Level (Non-Procedural DML) và Low-Level (Procedural DML)
3. Các câu lệnh DML thường dùng:
Các câu lệnh DML thường dùng bao gồm: SELECT, INSERT, DELETE, và UPDATE.
INSERT: Dùng để thêm bản ghi mới vào bảng dữ liệu.
UPDATE: Dùng để sửa đổi các bản ghi hiện có trong bảng dữ liệu.
DELETE: Dùng để xóa các bản ghi hiện có khỏi bảng dữ liệu.
MERGE: Dùng để kết hợp dữ liệu từ hai hay nhiều bảng thành một.
SELECT: Dùng để lấy dữ liệu từ một hoặc nhiều bảng trong cơ sở dữ liệu.
CALL: Dùng để gọi một thủ tục (procedure) hoặc hàm (function) được lưu trữ.
Ngoại trừ SELECT, tất cả các câu lệnh khác có thể áp dụng những thay đổi cho dữ liệu các bảng trong cơ sở dữ liệu. Trong khi SELECT có thể sử dụng để tính toán và biến đổi dữ liệu theo logic nghiệp vụ để thực hiện phân tích.
Vì vậy, hãy đảm bảo điều kiện và logic chính xác trước khi thực hiện các câu lệnh thay đổi bằng cách chạy câu lệnh SELECT trước để tránh mất thời gian phải ROLLBACK.
Để minh họa cho các câu lệnh này, hãy sử dụng dataset của một bệnh viện nhi - giả sử dataset này là hồ sơ của tất cả các bệnh nhi, bao gồm ba bảng chứa dữ liệu về tuổi, cân nặng và kết quả xét nghiệm máu.
Thông thường, trong quá trình thăm khám, các bác sĩ sẽ nhập những thông tin này vào hệ thống của bệnh viện. Dù vậy, những phần việc còn lại như cập nhật và xóa hồ sơ nhằm duy trì chất lượng đầu vào dữ liệu sẽ cần một người chuyên về dữ liệu - và đây là lúc để sử dụng các câu lệnh DML!
Trong dataset này có ba bảng dữ liệu liệu:
Bảng Patient - chứa dữ liệu định danh của các bệnh nhi.
Bảng Department - chứa dữ liệu về các khoa của bệnh viện và các thông tin như nhóm chuyên ngành, danh mục chuyên ngành
Bảng PatientAdmittance - chứa dữ liệu của những lần bệnh nhi tới thăm khám
INSERT
Câu lệnh INSERT được dùng để bổ sung các bản ghi mới trong một bảng dữ liệu đã tồn tại trong cơ sở dữ liệu. INSERT cũng có thể giúp thêm các hàng từ bảng này vào bảng khác.
Trên thực tế, người làm dữ liệu ít khi chèn dữ liệu vào bảng theo cách thủ công bằng lệnh INSERT. Thay vào đó, họ sẽ sử dụng các data pipeline (đường ống dữ liệu) để dẫn truyền và nhập dữ liệu từ nhiều nguồn khác nhau theo quy trình ELT hoặc một quy trình nhập dữ liệu tự động khác. Câu lệnh INSERT thường được sử dụng khi cần bổ sung một khối lượng bản ghi ít và không thường xuyên.
Syntax của INSERT là:
INSERT INTO tableName
(column1, column2, ...)
VALUES (value1, value2, ...)
Khi bổ sung bản ghi mới, đầu tiên bạn cần xác định điểm đến - bảng cần được nhập mới dữ liệu, sau đó chỉ định các trường dữ liệu và nhập chính xác các giá trị cần thêm.
Để nhập bản ghi từ bảng này sang bảng khác, bạn có thể sử dụng câu lệnh INSERT INTO SELECT:
INSERT INTO targetTable (column1, column2, …)
SELECT (column1, column2, …)
FROM sourceTable
Quay lại với dataset trên, giả sử một bác sĩ tại bệnh viện tiếp nhận một bệnh nhi mới chào đời chưa được đặt tên. Bác sĩ cần nhập tên của em bé vào cơ sở dữ liệu để xác định đơn thuốc cho bé, tuy nhiên hệ thống lại không cho phép bỏ trống trường tên bệnh nhân. Bác sĩ muốn tiếp tục kê đơn và có thể sử dụng số thứ tự thăm khám, đồng thời bỏ trống trường họ và tên cho tới lần thăm khám tiếp theo.
Lúc này, bạn sẽ cần nhập thông tin của bệnh nhi trực tiếp vào bảng dữ liệu.
INSERT INTO dbo.Patient
(Surname, FirstName, DOB, Sex, [Weight], Height, Vaccinated)
VALUES (NULL, NULL,'2019-11-19', 'F', 14.0, 23.1, 'No')
Trong đó:
dbo.patient: là bảng cần nhập thêm dữ liệu
Surname, FirstName, DOB, Sex, [Weight], Height, Vaccinated: là tên của các trường cần bổ sung bản ghi. Trong đó trường PatientID sẽ tự động gen thêm mã ID cho bệnh nhi.
NULL, NULL,'2019-11-19', 'F', 14.0, 23.1, 'No': lần lượt là giá trị của bản ghi mới, tương ứng với các trường dữ liệu phía trên.
Do cần bổ sung các thông tin và để trống tên của bệnh nhân, cột Surname và FirstName sẽ không có giá trị (NULL).
Sau khi chạy câu lệnh, chúng ta được kết quả:
Tương tự, để nhập nhiều bản ghi mới vào bảng, chạy câu lệnh:
INSERT INTO dbo.Patient
(Surname, FirstName, DOB, Sex, [Weight], Height, Vaccinated)
VALUES ('Hitson', 'George','2019-11-19', 'M', 13.9, 22.5, 'No'),
VALUES ('Hitson', 'Jenny','2019-11-19', 'F', 13.7, 22.3, 'No')
Giả sử, một số bệnh nhi đang sử dụng loại vaccine mới được phát triển trong năm 2023 và cần một bảng mới lưu trữ dữ liệu của những bệnh nhi này để phân biệt và theo dõi. Những bệnh nhi này đã được tiêm vaccine và có độ tuổi từ 0 tới 5 tuổi (tương đương sinh năm từ từ 2019 tới 2023). Bạn có thể chạy câu lệnh:
INSERT INTO [dbo].[DrugTrialAlpha]
(Surname, FirstName, DOB, Sex, DrugOrPlacebo, Notes)
SELECT
p.Surname, p.FirstName, p.DOB, p.Sex, 'Drug', NULL
FROM dbo.Patient AS p
WHERE
p.Vaccined = ‘Y’
AND DATEPART(year, DOB) >= 2019
Kết quả trả ra sẽ là một bảng mới với các bản ghi là các bệnh nhi sử dụng loại thuốc mới:
Bên cạnh việc sử dụng các câu lệnh để thao tác với cơ sở dữ liệu như chỉnh sửa, bổ sung hoặc xóa các bản ghi dữ liệu khỏi một bảng/view trong cơ sở dữ liệu,... nhiều hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) cũng phát triển giao diện cho phép người dùng vẫn có thể thao tác trực tiếp với cơ sở dữ liệu.
Insert dữ liệu vào nhà kho dữ liệu trong PostgresQL - Slide khóa học Data System with SQL
UPDATE
Câu lệnh UPDATE được dùng để thay đổi giá trị cột cho một hoặc nhiều hàng. Khác với câu lệnh ALTER DDL làm thay đổi cấu trúc hoặc cách đặt tên của các đối tượng cơ sở dữ liệu, câu lệnh UPDATE sẽ thay đổi dữ liệu của từng bản ghi.
Syntax của UPDATE:
UPDATE tableName
SET column1=value1, column2=value2,...
WHERE filterColumn=filterValue
Tương tự câu lệnh INSERT, đầu tiên bạn cần xác định điểm đến - bảng cần cập nhật dữ liệu, sau đó sử dụng mệnh đề SET để chỉ định trường dữ liệu cần cập nhật và sử dụng mệnh đề WHERE để giới hạn các bản ghi cần thay đổi.
Quay lại dataset case study, giả sử, khoa Cấp cứu thay đổi tên thành khoa Chấn thương và phẫu thuật cấp cứu, vì vậy, dữ liệu trong bảng department cũng cần được cập nhật.
Bạn có thể chạy câu lệnh:
UPDATE dbo.Department
SET DepartmentName = 'Trauma and Emergency Surgery'
WHERE DepartmentID = 3
SELECT * FROM dbo.Department WHERE DepartmentName = 'Emergency'
Kết quả trả về sẽ chuyển từ khoa Cấp cứu sang khoa Chấn thương và phẫu thuật cấp cứu:
Trong trường hợp cần cập nhật nhiều bản ghi, giả sử bạn cần thay đổi giá trị phân loại của tất cả các khu điều trị nội trú từ "Khu" thành "Phòng", bạn có thể chạy câu lệnh:
UPDATE dbo.Department
SET GroupName = 'Room'
WHERE GroupName = 'Ward'
Kết quả sau khi thay đổi:
DELETE
DELETE sẽ xóa bỏ một hoặc nhiều bản ghi trong một bảng theo điều kiện khi kết hợp mệnh đề WHERE.
Nếu bạn cần xóa bỏ tất cả dòng trong một bảng nhưng cần giữ cấu trúc bên dưới của bảng, bạn có thể sử dụng câu lệnh TRUNCATE DDL. Nếu bạn cần xóa bỏ tất cả bảng dữ liệu, bạn có thể sử dụng câu lệnh DROP DDL.
Syntax của DELETE:
DELETE tableName
WHERE filterColumn=filterValue;
Giả sử, bạn cần xóa phòng Lincoln khỏi bảng dữ liệu:
DELETE FROM dbo.Department
WHERE DepartmentName = ‘Lincoln Ward’
Câu lệnh sẽ xóa bỏ phòng có tên là ‘Lincoln Ward’.
Tương tự, nếu cần xóa bỏ nhiều bản ghi, bạn cũng sẽ dùng syntax tương tự. Giả sử, bạn cần xóa tất cả dữ liệu của các bệnh nhân đã rất lâu không tới thăm khám (lần cuối muộn nhất vào năm 1969). Bạn có thể sử dụng câu lệnh:
DELETE FROM dbo.PatientAdmittance
WHERE LastDischarged < '1969-01-01'
Kết quả trước khi xoá:
… và kết quả sau khi xoá:
SELECT
Câu lệnh SELECT cho phép truy cập dữ liệu trong các bảng của database và là câu lệnh thường dùng nhất của các Data Analyst/Data Scientists trong kỹ thuật phân tích và phân tích dữ liệu.
Với SELECT, bạn có thể kết hợp nhiều bản view và các bảng dữ liệu khác nhau, sử dụng điều kiện và toán tử, sử dụng các hàm và mệnh đề để biến đổi dữ liệu,... Trong đó, ba phần tử quan trọng nhất của một câu lệnh SELECT bao gồm: mệnh đề SELECT, các trường dữ liệu thực tế cần truy vấn, và mệnh đề FROM để chỉ định đối tượng cơ sở dữ liệu cần truy cập.
Ví dụ, bạn cần lấy ra dữ liệu của các bệnh nhi chưa được tiêm vaccine, có thể truy vấn:
SELECT PatientID, Surname, FirstName, DOB, Sex
FROM dbo.Patient
WHERE Vaccinated = 'N'
Mệnh đề WHERE sẽ giới hạn các bản ghi theo đúng logic dữ liệu mà chúng ta cần.
Ngoài ra, SELECT cũng có thể được sử dụng kết hợp với JOIN để kết hợp các bảng và làm giàu dữ liệu cần truy vấn. Ví dụ, nếu cần truy lại lịch sử thăm khám của bệnh nhi chưa được tiêm vaccine, có thể truy vấn:
SELECT p.PatientID, p.Surname, p.FirstName, p.DOB, p.Sex, pa.LastAdmitted, pa.LastDischarged
FROM dbo.Patient p
LEFT JOIN dbo.PatientAdmittance pa
ON o.PatientID = pa.PatientID
WHERE Vaccinated = 'N'
MERGE
Những thay đổi như thêm mới, cập nhật và xóa bỏ giá trị dựa trên các giá trị trong bảng thứ hai hoặc subquery. Điều này có thể hữu ích nếu bảng thứ hai là lưu lại lịch sử thay đổi và chứa các bản ghi mới (sẽ được thêm), các bản ghi đã sửa đổi (sẽ được cập nhật) và/hoặc các bản ghi được đánh dấu (sẽ bị xóa) trong bảng đích.
Câu lệnh sẽ hỗ trợ xử lý các trường hợp:
Các giá trị khớp (để cập nhật và xóa).
Các giá trị không khớp (để thêm mới).
Syntax của MERGE:
MERGE INTO <target_table> USING <source> ON <join_expr> { matchedClause | notMatchedClause } [ ... ]
WHERE:
matchedClause ::=
WHEN MATCHED [ AND <case_predicate> ] THEN { UPDATE SET <col_name> = <expr> [ , <col_name2> = <expr2> ... ] | DELETE } [ ... ]
với:
WHEN MATCHED ... THEN UPDATE <col_name> = <expr> | DELETE: xác định hành động thực hiện khi các giá trị khớp.
AND <case_predicate>: xác định biểu thức bổ sung nếu đúng mới thực hiện trường hợp khớp giá trị.
SET col_name = expr [ … ]: Xác định cột trong bảng đích sẽ được cập nhật hoặc nhập mới giá trị tương ứng với biểu thức.
notMatchedClause ::=
WHEN NOT MATCHED [ AND <case_predicate> ] THEN INSERT [ ( <col_name> [ , ... ] ) ] VALUES ( <expr> [ , ... ] )
với:
WHEN NOT MATCHED ... THEN INSERT: xác định hành động thực hiện khi các giá trị không khớp.
AND <case_predicate>: xác định biểu thức bổ sung nếu đúng mới thực hiện trường hợp không khớp giá trị.
( col_name [ , ... ] ): chỉ định một hoặc nhiều cột trong bảng đích sẽ được cập nhật hoặc chèn. Nếu không có sẽ mặc định là tất cả cột.
VALUES ( expr [ , ... ] ): xác định biểu thức tương ứng cho các giá trị cột được chèn.
Trong đó:
target_table: Bảng đích lưu trữ dữ liệu sau khi hợp nhất.
source: Bảng hoặc subquery được chỉ định để hợp nhất với bảng đích.
join_expr: Biểu thức để hợp nhất hai bảng.
Lưu ý: Một câu lệnh MERGE có thể bao gồm nhiều mệnh đề WHEN MATCHED và WHEN NOT MATCHED.
Đọc thêm: Lộ trình học Data Analyst/Business Analyst chi tiết cho dân trái ngành
Tạm kết
DML là công cụ quan trọng nhất với Data Analyst khi truy xuất và thực hiện các bước làm sạch và biến đổi dữ liệu từ một cơ sở dữ liệu, từ đó khai thác dữ liệu để tìm ra nhiều thông tin hữu ích và trả lời các câu hỏi và vấn đề của doanh nghiệp.
Để có thể chủ động và tự tin làm việc với dữ liệu của một cơ sở dữ liệu, Data Analyst cần biết dữ liệu được lưu trữ ở đây, biết các bảng dữ liệu đang được thiết kế theo schema như nào và mối quan hệ ra sao, đồng thời cũng phải nắm được dạng dữ liệu của các bảng là gì để có hướng tiếp cận và xử lý (ví dụ dữ liệu chưa được cấu trúc hóa hoàn toàn như JSON sẽ cần thêm một bước parse và xử lý),...
Hiểu rõ về cơ sở dữ liệu sẽ giúp bạn không phụ thuộc vào Data Engineer để tìm ra câu trả lời. Khóa học Data System with SQL của TM Data School sẽ giúp bạn trang bị các kiến thức căn bản này.
Khóa học sẽ mang đến cho bạn:
Kiến thức bài bản về hệ thống dữ liệu (Data System): Hiểu rõ cấu trúc và từng thành phần của một hệ thống dữ liệu: Data Collector, Data Pipeline, Data Warehouse, Data Mining Tool.
Tạo và quản lý dữ liệu trong nhà kho dữ liệu với SQL: Sử dụng các câu lệnh SQL để tạo và quản lý dữ liệu: tạo bảng, chỉnh sửa cấu trúc bảng, tạo ràng buộc (constraints), update bảng, xóa bảng,...
Truy vấn dữ liệu từ cơ bản đến nâng cao với SQL: Nắm vững các câu lệnh truy vấn SQL nhằm hỗ trợ Data Analyst/Data Scientist lấy dữ liệu từ hệ thống phục vụ quá trình phân tích.
Project thực tế thêm vào portfolio: Capstone project xây dựng hệ thống dữ liệu và truy vấn bằng SQL xuyên suốt qua cả khoá học để học viên có thể thêm vào portfolio ứng tuyển công việc.
Ngoài khi tham gia khóa học bạn còn được hướng dẫn bài bản từ các anh chị trainers được đào tạo về Data Science ở nước ngoài.
Tham khảo chi tiết khóa học tại đây!