SQL (Structured Query Language) là ngôn ngữ truy vấn có cấu trúc, được sử dụng để làm việc với cơ sở dữ liệu quan hệ. Đây là ngôn ngữ tiêu chuẩn giúp người dùng truy xuất, xử lý và quản lý dữ liệu được lưu trữ trong các bảng (Table).
Một trong những chức năng quan trọng nhất của SQL là truy vấn dữ liệu (Query). Truy vấn dữ liệu là quá trình trích xuất thông tin từ một hoặc nhiều bảng trong cơ sở dữ liệu dựa trên các điều kiện xác định. Kết quả truy vấn có thể bao gồm các cột dữ liệu mong muốn, được tổng hợp từ nhiều bảng thông qua các mối quan hệ giữa chúng.
Lệnh SELECT là câu lệnh truy vấn phổ biến nhất trong SQL. Lệnh này cho phép người dùng lấy dữ liệu từ cơ sở dữ liệu mà không làm thay đổi nội dung của các bảng. Đây là nền tảng cho hầu hết các thao tác phân tích dữ liệu và xây dựng báo cáo trong SQL.
Cú pháp
SELECT [Option] Column(s)
FROM TableName
[WHERE Conditions]
[GROUP BY Row(s)]
[HAVING]
[ORDER BY Column(s) [ASC | DESC]]
Ý nghĩa các thành phần
| Thành phần | Mô tả |
|---|---|
| SELECT |
Xác định các cột cần truy xuất dữ liệu. Có thể chọn một hoặc nhiều cột. Trong câu lệnh
|
| FROM | Chỉ định bảng chứa dữ liệu cần truy vấn. |
| WHERE (tùy chọn) | Lọc các bản ghi theo điều kiện trước khi trả về kết quả. |
| GROUP BY (tùy chọn) |
Nhóm các bản ghi có cùng giá trị để thực hiện thống kê hoặc tính toán tổng hợp. Khi sử dụng
|
| HAVING (tùy chọn) |
Lọc các nhóm dữ liệu sau khi đã thực hiện
|
| ORDER BY (tùy chọn) | Sắp xếp kết quả truy vấn theo một hoặc nhiều cột. Mặc định là tăng dần (ASC), có thể sử dụng DESC để sắp xếp giảm dần. |
Ví dụ: SELECT DISTINCT Department FROM Employees ORDER BY Department;
Kết quả của câu lệnh trên là danh sách các phòng ban không trùng lặp, được sắp xếp theo thứ tự tăng dần.
Từ khóa SELECT được sử dụng để xác định các trường (cột) cần lấy dữ liệu từ bảng. Bạn có thể chọn toàn bộ các trường hoặc chỉ định từng trường cụ thể tùy theo nhu cầu.
1. Chọn tất cả các trường
Để lấy toàn bộ các cột trong bảng, sử dụng ký tự *.
Cú pháp SELECT *
FROM TableName
Ví dụ SELECT *
FROM Employees
Kết quả sẽ trả về tất cả các cột và tất cả các bản ghi của bảng Employees.
2. Chọn các trường cụ thể
Để chỉ lấy những cột cần thiết, nhập tên các trường và phân tách bằng dấu phẩy (,).
Cú pháp SELECT Field1, Field2, Field3 FROM TableName
Ví dụ SELECT EmployeeID, FullName, Department
FROM Employees
Kết quả chỉ bao gồm ba cột: EmployeeID, FullName và Department.
3. Quy tắc đặt tên trường
Để đảm bảo câu lệnh SQL được thực thi chính xác trong chương trình, tên trường cần tuân theo các quy tắc sau:
| Tình huống | Yêu cầu | Ví dụ |
| Trường có khoảng trắng hoặc ký tự tiếng Việt: | Nếu tên trường chứa khoảng trắng hoặc ký tự tiếng Việt, phải đặt tên trường trong cặp dấu ngoặc vuông []. |
SELECT [Họ và tên], [Ngày sinh] FROM Employees |
| Trường có dấu chấm (.) | Trong chương trình, ký tự dấu chấm (.) trong tên trường phải được thay bằng ký tự #. |
|
| Trường có ký tự xuống dòng | Nếu tiêu đề cột trong Excel được xuống dòng (nhấn Alt + Enter), ký tự xuống dòng phải được thay bằng dấu gạch dưới (_). |
Mã thay bằng [Khách hàng] |
| Trường không có tiêu đề | Nếu một cột trong bảng dữ liệu không có tiêu đề, chương trình sẽ tự động gán tên trường theo vị trí của cột với định dạng Fn, trong đó n là số thứ tự của cột trong bảng dữ liệu (F1, F2, F3,...). |
|
Mệnh đề FROM được sử dụng để xác định bảng hoặc vùng dữ liệu cần truy vấn. Tùy theo cách tổ chức dữ liệu trong Excel, có thể sử dụng một trong các cú pháp sau:
| Cú pháp | Mô tả | Ví dụ |
|---|---|---|
[SheetName$] |
Truy vấn toàn bộ worksheet. Chương trình tự động xác định vùng dữ liệu. Nếu dòng tiêu đề không nằm ở dòng đầu tiên thì tất cả các dòng phía trên dòng tiêu đề phải để trống. | FROM [Employees$] |
[SheetName$A5:Z] |
Truy vấn từ một vùng dữ liệu xác định. A5 là ô đầu tiên của dòng tiêu đề, Z là cột cuối cùng. Chương trình tự động xác định dòng cuối có dữ liệu. |
FROM [Employees$A5:H] |
[SheetName$A5:H1000] |
Truy vấn từ một vùng dữ liệu có xác định cả cột và dòng cuối. Phù hợp khi chỉ muốn đọc một phạm vi dữ liệu cụ thể. | FROM [Employees$A5:H1000] |
[NamedRange] |
Truy vấn từ một vùng dữ liệu đã được đặt tên trong Name Manager của Excel. | FROM [EmployeeData] |
[$A1:H] |
Truy vấn một vùng dữ liệu trên worksheet đầu tiên của tệp Excel. A1 là ô đầu tiên của dòng tiêu đề, H là cột cuối. Chương trình tự động xác định dòng cuối có dữ liệu. |
FROM [$A1:H] |
Lưu ý
Tên worksheet phải được đặt trong dấu ngoặc vuông ([]) và kết thúc bằng ký tự $.
Đối với cú pháp sử dụng địa chỉ ô (A5:H hoặc A5:H1000), ô đầu tiên phải là ô chứa tiêu đề cột.
Khi không chỉ định số dòng cuối (ví dụ: A5:H), chương trình sẽ tự động xác định dòng cuối cùng có dữ liệu.
Named Range phải được tạo trước trong Name Manager của Excel.
Cú pháp [$A1:H] chỉ áp dụng khi muốn truy vấn dữ liệu trên worksheet đầu tiên của tệp Excel mà không cần chỉ định tên worksheet.
A đến IV.Mệnh đề WHERE được sử dụng để lọc dữ liệu theo một hoặc nhiều điều kiện. Chỉ những bản ghi thỏa mãn điều kiện mới được đưa vào kết quả truy vấn.
Cú pháp WHERE điều_kiện
Các điều kiện thường dùng
| Cách sử dụng | Mô tả | Ví dụ |
|---|---|---|
| So sánh bằng | Lọc các bản ghi có giá trị bằng giá trị chỉ định. | WHERE [Phòng ban] = 'Kinh doanh' |
| So sánh khác | Lọc các bản ghi có giá trị khác giá trị chỉ định. | WHERE [Phòng ban] <> 'Kế toán' |
| So sánh lớn hơn, nhỏ hơn | So sánh các giá trị số hoặc ngày tháng. | WHERE [Lương] >= 15000000 |
| So sánh trong khoảng | Lọc các giá trị nằm trong một khoảng xác định. | WHERE [Điểm] BETWEEN 8 AND 10 |
| So sánh nhiều giá trị | Kiểm tra giá trị thuộc một danh sách. | WHERE [Tỉnh] IN ('Hà Nội','Đà Nẵng','TP.HCM') |
| So sánh chuỗi | Tìm kiếm theo mẫu bằng LIKE. |
WHERE [Họ tên] LIKE 'Nguyễn%' |
| Kiểm tra giá trị rỗng | Lọc các ô rỗng hoặc không rỗng. | WHERE [Email] IS NULLWHERE [Email] IS NOT NULL |
| Kết hợp nhiều điều kiện | Kết hợp nhiều điều kiện bằng AND, OR. |
WHERE [Phòng ban] = 'Kinh doanh' AND [Lương] >= 15000000 |
| Phủ định điều kiện | Đảo ngược kết quả của điều kiện. | WHERE NOT [Trạng thái] = 'Nghỉ việc' |
Các toán tử logic
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
AND |
Tất cả các điều kiện đều phải đúng. | WHERE [Phòng ban] = 'Kinh doanh' AND [Lương] > 15000000 |
OR |
Chỉ cần một điều kiện đúng. | WHERE [Phòng ban] = 'Kế toán' OR [Phòng ban] = 'Nhân sự' |
NOT |
Phủ định điều kiện. | WHERE NOT [Giới tính] = 'Nam' |
Lưu ý
| Nội dung | Ví dụ |
|---|---|
Điều kiện chuỗi phải đặt trong dấu nháy đơn ('). |
WHERE [Họ tên] = 'Nguyễn Văn A' |
| Điều kiện số không sử dụng dấu nháy đơn. | WHERE [Số lượng] >= 100 |
| Có thể sử dụng các hàm trong điều kiện. | WHERE LEN([Mã hàng]) = 8 |
| Có thể kết hợp nhiều điều kiện bằng dấu ngoặc để làm rõ thứ tự đánh giá. | WHERE ([Loại] = 'A' OR [Loại] = 'B') AND [Điểm] >= 8 |
| Có thể sử dụng biểu thức tính toán trong điều kiện. | WHERE [Đơn giá] * [Số lượng] > 1000000 |
Các cột có khoảng trắng hoặc ký tự tiếng Việt phải đặt trong dấu ngoặc vuông ([]). |
WHERE [Ngày giao] >= #2026-01-01# |
Giá trị ngày tháng phải đặt trong dấu #...# theo cú pháp của SQL trong Excel. |
WHERE [Ngày lập] BETWEEN #2026-01-01# AND #2026-12-31# |
Giá trị NULL phải kiểm tra bằng IS NULL hoặc IS NOT NULL, không sử dụng = NULL. |
WHERE [Email] IS NULL |
Mệnh đề GROUP BY được sử dụng để nhóm các bản ghi có cùng giá trị của một hoặc nhiều trường thành một nhóm. Mệnh đề này thường được kết hợp với các hàm tổng hợp như COUNT(), SUM(), AVG(), MIN() và MAX() để tính toán trên từng nhóm dữ liệu.
Cú pháp
SELECT trường_nhóm, hàm_tổng_hợp(trường) FROM bảng_dữ_liệu GROUP BY trường_nhóm
Các cách sử dụng
| Cách sử dụng | Mô tả | Ví dụ |
|---|---|---|
| Nhóm theo một trường | Nhóm các bản ghi có cùng giá trị của một trường. | SELECT [Phòng ban], COUNT(*) FROM [Employees$] GROUP BY [Phòng ban] |
| Nhóm theo nhiều trường | Nhóm theo tổ hợp giá trị của nhiều trường. | SELECT [Phòng ban], [Chức vụ], COUNT(*) FROM [Employees$] GROUP BY [Phòng ban], [Chức vụ] |
| Tính tổng theo nhóm | Sử dụng SUM() để tính tổng cho từng nhóm. |
SELECT [Phòng ban], SUM([Lương]) FROM [Employees$] GROUP BY [Phòng ban] |
| Tính giá trị trung bình theo nhóm | Sử dụng AVG() để tính giá trị trung bình. |
SELECT [Phòng ban], AVG([Lương]) FROM [Employees$] GROUP BY [Phòng ban] |
| Tìm giá trị lớn nhất hoặc nhỏ nhất theo nhóm | Sử dụng MAX() hoặc MIN(). |
SELECT [Phòng ban], MAX([Lương]) FROM [Employees$] GROUP BY [Phòng ban] |
| Đếm số bản ghi theo nhóm | Sử dụng COUNT(*) hoặc COUNT([Trường]). |
SELECT [Phòng ban], COUNT(*) FROM [Employees$] GROUP BY [Phòng ban] |
Các hàm tổng hợp thường dùng với GROUP BY
| Hàm | Ý nghĩa | Ví dụ |
|---|---|---|
COUNT(*) |
Đếm số bản ghi trong mỗi nhóm. | COUNT(*) |
COUNT([Trường]) |
Đếm số giá trị khác NULL của trường. |
COUNT([Email]) |
SUM() |
Tính tổng giá trị. | SUM([Doanh thu]) |
AVG() |
Tính giá trị trung bình. | AVG([Điểm]) |
MIN() |
Tìm giá trị nhỏ nhất. | MIN([Lương]) |
MAX() |
Tìm giá trị lớn nhất. | MAX([Lương]) |
Lưu ý
| Nội dung | Ví dụ |
|---|---|
Mọi trường xuất hiện trong SELECT nhưng không sử dụng hàm tổng hợp đều phải có trong mệnh đề GROUP BY. |
SELECT [Phòng ban], SUM([Lương]) FROM [Employees$] GROUP BY [Phòng ban] |
| Có thể nhóm theo một hoặc nhiều trường. | GROUP BY [Phòng ban], [Chức vụ] |
GROUP BY được đặt sau WHERE và trước HAVING hoặc ORDER BY. |
... WHERE [Lương] > 10000000 GROUP BY [Phòng ban] ORDER BY [Phòng ban] |
Có thể kết hợp với WHERE để lọc dữ liệu trước khi nhóm. |
SELECT [Phòng ban], COUNT(*) FROM [Employees$] WHERE [Trạng thái] = 'Đang làm việc' GROUP BY [Phòng ban] |
Muốn lọc kết quả sau khi nhóm, sử dụng HAVING thay vì WHERE. |
SELECT [Phòng ban], SUM([Lương]) FROM [Employees$] GROUP BY [Phòng ban] HAVING SUM([Lương]) > 100000000 |
Có thể sắp xếp kết quả sau khi nhóm bằng ORDER BY. |
SELECT [Phòng ban], SUM([Lương]) FROM [Employees$] GROUP BY [Phòng ban] ORDER BY SUM([Lương]) DESC |
Ví dụ tổng hợp
Ví dụ dưới đây thống kê số nhân viên và tổng lương theo từng phòng ban, chỉ lấy các phòng ban có tổng lương lớn hơn 100.000.000 và sắp xếp theo tổng lương giảm dần.
SELECT [Phòng ban],
COUNT(*) AS [Số nhân viên],
SUM([Lương]) AS [Tổng lương]
FROM [Employees$]
WHERE [Trạng thái] = 'Đang làm việc'
GROUP BY [Phòng ban]
HAVING SUM([Lương]) > 100000000
ORDER BY SUM([Lương]) DESC
Mệnh đề HAVING được sử dụng để lọc kết quả sau khi dữ liệu đã được nhóm bằng mệnh đề GROUP BY. HAVING thường được sử dụng với các hàm tổng hợp như COUNT(), SUM(), AVG(), MIN() và MAX().
Khác với WHERE, mệnh đề HAVING đánh giá điều kiện trên từng nhóm dữ liệu, không phải trên từng bản ghi.
Cú pháp
SELECT trường_nhóm, hàm_tổng_hợp(trường)
FROM bảng_dữ_liệu
[WHERE điều_kiện]
GROUP BY trường_nhóm
HAVING điều_kiện
Các cách sử dụng
| Cách sử dụng | Mô tả | Ví dụ |
|---|---|---|
| Lọc theo số lượng bản ghi | Chỉ lấy các nhóm có số lượng bản ghi thỏa điều kiện. | SELECT [Phòng ban], COUNT(*) FROM [Employees$] GROUP BY [Phòng ban] HAVING COUNT(*) >= 10 |
| Lọc theo tổng giá trị | Chỉ lấy các nhóm có tổng giá trị thỏa điều kiện. | SELECT [Phòng ban], SUM([Lương]) FROM [Employees$] GROUP BY [Phòng ban] HAVING SUM([Lương]) > 100000000 |
| Lọc theo giá trị trung bình | Chỉ lấy các nhóm có giá trị trung bình thỏa điều kiện. | SELECT [Phòng ban], AVG([Lương]) FROM [Employees$] GROUP BY [Phòng ban] HAVING AVG([Lương]) >= 15000000 |
| Lọc theo giá trị lớn nhất hoặc nhỏ nhất | Chỉ lấy các nhóm có giá trị lớn nhất hoặc nhỏ nhất thỏa điều kiện. | SELECT [Phòng ban], MAX([Lương]) FROM [Employees$] GROUP BY [Phòng ban] HAVING MAX([Lương]) > 30000000 |
| Kết hợp nhiều điều kiện | Kết hợp các điều kiện bằng AND, OR, NOT. |
HAVING COUNT(*) >= 10 AND SUM([Lương]) > 100000000 |
So sánh WHERE và HAVING
| Mệnh đề | Thời điểm thực hiện | Áp dụng cho | Có sử dụng hàm tổng hợp |
|---|---|---|---|
WHERE |
Trước khi nhóm dữ liệu | Từng bản ghi | Không |
HAVING |
Sau khi nhóm dữ liệu | Từng nhóm dữ liệu | Có |
Lưu ý
| Nội dung | Ví dụ |
|---|---|
HAVING thường được sử dụng cùng với GROUP BY. |
GROUP BY [Phòng ban] HAVING COUNT(*) > 5 |
Điều kiện trong HAVING thường sử dụng các hàm tổng hợp như COUNT(), SUM(), AVG(), MIN(), MAX(). |
HAVING SUM([Doanh thu]) > 500000000 |
Có thể kết hợp WHERE và HAVING trong cùng một câu lệnh. WHERE lọc dữ liệu trước khi nhóm, HAVING lọc kết quả sau khi nhóm. |
SELECT [Phòng ban], SUM([Lương]) FROM [Employees$] WHERE [Trạng thái] = 'Đang làm việc' GROUP BY [Phòng ban] HAVING SUM([Lương]) > 100000000 |
Có thể kết hợp nhiều điều kiện trong HAVING bằng AND, OR hoặc NOT. |
HAVING COUNT(*) >= 10 AND AVG([Lương]) > 15000000 |
HAVING được đặt sau GROUP BY và trước ORDER BY. |
... GROUP BY [Phòng ban] HAVING COUNT(*) > 5 ORDER BY [Phòng ban] |
Trong SQL VBA Excel (Jet/ACE SQL), không sử dụng bí danh (Alias) của hàm tổng hợp trong mệnh đề HAVING; nên sử dụng lại biểu thức gốc. |
Đúng: HAVING SUM([Lương]) > 100000000Không nên: HAVING [Tổng lương] > 100000000 |
Ví dụ tổng hợp
Ví dụ dưới đây thống kê số nhân viên và tổng lương theo từng phòng ban, chỉ lấy những phòng ban có từ 10 nhân viên trở lên và tổng lương lớn hơn 100.000.000, sau đó sắp xếp theo tổng lương giảm dần.
SELECT [Phòng ban],COUNT(*) AS [Số nhân viên],SUM([Lương]) AS [Tổng lương]
FROM [Employees$]
WHERE [Trạng thái] = 'Đang làm việc'
GROUP BY [Phòng ban]
HAVING COUNT(*) >= 10 AND SUM([Lương]) > 100000000
ORDER BY SUM([Lương]) DESC
Mệnh đề ORDER BY được sử dụng để sắp xếp kết quả truy vấn theo một hoặc nhiều trường. Mặc định, dữ liệu được sắp xếp theo thứ tự tăng dần (ASC). Nếu muốn sắp xếp theo thứ tự giảm dần, sử dụng từ khóa DESC.
Cú pháp
SELECT trường1, trường2, ...
FROM bảng_dữ_liệu
[WHERE điều_kiện]
[GROUP BY trường_nhóm]
[HAVING điều_kiện]
ORDER BY trường1 [ASC|DESC], trường2 [ASC|DESC], ...
Các cách sử dụng
| Cách sử dụng | Mô tả | Ví dụ |
|---|---|---|
| Sắp xếp tăng dần | Sắp xếp theo thứ tự tăng dần. ASC là mặc định nên có thể bỏ qua. |
SELECT * FROM [Employees$] ORDER BY [Họ tên] |
| Sắp xếp giảm dần | Sắp xếp theo thứ tự giảm dần. | SELECT * FROM [Employees$] ORDER BY [Lương] DESC |
| Sắp xếp theo nhiều trường | Dữ liệu được sắp xếp theo trường thứ nhất, nếu trùng sẽ tiếp tục sắp xếp theo trường tiếp theo. | SELECT * FROM [Employees$] ORDER BY [Phòng ban], [Họ tên] |
Kết hợp ASC và DESC |
Mỗi trường có thể sử dụng kiểu sắp xếp khác nhau. | SELECT * FROM [Employees$] ORDER BY [Phòng ban] ASC, [Lương] DESC |
| Sắp xếp theo biểu thức | Có thể sắp xếp theo biểu thức hoặc kết quả của hàm. | SELECT * FROM [Employees$] ORDER BY LEN([Mã NV]), [Mã NV] |
| Sắp xếp sau khi nhóm dữ liệu | Kết hợp với GROUP BY và HAVING để sắp xếp kết quả thống kê. |
SELECT [Phòng ban], SUM([Lương]) FROM [Employees$] GROUP BY [Phòng ban] ORDER BY SUM([Lương]) DESC |
Lưu ý
| Nội dung | Ví dụ |
|---|---|
Nếu không chỉ định ASC hoặc DESC thì mặc định là ASC. |
ORDER BY [Họ tên] tương đương ORDER BY [Họ tên] ASC |
Có thể sắp xếp theo nhiều trường, phân tách bằng dấu phẩy (,). |
ORDER BY [Phòng ban], [Họ tên] |
ORDER BY luôn là mệnh đề cuối cùng trong câu lệnh SELECT. |
... GROUP BY [Phòng ban] HAVING COUNT(*) > 5 ORDER BY [Phòng ban] |
| Có thể sắp xếp theo kết quả của hàm hoặc biểu thức. | ORDER BY LEN([Mã NV]), [Mã NV] |
Trong SQL VBA Excel (Jet/ACE SQL), có thể sắp xếp theo trường xuất hiện trong SELECT hoặc theo biểu thức hợp lệ. |
ORDER BY [Lương] * [Hệ số] DESC |
Khi kết hợp với GROUP BY, có thể sắp xếp theo trường nhóm hoặc theo hàm tổng hợp. |
ORDER BY SUM([Doanh thu]) DESC |
Đối với trường có khoảng trắng hoặc ký tự tiếng Việt, phải đặt tên trường trong dấu ngoặc vuông ([]). |
ORDER BY [Ngày giao hàng] DESC |
Ví dụ tổng hợp
Ví dụ dưới đây thống kê tổng lương theo từng phòng ban và sắp xếp kết quả theo tổng lương từ cao xuống thấp.
SELECT [Phòng ban],SUM([Lương]) AS [Tổng lương]
FROM [Employees$]
GROUP BY [Phòng ban]
ORDER BY SUM([Lương]) DESC
Ví dụ sắp xếp danh sách nhân viên theo phòng ban tăng dần và lương giảm dần trong từng phòng ban.
SELECT [Mã NV], [Họ tên], [Phòng ban], [Lương]
FROM [Employees$]
ORDER BY [Phòng ban] ASC,[Lương] DESC
Các toán tử so sánh được sử dụng chủ yếu trong mệnh đề WHERE để lọc dữ liệu theo một hoặc nhiều điều kiện.
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
= |
Bằng | WHERE [Phòng ban] = 'Kinh doanh' |
<> hoặc != |
Khác | WHERE [Phòng ban] <> 'Kế toán' |
> |
Lớn hơn | WHERE [Lương] > 15000000 |
< |
Nhỏ hơn | WHERE [Tuổi] < 30 |
>= |
Lớn hơn hoặc bằng | WHERE [Điểm] >= 8 |
<= |
Nhỏ hơn hoặc bằng | WHERE [Số lượng] <= 100 |
BETWEEN value1 AND value2 |
Nằm trong khoảng từ value1 đến value2 (bao gồm cả hai giá trị biên). |
WHERE [Lương] BETWEEN 10000000 AND 20000000 |
LIKE |
So sánh chuỗi theo mẫu. Thường kết hợp với ký tự đại diện (%, _). |
WHERE [Họ tên] LIKE 'Nguyễn%' |
IS NULL |
Kiểm tra giá trị rỗng (NULL). | WHERE [Email] IS NULL |
IS NOT NULL |
Kiểm tra giá trị khác rỗng. | WHERE [Email] IS NOT NULL |
IN (value1, value2, ..., valueN) |
Giá trị bằng một trong các giá trị được liệt kê. | WHERE [Thành phố] IN ('Hà Nội','Đà Nẵng','TP.HCM') |
Lưu ý khi sử dụng các toán tử so sánh
| Nội dung | Ví dụ |
|---|---|
Đối với chuỗi ký tự, giá trị phải đặt trong dấu nháy đơn ('). |
WHERE [Phòng ban] = 'Kinh doanh' |
| Đối với số, không sử dụng dấu nháy đơn. | WHERE [Số lượng] >= 100 |
BETWEEN bao gồm cả giá trị đầu và giá trị cuối. Câu lệnh BETWEEN tương đương với việc kết hợp hai phép so sánh >= và <=. |
WHERE [Điểm] BETWEEN 8 AND 10 tương đương với: WHERE [Điểm] >= 8 AND [Điểm] <= 10 |
IN giúp câu lệnh ngắn gọn hơn khi cần so sánh với nhiều giá trị. |
WHERE [Phòng ban] IN ('Kế toán','Kinh doanh','Nhân sự') tương đương với: WHERE [Phòng ban] = 'Kế toán' OR [Phòng ban] = 'Kinh doanh' OR [Phòng ban] = 'Nhân sự' |
Khi sử dụng LIKE, có thể kết hợp với các ký tự đại diện để tìm kiếm theo mẫu. |
%: Đại diện cho 0 hoặc nhiều ký tự. Ví dụ: 'Nguyễn%'_: Đại diện cho đúng 1 ký tự. Ví dụ: 'A_' khớp với An, A1,... |
IS NULL và IS NOT NULL chỉ dùng để kiểm tra giá trị rỗng. Không sử dụng toán tử = hoặc <> với NULL. |
Đúng: WHERE [Email] IS NULLKhông đúng: WHERE [Email] = NULL |
SQL cung cấp nhiều hàm dựng sẵn (Built-in Functions) giúp thực hiện các phép tính, xử lý chuỗi ký tự và chuyển đổi dữ liệu ngay trong câu lệnh truy vấn.
Các hàm có thể sử dụng trong mệnh đề SELECT, WHERE, GROUP BY, HAVING và ORDER BY.
Ví dụ:
SELECT ROUND([Đơn giá], 0) FROM ProductsSELECT * FROM Employees WHERE LEN([Họ tên]) > 201. Hàm số học
Các hàm số học nhận đầu vào là giá trị số và trả về kết quả kiểu số.
| Hàm | Mô tả | Ví dụ |
|---|---|---|
ROUND(n [,m]) |
Làm tròn số n đến m chữ số thập phân. Mặc định m = 0. |
ROUND(123.456,2) → 123.46 |
TRUNC(n [,m]) |
Cắt bỏ phần thập phân sau m chữ số, không làm tròn. |
TRUNC(123.456,2) → 123.45 |
CEIL(n) |
Trả về số nguyên nhỏ nhất lớn hơn hoặc bằng n. |
CEIL(3.2) → 4 |
FLOOR(n) |
Trả về số nguyên lớn nhất nhỏ hơn hoặc bằng n. |
FLOOR(3.8) → 3 |
POWER(m,n) |
Trả về lũy thừa bậc n của m. |
POWER(2,3) → 8 |
SQRT(n) |
Trả về căn bậc hai của n (n ≥ 0). |
SQRT(81) → 9 |
ABS(n) |
Trả về giá trị tuyệt đối của n. |
ABS(-15) → 15 |
SIGN(n) |
Trả về dấu của số (-1, 0, 1). |
SIGN(-8) → -1 |
MOD(m,n) |
Trả về phần dư của phép chia m cho n. |
MOD(17,5) → 2 |
EXP(n) |
Trả về giá trị eⁿ. |
EXP(1) → 2.7182818... |
LOG(n) |
Trả về logarit tự nhiên của n. |
LOG(10) |
2. Hàm xử lý chuỗi
Các hàm xử lý chuỗi nhận đầu vào là chuỗi ký tự và trả về chuỗi hoặc giá trị số.
| Hàm | Mô tả | Ví dụ |
|---|---|---|
LEN(char) hoặc LENGTH(char) |
Trả về số ký tự của chuỗi. | LEN('Excel') → 5 |
CONCAT(char1,char2) |
Ghép hai chuỗi ký tự. | CONCAT('SQL',' Excel') → SQL Excel |
LOWER(char) |
Chuyển chuỗi thành chữ thường. | LOWER('SQL') → sql |
UPPER(char) |
Chuyển chuỗi thành chữ hoa. | UPPER('Excel') → EXCEL |
INITCAP(char) |
Viết hoa ký tự đầu mỗi từ. | INITCAP('nguyen van a') → Nguyen Van A |
NLS_INITCAP(char) |
Viết hoa ký tự đầu mỗi từ, các ký tự còn lại viết thường. | NLS_INITCAP('NGUYEN VAN A') → Nguyen Van A |
LPAD(char1,n[,char2]) |
Bổ sung ký tự bên trái để chuỗi có độ dài n. |
LPAD('25',5,'0') → 00025 |
LTRIM(char) |
Loại bỏ khoảng trắng bên trái chuỗi. | LTRIM(' SQL') → SQL |
RTRIM(char) |
Loại bỏ khoảng trắng bên phải chuỗi. | RTRIM('SQL ') → SQL |
TRIM(char) |
Loại bỏ khoảng trắng ở cả hai đầu chuỗi. | TRIM(' SQL ') → SQL |
SUBSTR(char,m[,n]) |
Lấy chuỗi con từ vị trí m, gồm n ký tự. Nếu bỏ n thì lấy đến hết chuỗi. |
SUBSTR('ABCDEFG',3,2) → CD |
REPLACE(char,search[,replace]) |
Thay thế chuỗi search bằng replace. |
REPLACE('A-B-C','-','/') → A/B/C |
INSTR(char1,char2[,n[,m]]) |
Trả về vị trí xuất hiện của char2 trong char1. |
INSTR('Excel SQL','SQL') → 7 |
ASCII(char) |
Trả về mã ASCII của ký tự đầu tiên. | ASCII('A') → 65 |
CHR(n) |
Trả về ký tự có mã ASCII tương ứng. | CHR(65) → A |
FORMAT(value, format) |
Định dạng giá trị theo chuỗi định dạng và trả về kết quả kiểu chuỗi. Có thể áp dụng cho số hoặc ngày tháng. | |
3. Lưu ý khi sử dụng hàm
| Nội dung | Ví dụ |
|---|---|
| Tên hàm không phân biệt chữ hoa và chữ thường. | ROUND([Điểm], 1)round([Điểm], 1)Round([Điểm], 1) đều có ý nghĩa như nhau. |
| Các hàm có thể lồng nhau để xử lý dữ liệu phức tạp. | UPPER(TRIM([Họ tên])) |
Có thể sử dụng hàm trong biểu thức tính toán hoặc trong điều kiện lọc của mệnh đề WHERE |
ROUND([Đơn giá] * [Số lượng], 0) | WHERE LEN([Mã hàng]) = 8 |