MINI.MIS - Truy vấn SQL cơ bản

TỔNG QUAN BÀI VIẾT

Ngôn ngữ SQL là gì?

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 câu lệnh 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 SELECT, có thể sử dụng một số tùy chọn để thay đổi kết quả truy vấn:

  • DISTINCT: Loại bỏ các bản ghi trùng lặp, chỉ trả về các giá trị duy nhất.

  • TOP n: Trả về n bản ghi đầu tiên của kết quả truy vấn.

  • TOP n PERCENT: Trả về n% số bản ghi đầu tiên trong tập kết quả.

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 GROUP BY, các cột trong phần SELECT phải là:

    • Các cột được liệt kê trong GROUP BY, hoặc

    • Các biểu thức sử dụng hàm tổng hợp như SUM(), COUNT(), AVG(), MIN(), MAX().

HAVING (tùy chọn)

Lọc các nhóm dữ liệu sau khi đã thực hiện GROUP BY.

HAVING chỉ được sử dụng để lọc kết quả sau khi dữ liệu đã được nhóm, trong khi WHERE lọc dữ liệu trước khi thực hiện nhóm.

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

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, FullNameDepartment.


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ự #.

SL.Đặt thay bằng [SL#Đặ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 (_). 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,...).
  • Cột thứ nhất có tiêu đề Mã NV → tham chiếu bằng [Mã NV].
  • Cột thứ hai không có tiêu đề → được gán tên F2.
  • Cột thứ ba có tiêu đề Phòng ban → tham chiếu bằng [Phòng ban].
  • Cột thứ tư không có tiêu đề → được gán tên F4.

Mệnh đề FROM

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.

  • Chương trình hỗ trợ tối đa 255 cột trong một vùng dữ liệu. Cột cuối cùng có thể tham chiếu là IV, tương ứng với vùng dữ liệu từ A đến IV.

Mệnh đề WHERE

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

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()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

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()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

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 WHEREHAVING 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êntổ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

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 ASCDESC 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 BYHAVING để 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ầnlươ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


Từ khóa bí danh AS

Từ khóa AS được sử dụng để đặt bí danh (Alias) cho cột hoặc biểu thức trong kết quả truy vấn. Bí danh chỉ có hiệu lực trong kết quả của câu lệnh SELECTkhông làm thay đổi tên trường trong dữ liệu gốc.

Việc sử dụng AS giúp tiêu đề cột trong kết quả truy vấn ngắn gọn, dễ hiểu và thuận tiện khi lập báo cáo.

Cú pháp

SELECT biểu_thức AS tên_bí_danh FROM bảng_dữ_liệu

Các cách sử dụng

Cách sử dụng Mô tả Ví dụ
Đặt bí danh cho trường Đổi tên cột trong kết quả truy vấn. SELECT [Họ tên] AS [Nhân viên] FROM [Employees$]
Đặt bí danh cho biểu thức Đặt tên cho kết quả của một biểu thức tính toán. SELECT [Số lượng] * [Đơn giá] AS [Thành tiền] FROM [Sales$]
Đặt bí danh cho hàm Đặt tên cho kết quả của hàm. SELECT SUM([Doanh thu]) AS [Tổng doanh thu] FROM [Sales$]
Đặt bí danh cho hàm tổng hợp khi nhóm dữ liệu Kết hợp với GROUP BY để tạo tiêu đề dễ hiểu. SELECT [Phòng ban], COUNT(*) AS [Số nhân viên] FROM [Employees$] GROUP BY [Phòng ban]
Đặt bí danh có khoảng trắng hoặc tiếng Việt Bí danh có khoảng trắng hoặc ký tự tiếng Việt nên đặt trong dấu ngoặc vuông ([]). SELECT [Lương] AS [Lương cơ bản] FROM [Employees$]

Lưu ý

Nội dung Ví dụ
Từ khóa ASkhông bắt buộc. Có thể đặt bí danh trực tiếp sau tên trường hoặc biểu thức. SELECT [Họ tên] [Nhân viên] FROM [Employees$]
Bí danh chỉ có hiệu lực trong kết quả truy vấn, không làm thay đổi tên trường trong worksheet. SELECT [Họ tên] AS [Nhân viên] FROM [Employees$]
Nên đặt bí danh trong dấu ngoặc vuông ([]) nếu chứa khoảng trắng, ký tự tiếng Việt hoặc ký tự đặc biệt. AS [Tổng doanh thu]
Có thể đặt bí danh cho biểu thức hoặc hàm. SELECT ROUND([Lương],0) AS [Lương làm tròn] FROM [Employees$]
Có thể sử dụng bí danh trong WHERE, GROUP BY,ORDER BY nếu được hỗ trợ, tuy nhiên để đảm bảo tương thích, nên sử dụng tên trường hoặc biểu thức gốc. Khuyến nghị: ORDER BY SUM([Doanh thu]) DESC thay vì ORDER BY [Tổng doanh thu] DESC

Ví dụ

Đặt bí danh cho trường

SELECT [Mã NV],Họ tên] AS [Nhân viên],[Phòng ban]
FROM [Employees$]

Kết quả:

Mã NV Nhân viên Phòng ban
NV001 Nguyễn Văn A Kinh doanh
NV002 Trần Thị B Kế toán

Đặt bí danh cho biểu thức

SELECT [Số lượng],[Đơn giá],[Số lượng] * [Đơn giá] AS [Thành tiền]
FROM [Sales$]

Đặt bí danh cho hàm tổng hợp

SELECT [Phòng ban],COUNT(*) AS [Số nhân viên],SUM([Lương]) AS [Tổng lương]
FROM [Employees$]
GROUP BY [Phòng ban]
ORDER BY SUM([Lương]) DESC

Toán tử so sánh và wildcart

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 >=<=. 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 NULLIS 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 NULL
Không đúng: WHERE [Email] = NULL

Các hàm trong SQL

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, HAVINGORDER BY.

Ví dụ:

  • SELECT ROUND([Đơn giá], 0) FROM Products
  • SELECT * FROM Employees WHERE LEN([Họ tên]) > 20

1. 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. FORMAT(1234567.89,'#,##0.00')1,234,567.89
FORMAT(0.256,'0.00%')25.60%
FORMAT(#2026-07-11#,'dd/MM/yy')11/07/26

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




×