Nội dung chính
- SQL là gì?
- Câu lệnh SQL: Ngôn ngữ định nghĩa dữ liệu – DDL (Data Definition Language)
- Câu lệnh SQL: Ngôn ngữ truy vấn dữ liệu – DQL (Data Query Language)
- Câu lệnh SQL: Ngôn ngữ thao tác dữ liệu – DML (Data Manipulation Language)
- Câu lệnh SQL: Ngôn ngữ điều khiển dữ liệu – DCL (Data Control Language)
- Các loại toán tử trong SQL
- Nhóm hàm tổng hợp
- Các ràng buộc toàn vẹn
- Các câu hỏi thường gặp về câu lệnh SQL
- Tổng kết Câu lệnh SQL
SQL (Structured Query Language) là ngôn ngữ chuẩn để quản lý và thao tác cơ sở dữ liệu quan hệ. Từ việc tạo bảng, thêm dữ liệu đến việc truy xuất và cập nhật thông tin, SQL đóng vai trò quan trọng trong việc tổ chức và khai thác dữ liệu hiệu quả. Đối với những người mới bắt đầu hoặc những ai đang tìm hiểu về cơ sở dữ liệu, nắm vững các câu lệnh SQL cơ bản là bước khởi đầu cần thiết.
Đọc bài viết này để hiểu rõ hơn về:
- Các loại câu lệnh SQL
- Các toán tử trong SQL
- Các loại ràng buộc toàn vẹn trong SQL
SQL là gì?
SQL, viết tắt của Structured Query Language, là một ngôn ngữ được thiết kế để tương tác và quản lý dữ liệu trong các hệ quản trị cơ sở dữ liệu quan hệ (RDBMS). Nó cung cấp một cách thức mạnh mẽ và linh hoạt để tạo, đọc, cập nhật và xóa dữ liệu. Bên cạnh đó, SQL cũng cho phép người dùng thực hiện các truy vấn phức tạp để tìm kiếm và tổ chức dữ liệu một cách hiệu quả.
Với sự hỗ trợ từ các hệ quản trị phổ biến như MySQL, PostgreSQL, SQL Server,… SQL đã trở thành công cụ quan trọng trong lĩnh vực phát triển phần mềm và quản lý dữ liệu.
Đọc thêm: Truy vấn cơ sở dữ liệu là gì? Tất tần tật về ngôn ngữ SQL
Câu lệnh SQL: Ngôn ngữ định nghĩa dữ liệu – DDL (Data Definition Language)
DDL (Data Definition Language) là một nhóm các câu lệnh SQL được sử dụng để định nghĩa và thay đổi cấu trúc của cơ sở dữ liệu. Nói cách khác, DDL tập trung vào việc mô tả và quản lý cấu trúc của các đối tượng trong cơ sở dữ liệu như bảng, chỉ mục (index), hàm, views, thủ tục lưu trữ và trigger. Tuy nhiên, DDL không xử lý trực tiếp dữ liệu trong các bảng, mà chỉ làm việc với cấu trúc của cơ sở dữ liệu.
Các câu lệnh DDL thường không được sử dụng bởi người dùng thông thường, mà chủ yếu dành cho quản trị viên hoặc lập trình viên có nhiệm vụ thiết kế và quản lý hệ thống cơ sở dữ liệu. Dưới đây là danh sách các câu lệnh DDL phổ biến cùng với cú pháp:
CREATE
Dùng để tạo mới cơ sở dữ liệu hoặc các đối tượng bên trong nó (bảng, chỉ mục, hàm,…).
Cú pháp CREATE:
CREATE Object_name (parameters)
Ví dụ để tạo bảng employees ta dùng cú pháp sau:
CREATE TABLE employees (phone_id INT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50), salary DECIMAL(10, 2) );
DROP
Dùng để xóa vĩnh viễn các đối tượng trong cơ sở dữ liệu như chỉ mục, bảng, hay cả cơ sở dữ liệu.
Cú pháp DROP:
DROP TABLE [TABLE | DATABASE | INDEX] object_name];
Ví dụ để xóa bảng employees khỏi database, ta dùng cú pháp sau:
DROP TABLE employees;
ALTER
Dùng để thay đổi cấu trúc của bảng, chẳng hạn thêm cột (dùng ADD), thay đổi kiểu dữ liệu (dùng MODIFY), xóa cột hoặc ràng buộc (dùng DROP) hay đổi tên cột hoặc bảng (dùng RENAME) mà không cần phải xóa và tạo lại bảng.
Cú pháp ALTER:
ALTER TABLE table_name [ADD | MODIFY | DROP| RENAME] column_name [data_type | constraint];
Ví dụ để thêm thông tin email vào bảng employees, ta dùng cú pháp sau:
ALTER TABLE employees ADD COLUMN email VARCHAR(100);
TRUNCATE
Dùng để xóa toàn bộ dữ liệu trong bảng mà không xóa cấu trúc bảng. Không gian lưu trữ của dữ liệu cũng sẽ được giải phóng.
Cú pháp TRUNCATE:
TRUNCATE TABLE table_name;
Ví dụ để xóa toàn bộ dữ liệu trong bảng employees, nhưng bảng và các cột vẫn giữ nguyên, ta dùng cú pháp sau:
TRUNCATE TABLE employees;
COMMENT
Câu lệnh COMMENT dùng để thêm hoặc thay đổi ghi chú (comment) cho một đối tượng trong cơ sở dữ liệu, giúp người dùng hiểu rõ hơn về chức năng của bảng hoặc cột.
COMMENT ON [TABLE | COLUMN] object_name IS 'comment_text';
Ví dụ để thêm một ghi chú cho bảng employees để mô tả rằng bảng này lưu thông tin nhân viên, ta dùng cú pháp sau:
COMMENT ON TABLE employees IS 'Bảng lưu thông tin nhân viên';
RENAME
Dùng để đổi tên một bảng hoặc đối tượng khác trong cơ sở dữ liệu.
RENAME TABLE old_table_name TO new_table_name;
Ví dụ để đổi tên bảng employees thành staff, có thể để phù hợp hơn với mục đích quản lý ta dùng cú pháp sau:
RENAME TABLE employees TO staff;
Câu lệnh SQL: Ngôn ngữ truy vấn dữ liệu – DQL (Data Query Language)
DQL (Data Query Language) được xem là một phần của DML, nhưng tập trung vào việc truy vấn và lấy dữ liệu từ cơ sở dữ liệu. Mục đích chính của DQL là truy xuất thông tin từ các bảng trong cơ sở dữ liệu dựa trên điều kiện mà người dùng đưa ra. DQL cho phép lấy dữ liệu theo yêu cầu, đồng thời có thể sắp xếp, lọc hoặc tính toán dữ liệu để phục vụ cho việc phân tích hoặc xử lý tiếp theo.
Chức năng của DQL là lấy dữ liệu từ cơ sở dữ liệu mà không làm thay đổi cấu trúc hay dữ liệu gốc. Kết quả của các truy vấn DQL thường được hiển thị dưới dạng bảng tạm thời hoặc được gửi đến các chương trình xử lý khác. DQL thường sử dụng câu lệnh chính là SELECT, cho phép truy vấn dữ liệu từ một hoặc nhiều bảng, với các điều kiện cụ thể:
SELECT
Là câu lệnh được sử dụng nhiều nhất trong quá trình hoạt động với CSDL, dùng để lấy dữ liệu từ cơ sở dữ liệu dựa trên các điều kiện được xác định.
Có nhiều loại SELECT như SELECT không điều kiện, SELECT có điều kiện WHERE, SELECT với dữ liệu kết hợp từ nhiều bảng, SELECT kết hợp GROUP BY,…
Cú pháp SELECT:
SELECT column1, column2, ... FROM table_name [WHERE condition] [GROUP BY column] [HAVING condition] [ORDER BY column];
Ví dụ để lấy các thông tin của nhân viên ở phòng ban Sales có mức lương trên 30000, ta dùng cú pháp sau:
SELECT name, department, salary FROM employees WHERE department = 'Sales' AND salary > 30000;
Ngoài ra bạn có thể tìm hiểu thêm về phép JOIN trong SQL.
Câu lệnh SQL: Ngôn ngữ thao tác dữ liệu – DML (Data Manipulation Language)
DML (Data Manipulation Language) là nhóm các câu lệnh SQL dùng để thao tác trực tiếp với dữ liệu trong cơ sở dữ liệu. Các câu lệnh này cho phép người dùng thêm, sửa, xóa dữ liệu, cũng như thực hiện các thao tác khác trên dữ liệu. DML chủ yếu được sử dụng để quản lý các nội dung dữ liệu đã được lưu trữ mà không ảnh hưởng đến cấu trúc bảng.
Ngoài ra, một số lệnh DML như LOCK, CALL và EXPLAIN PLAN còn cung cấp chức năng nâng cao trong việc điều khiển truy cập dữ liệu và thực hiện các chương trình con*.
* Chương trình con là một khối mã độc lập có thể được gọi để thực hiện một tác vụ cụ thể, thường được dùng để tái sử dụng mã và giảm thiểu lỗi lặp lại trong lập trình.
Trong cơ sở dữ liệu, chương trình con thường là các thủ tục(procedure) hoặc hàm (function) được lưu trữ và quản lý bởi hệ thống cơ sở dữ liệu. Chúng có thể được gọi để thực hiện một loạt các thao tác như tính toán, xử lý dữ liệu hoặc thực hiện các tác vụ phức tạp khác.
Một số lệnh DML phổ biến bao gồm:
INSERT
Dùng để thêm 1 hoặc nhiều hàng dữ liệu mới vào bảng.
Cú pháp INSERT:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, …);
Ví dụ để thêm thông tin của nhân viên mới John Doe vào bảng employees, ta dùng cú pháp sau: INSERT INTO employees (name, department, salary) VALUES ('John Doe', 'Sales', 50000);
UPDATE
Dùng để cập nhật dữ liệu hiện có trong bảng dựa trên điều kiện lọc.
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;
Ví dụ để cập nhật mức lương của nhân viên ‘John Doe’ lên 55000 trong bảng employees, ta dùng cú pháp sau:
UPDATE employees SET salary = 55000 WHERE name = 'John Doe';
DELETE
Dùng để xóa 1 hoặc nhiều hàng dữ liệu khỏi bảng dựa trên điều kiện lọc.
Cú pháp DELETE:
DELETE FROM table_name WHERE condition;
Ví dụ để xóa bản ghi của nhân viên ‘John Doe’ khỏi bảng employees, ta dùng cú pháp sau:
DELETE FROM employees WHERE name = 'John Doe';
LOCK
Dùng để khóa dữ liệu của bảng trong quá trình giao dịch, ngăn chặn các thao tác khác can thiệp vào dữ liệu để đảm bảo tính toàn vẹn.
Có thể kết hợp LOCK với SHARE MODE dùng để khoá các giao dịch khác đọc nhưng không thay đổi dữ liệu, EXCLUSIVE MODE dùng để khoá hoàn toàn, không cho phép đọc hoặc ghi.
Cú pháp LOCK:
LOCK TABLE table_name IN [SHARE|EXCLUSIVE] MODE;
Ví dụ để khóa bảng employees để ngăn chặn các thao tác từ người dùng khác khi bảng này đang được chỉnh sửa, ta dùng cú pháp sau:
LOCK TABLE employees IN EXCLUSIVE MODE;
CALL
Thường được dùng để gọi một chương trình con PL/SQL**, JAVA…thường được sử dụng trong cơ sở dữ liệu như PL/SQL (Oracle) hoặc T-SQL (SQL Server).
** PL/SQL (Procedural Language/SQL) là một ngôn ngữ lập trình do Oracle phát triển, được sử dụng để mở rộng khả năng của SQL trong cơ sở dữ liệu Oracle.
PL/SQL cho phép bạn viết các chương trình con như thủ tục, hàm và trigger để tự động hóa và tùy chỉnh các thao tác với dữ liệu. Nó kết hợp các yếu tố của lập trình cấu trúc với các lệnh SQL, giúp thực hiện các tác vụ phức tạp hơn, như xử lý dữ liệu, kiểm tra điều kiện, và thực hiện các phép toán.
Với PL/SQL, bạn có thể viết các đoạn mã để tự động hóa các quy trình trong cơ sở dữ liệu và cải thiện hiệu suất làm việc với dữ liệu.
Cú pháp CALL:
CALL procedure_name(arguments);
Ví dụ để gọi chương trình con calculate_bonus với tham số ‘Sales’ để tính toán thưởng cho nhân viên trong phòng ban Sales, ta dùng cú pháp sau:
CALL calculate_bonus('Sales');
EXPLAIN PLAN
Dùng để mô tả cách truy xuất dữ liệu của một câu lệnh SQL.
Cú pháp EXPLAIN PLAN:
EXPLAIN PLAN FOR query_condition;
Ví dụ để trình bày lộ trình mà cơ sở dữ liệu sẽ thực hiện để truy xuất thông tin của các nhân viên có mức lương trên 50000, ta sử dụng cú pháp sau:
EXPLAIN PLAN FOR SELECT * FROM employees WHERE salary > 50000;
Câu lệnh SQL: Ngôn ngữ điều khiển dữ liệu – DCL (Data Control Language)
DCL là tập hợp các câu lệnh SQL liên quan đến việc quản lý quyền và kiểm soát truy cập dữ liệu trong cơ sở dữ liệu, nó cho phép người quản trị cấp hoặc thu hồi quyền truy cập cơ sở dữ liệu và các đối tượng bên trong nó (bảng, cột, thủ tục) đối với người dùng hoặc 1 nhóm người dùng.
Các lệnh DCL phổ biến gồm:
GRANT
Dùng để cấp quyền cho người dùng hoặc nhóm người dùng để thực hiện các thao tác (như SELECT, INSERT, UPDATE, DELETE) trên các đối tượng trong cơ sở dữ liệu.
Cú pháp GRANT:
GRANT privilege_type ON object_name TO user_name [WITH GRANT OPTION];
Ví dụ để cấp quyền SELECT cho người dùng user1 để truy vấn bảng employees, ta dùng cú pháp sau:
GRANT SELECT ON employees TO user1;
REVOKE
Dùng để thu hồi quyền đã cấp cho người dùng.
Cú pháp REVOKE:
REVOKE privilege_type ON object_name FROM user_name;
Ví dụ để thu hồi quyền SELECT của người dùng user1 trên bảng employees, ta sử dụng cú pháp sau:
REVOKE SELECT ON employees FROM user1;
REVOKE ALL
Dùng để thu hồi tất cả các quyền đã cấp cho người dùng trên một đối tượng cụ thể.
Cú pháp REVOKE ALL:
REVOKE ALL PRIVILEGES ON object_name FROM user_name;
Ví dụ: Để thu hồi tất cả các quyền của người dùng user1 trên bảng employees, ta sử dụng cú pháp sau:
REVOKE ALL PRIVILEGES ON employees FROM user1;
Câu lệnh SQL: Ngôn ngữ kiểm soát giao dịch – TCL (Transaction Control Language)
TCL là nhóm các câu lệnh dùng để kiểm soát các giao dịch trong cơ sở dữ liệu. Giao dịch là một nhóm các thao tác được thực hiện như một đơn vị thống nhất; nếu bất kỳ thao tác nào trong nhóm bị lỗi, toàn bộ giao dịch sẽ bị hủy bỏ để đảm bảo tính toàn vẹn của dữ liệu.
Các lệnh TCL phổ biến gồm:
BEGIN TRANSACTION
Dùng để bắt đầu một giao dịch mới.
Cú pháp BEGIN TRANSACTION:
BEGIN TRANSACTION;
COMMIT
Dùng để xác nhận và lưu tất cả các thay đổi đã thực hiện trong giao dịch vào cơ sở dữ liệu.
Cú pháp COMMIT:
COMMIT;
ROLLBACK
Dùng để hủy bỏ tất cả các thay đổi đã thực hiện trong giao dịch nhưng chưa được commit và khôi phục dữ liệu về trạng thái ban đầu.
Cú pháp ROLLBACK:
ROLLBACK;
SAVEPOINT
Dùng để tạo một điểm lưu trong giao dịch để có thể quay lại nếu cần thiết.
Cú pháp SAVEPOINT:
SAVEPOINT savepoint_name;
Ví dụ để tạo một điểm lưu sp1 trong giao dịch, cho phép quay lại điểm này nếu cần, ta dùng cú pháp sau:
SAVEPOINT sp1;
Ví dụ ta có:
-- Bắt đầu một giao dịch mới BEGIN TRANSACTION; -- Thực hiện một số thao tác trên cơ sở dữ liệu INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 60000); INSERT INTO employees (name, department, salary) VALUES ('Bob', 'IT', 70000); -- Tạo một điểm lưu SAVEPOINT sp1; -- Thực hiện thêm thao tác khác INSERT INTO employees (name, department, salary) VALUES ('Charlie', 'Finance', 80000); -- Quyết định không muốn giữ thay đổi cho thao tác cuối cùng ROLLBACK TO sp1; -- Kết thúc giao dịch và lưu các thay đổi đã thực hiện trước điểm lưu COMMIT; -- Hoặc nếu bạn muốn hủy bỏ toàn bộ giao dịch -- ROLLBACK;
Đoạn code trên mô tả quy trình sử dụng giao dịch trong SQL để quản lý và điều chỉnh các thay đổi đối với cơ sở dữ liệu:
- Quy trình bắt đầu với một giao dịch, thực hiện các thao tác dữ liệu, và tạo một điểm lưu SAVEPOINT để có thể quay lại trạng thái trước đó nếu cần.
- Nếu phát hiện lỗi hoặc không muốn giữ các thay đổi sau điểm lưu, lệnh ROLLBACK TO được sử dụng để hủy bỏ các thay đổi không mong muốn.
- Cuối cùng, COMMIT lưu lại tất cả các thay đổi hợp lệ vào cơ sở dữ liệu.
Các loại toán tử trong SQL
Toán tử (Operator) trong SQL là các ký hiệu hoặc từ khóa dùng để thực hiện các phép tính trên dữ liệu và trả về kết quả mong muốn. Toán tử được sử dụng trong các câu lệnh SQL để thực hiện các phép toán số học, so sánh giá trị, kết hợp điều kiện logic và nhiều thao tác khác. Dưới đây là các loại toán tử phổ biến trong SQL:
SQL Arithmetic Operators (Toán tử số học)
Toán tử số học được sử dụng để thực hiện các phép tính như cộng, trừ, nhân, chia trên các cột hoặc các giá trị số. Các toán tử thuộc nhóm này bao gồm:
Toán tử | Phép toán |
+ | Phép cộng |
– | Phép trừ |
* | Phép nhân |
/ | Phép chia |
% | Phép chia lấy dư |
Ví dụ: Để cộng thêm tiền lương Salary cho nhân viên John Doe thêm 10000, ta dùng cú pháp sau:
UPDATE employees SET salary = salary + 10000 WHERE name = 'John Doe';
SQL Comparison Operators (Toán tử so sánh)
Toán tử so sánh dùng để so sánh hai giá trị và trả về kết quả là TRUE (đúng) hoặc FALSE (sai). Toán tử so sánh gồm các phép toán sau:
Toán tử | Phép toán | Mô tả |
= | Bằng | Kiểm tra nếu cả hai toán hạng có giá trị bằng nhau, nếu đúng sẽ trả về TRUE. |
> | Lớn hơn | Trả về TRUE nếu giá trị bên trái lớn hơn giá trị bên phải. Ngược lại sẽ trả về FALSE. |
< | Nhỏ hơn | Trả về TRUE nếu giá trị bên trái nhỏ hơn giá trị bên phải. Ngược lại sẽ trả về FALSE. |
>= | Lớn hơn hoặc bằng | Kiểm tra nếu giá trị bên trái lớn hơn hoặc bằng bên phải, nếu đúng trả về TRUE. |
<= | Nhỏ hơn hoặc bằng | Kiểm tra giá trị bên trái có nhỏ hơn hoặc bằng giá trị bên phải hay không. |
<> hoặc != | Khác nhau | Kiểm tra nếu giá trị hai bên toán tử không bằng nhau, nếu đúng sẽ trả về TRUE. |
!> | Không lớn hơn | Kiểm tra nếu giá trị bên trái không lớn hơn hoặc giá trị bên phải. |
!< | Không nhỏ hơn | Kiểm tra nếu giá trị bên trái không nhỏ hơn hoặc bằng giá trị bên phải. |
Ví dụ để lấy thông tin các nhân viên có mức lương Salary nhiều hơn 30000, ta dùng cú pháp sau:
SELECT * FROM nhanvien WHERE luong > 30000;
SQL Logical Operators (Toán tử logic)
Toán tử logic trong SQL là những toán tử được sử dụng để kết hợp các điều kiện hoặc biểu thức trong câu lệnh truy vấn. Chúng giúp xác định kết quả dựa trên các điều kiện được chỉ định, trả về TRUE hoặc FALSE.
Các phép toán tử bao gồm:
ALL
So sánh một giá trị với tất cả các giá trị khác trong một tập dữ liệu. Nếu điều kiện đúng với mọi giá trị trong tập, kết quả trả về là TRUE.
Ví dụ để lấy thông tin nhân viên có mức lương cao hơn tất cả các nhân viên trong bộ phận IT, ta dùng cú pháp sau:
SELECT * FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'IT');
AND
Trả về TRUE nếu tất cả các điều kiện trong câu lệnh đều đúng.
Ví dụ để lấy thông tin nhân viên có lương lớn hơn 30000 và thuộc bộ phận IT, ta dùng cú pháp:
SELECT * FROM employees WHERE salary > 30000 AND department = 'IT';
OR
Trả về TRUE nếu ít nhất một trong các điều kiện được ngăn cách bởi OR là đúng.
Ví dụ để lấy thông tin nhân viên thuộc bộ phận IT hoặc có mức lương lớn hơn 30000, ta dùng cú pháp:
SELECT * FROM employees WHERE department = 'IT' OR salary > 30000;
ANY
So sánh một giá trị cụ thể với bất kỳ giá trị nào trong một tập dữ liệu. Trả về TRUE nếu điều kiện đúng với ít nhất một giá trị trong tập.
Ví dụ để lấy thông tin nhân viên có mức lương cao hơn ít nhất một nhân viên trong bộ phận IT:
SELECT * FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'IT');
SOME
Tương tự như ANY, toán tử này dùng để so sánh một giá trị với một tập và trả về TRUE nếu điều kiện đúng với ít nhất một giá trị trong tập.
Ví dụ để lấy thông tin các nhân viên có mức lương cao hơn ít nhất một nhân viên trong bộ phận nhân sự, ta có thể dùng cú pháp sau:
SELECT * FROM employees WHERE salary > SOME (SELECT salary FROM employees WHERE department = 'HR');
LIKE
Tìm các hàng có dữ liệu khớp với một mẫu ký tự cụ thể. Thường dùng với ký tự đại diện như % hoặc _.
Ví dụ để lấy thông tin các nhân viên có tên bắt đầu bằng chữ “A”, ta dùng cú pháp:
SELECT * FROM employees WHERE name LIKE 'A%';
IN
Kiểm tra nếu một giá trị có nằm trong một danh sách các giá trị được chỉ định hay không. Trả về TRUE nếu có.
Ví dụ để lấy thông tin nhân viên thuộc bộ phận IT hoặc HR:
SELECT * FROM employees WHERE department IN ('IT', 'HR');
BETWEEN-AND
Kiểm tra một giá trị nằm trong một khoảng giá trị (bao gồm cả giá trị bắt đầu và kết thúc của khoảng) hay không.
Ví dụ để lấy thông tin nhân viên có mức lương nằm trong khoảng từ 20000 đến 40000, ta dùng cú pháp:
SELECT * FROM employees WHERE salary BETWEEN 20000 AND 40000;
NOT
Đảo ngược kết quả của một điều kiện. Nếu điều kiện trả về TRUE, thì khi dùng NOT sẽ trả về FALSE và ngược lại.
Ví dụ để lấy thông tin các nhân viên không thuộc bộ phận IT, ta dùng cú pháp:
SELECT * FROM employees WHERE NOT department = 'IT';
EXIST
Kiểm tra sự tồn tại của một bản ghi trong một tập kết quả con (subquery). Trả về TRUE nếu subquery trả về ít nhất một hàng.
Ví dụ để lấy thông tin các nhân viên trong bảng employees mà có tồn tại trong bảng managers, ta có thể dùng cú pháp sau:
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM managers m WHERE m.employee_id = e.employee_id);
IS NULL
Trả về TRUE nếu giá trị của một trường là NULL, tức là không có giá trị.
Ví dụ để lấy thông tin nhân viên chưa có thông tin về số điện thoại (phone_number là NULL), ta dùng cú pháp:
SELECT * FROM employees WHERE phone_number IS NULL;
SQL Set Operators (Toán tử tập hợp)
Là các toán tử dùng để kết hợp kết quả của nhiều câu truy vấn SELECT. Các toán tử này thao tác trên các tập hợp dữ liệu và trả về kết quả dưới dạng một tập hợp mới, có thể bao gồm các bản ghi duy nhất hoặc giữ nguyên các bản ghi trùng lặp. Set operators thường được sử dụng để so sánh và xử lý các tập dữ liệu từ nhiều bảng khác nhau.
Toán tử | Phép toán | Mô tả |
UNION | Kết hợp | Kết hợp kết quả từ hai hoặc nhiều câu truy vấn và loại bỏ các bản ghi trùng lặp. |
UNION ALL | Kết hợp (giữ trùng lặp) | Kết hợp kết quả từ hai hoặc nhiều câu truy vấn và giữ nguyên các bản ghi trùng lặp. |
INTERSECT | Phép giao | Trả về các bản ghi chung giữa hai hoặc nhiều tập kết quả. Không hỗ trợ trong MySQL. |
MINUS/EXCEPT | Phép hiệu | Trả về các bản ghi có trong tập kết quả của câu truy vấn đầu tiên nhưng không có trong câu truy vấn thứ hai. EXCEPT dùng trong SQL Server còn MINUS sử dụng trong Oracle. |
Ví dụ: để lấy danh sách tên từ bảng employees và managers mà loại bỏ các tên trùng lặp, ta sử dụng toán tử UNION với cú pháp sau:
SELECT name FROM employees UNION SELECT name FROM managers;
Ví dụ: để lấy danh sách tên nhân viên chỉ xuất hiện đồng thời trong cả bảng employees và managers,ta sử dụng toán tử INTERSECT cú pháp sau:
SELECT name FROM employees INTERSECT SELECT name FROM managers;
Ví dụ: để lấy danh sách tên có trong bảng employees nhưng không có trong bảng managers, ta sử dụng toán tử MINUS trong Oracle với cú pháp sau:
SELECT name FROM employees MINUS SELECT name FROM managers;
Nhóm hàm tổng hợp
Hàm tổng hợp (Aggregate functions) trong SQL được sử dụng để thực hiện các phép tính trên một tập hợp dữ liệu và trả về một giá trị duy nhất.
Các hàm này thường được sử dụng cùng với câu lệnh GROUP BY để nhóm các bản ghi lại và thực hiện các phép tính trên mỗi nhóm đó. Dưới đây là một số hàm tổng hợp phổ biến trong SQL:
SUM()
Dùng để tính tổng của một tập các giá trị số.
Ví dụ để tính tổng lương của tất cả nhân viên trong bảng employees, ta dùng cú pháp sau:
SELECT SUM(salary) AS total_salary FROM employees;
MIN()
Trả về giá trị nhỏ nhất trong một tập các giá trị.
Ví dụ để lấy mức lương nhỏ nhất trong bảng employees, ta dùng cú pháp sau:
SELECT MIN(salary) AS lowest_salary FROM employees;
MAX()
Trả về giá trị lớn nhất trong một tập các giá trị.
Ví dụ để lấy mức lương lớn nhất trong bảng employees, ta dùng cú pháp sau:
SELECT MAX(salary) AS highest_salary FROM employees;
COUNT()
Đếm số lượng bản ghi hoặc giá trị không null.
Ví dụ để đếm số lượng nhân viên có mức lương lớn hơn 30000, ta dùng cú pháp sau:
SELECT COUNT(*) AS employees_above_30k FROM employees WHERE salary > 30000;
AVG()
Tính giá trị trung bình của một tập các giá trị số.
Ví dụ để tính trung bình mức lương của nhân viên trong bảng employees, ta dùng cú pháp sau:
SELECT AVG(salary) AS average_salary FROM employees;
Các ràng buộc toàn vẹn
Các ràng buộc toàn vẹn được sử dụng để xác định loại dữ liệu được phép nhập vào bảng, đảm bảo rằng dữ liệu trong cơ sở dữ liệu luôn chính xác và hợp lệ. Ta có các loại ràng buộc như sau:
Ràng buộc DEFAULT
Dùng để cung cấp giá trị mặc định cho cột nếu không có giá trị nào được chỉ định khi nhập dữ liệu.
column_name data_type DEFAULT default_value
Ví dụ để chỉ định giá trị mặc định của cột salary là 30000 nếu không có giá trị nào được nhập cho cột này khi chèn 1 bản ghi vào bảng employee, ta dùng cú pháp sau:
CREATE TABLE employees ( salary INT DEFAULT 30000 );
Ràng buộc NOT NULL
Dùng để cấm giá trị NULL trong cột, đảm bảo rằng mọi bản ghi đều có giá trị cho cột đó.
column_name data_type NOT NULL
Ví dụ để thêm ràng buộc cột Name trong bảng Employees phải có giá trị khác NULL, ta dùng cú pháp sau:
CREATE TABLE employees ( name VARCHAR(50) NOT NULL );
Ràng buộc UNIQUE
Dùng để đảm bảo rằng tất cả các giá trị trong cột là duy nhất và không trùng lặp.
column_name data_type UNIQUE
Ví dụ để cột email trong bảng employees không có giá trị trùng lặp, ta dùng cú pháp sau:
CREATE TABLE employees ( email VARCHAR(100) UNIQUE );
Ràng buộc PRIMARY KEY
Là ràng buộc dùng để xác định duy nhất mỗi hàng (bản ghi) trong bảng. Cột hoặc nhóm cột được đặt làm khóa chính sẽ không cho phép trùng lặp và không chứa giá trị NULL.
Hay nói cách khác thì đây là sự kết hợp của ràng buộc UNIQUE và NOT NULL. Mỗi bảng chỉ được phép có 1 khóa chính.
column_name data_type PRIMARY KEY
Ví dụ để chọn cột employee_id trong bảng employees là khóa chính, đảm bảo rằng mỗi giá trị là duy nhất và không có giá trị NULL, ta dùng cú pháp sau:
CREATE TABLE employees ( employee_id INT PRIMARY KEY );
Ràng buộc FOREIGN KEY
Ràng buộc này dùng để kết nối hai bảng lại với nhau. Cột được khai báo là khóa ngoại trong bảng này sẽ liên kết với khóa chính của một bảng khác. Nó đảm bảo rằng một cột (hoặc một nhóm cột) trong bảng này tham chiếu đến một cột hoặc nhóm cột trong bảng khác. Khóa ngoại giúp duy trì tính toàn vẹn tham chiếu giữa các bảng.
FOREIGN KEY (column_name) REFERENCES other_table(column_name)
Ví dụ để tạo bảng managers với cột manv là khóa ngoại, liên kết với cột manv trong bảng employees, ta có cú pháp như sau:
CREATE TABLE managers ( manv INT, name VARCHAR(50), FOREIGN KEY (manv) REFERENCES employees(manv) );
Ràng buộc CHECK
Ràng buộc này dùng để quy định rằng giá trị trong một cột phải thỏa mãn một điều kiện cụ thể, giúp đảm bảo dữ liệu nhập vào hợp lệ.
column_name data_type CHECK (condition)
Ví dụ để các giá trị của cột salary trong bảng employees chỉ chấp nhận giá trị lớn hơn hoặc bằng 20000 và các giá trị nhỏ hơn sẽ bị từ chối, ta sử dụng cú pháp:
CREATE TABLE employees (salary INT CHECK (salary >= 20000) );
Các câu hỏi thường gặp về câu lệnh SQL
Tại sao phải sử dụng ràng buộc toàn vẹn?
Ràng buộc toàn vẹn giúp đảm bảo tính chính xác và độ tin cậy của dữ liệu trong cơ sở dữ liệu. Ngoài ra ràng buộc toàn vẹn còn ngăn chặn việc nhập các dữ liệu không hợp lệ hoặc sai lệch, duy trì tính toàn vẹn của dữ liệu.
Sự khác biệt giữa DELETE và TRUNCATE là gì?
DELETE dùng để xóa dữ liệu trong bảng, có thể kèm theo điều kiện WHERE. Khi sử dụng DELETE, hệ thống sẽ tạo ra một lệnh thực thi cho mỗi bản ghi thỏa mãn điều kiện xóa và các thao tác này có thể được hoàn tác.
Ngược lại, TRUNCATE dùng để xóa toàn bộ dữ liệu trong bảng mà không thể hoàn tác và chỉ chạy một lần duy nhất, bất kể số lượng bản ghi trong bảng.
Sự khác nhau giữa DDL và DML là gì?
DDL (Data Definition Language) gồm các lệnh như CREATE, ALTER, DROP được sử dụng để định nghĩa và thay đổi cấu trúc của cơ sở dữ liệu và các đối tượng bên trong nó.
Còn DML (Data Manipulation Language) gồm các lệnh như INSERT, UPDATE, DELETE được sử dụng để thao tác dữ liệu bên trong bảng.
Tổng kết Câu lệnh SQL
Câu lệnh SQL là một phần không thể thiếu khi làm việc với cơ sở dữ liệu. Hiểu rõ cách sử dụng các câu lệnh này giúp bạn dễ dàng truy vấn, xử lý và tối ưu hóa dữ liệu. Dù bạn là người mới bắt đầu hay đã có kinh nghiệm, việc nắm vững các câu lệnh SQL là bước đầu tiên để thành công trong công việc quản lý và phân tích dữ liệu.
ITviec hy vọng bài viết trên đã giúp bạn hiểu và sử dụng được các câu lệnh SQL thông dụng.