Giới thiệu
Ở bài trước, chúng ta đã học cách tạo bảng để lưu trữ dữ liệu và thiết lập các mối quan hệ giữa các bảng. Tuy nhiên, việc quản lý dữ liệu không chỉ dừng lại ở lưu trữ mà còn là khai thác và xử lý dữ liệu để phục vụ công việc. Đó chính là lúc chúng ta cần đến Truy vấn (Query).
Giống như bộ lọc (Filter), Query cho phép bạn chọn lọc dữ liệu từ một hoặc nhiều bảng. Tuy nhiên, Query mạnh mẽ hơn nhiều: nó có thể tính toán, tổng hợp, cập nhật, xóa dữ liệu hàng loạt và là nguồn cung cấp dữ liệu cho Form và Report.
1. Tổng quan về Query
Định nghĩa: Query là một công cụ truy vấn dữ liệu, cho phép bạn tổng hợp, chọn lọc, tính toán và thực hiện các thao tác trên dữ liệu từ một hoặc nhiều bảng để đáp ứng một yêu cầu cụ thể.
Kết quả của Query: Khi chạy (Run) một Query, kết quả trả về là một bảng động (Dynaset). Bảng này trông giống như một bảng thông thường nhưng thực chất chỉ là “ảnh” của dữ liệu nguồn được trích xuất và tính toán theo điều kiện của Query. Dữ liệu gốc vẫn nằm trong các bảng.
Phân loại Query:
Select Query (Truy vấn chọn): Loại phổ biến nhất, dùng để lọc, sắp xếp và tính toán dữ liệu.
Action Query (Truy vấn hành động): Dùng để thay đổi dữ liệu. Bao gồm:
Make-table Query: Tạo một bảng mới từ dữ liệu truy vấn được.
Delete Query: Xóa các bản ghi thỏa mãn điều kiện.
Update Query: Cập nhật (sửa) giá trị của các trường hàng loạt.
Append Query: Thêm các bản ghi từ Query vào cuối một bảng có sẵn.
Total Query (Truy vấn tổng hợp): Dùng để nhóm dữ liệu và tính toán các giá trị tổng hợp (Sum, Avg, Count, Max, Min,…).
Crosstab Query (Truy vấn tham chiếu chéo): Dùng để tổng hợp dữ liệu dưới dạng bảng 2 chiều (dạng bảng tính).
2. Thiết kế Select Query
Select Query là nền tảng cho các loại Query khác.
Các bước thực hiện:
B1: Khởi tạo Query mới.
Trên thanh Ribbon, chọn tab Create.
Trong nhóm Queries, chọn Query Design.
B2: Chọn nguồn dữ liệu.
Hộp thoại Show Table xuất hiện.
Chọn các bảng (tại tab Tables) hoặc các query khác (tại tab Queries) mà bạn muốn lấy dữ liệu. Nhấn Add cho mỗi đối tượng. Sau đó nhấn Close.
B3: Xây dựng truy vấn trên lưới QBE (Query By Example).
Cửa sổ thiết kế Query gồm 2 phần: phần trên là các bảng/query nguồn, phần dưới là lưới QBE.
Đưa các trường cần thiết vào lưới QBE bằng cách: Nhấp đúp vào tên trường trong bảng nguồn, hoặc kéo thả, hoặc chọn trực tiếp từ dòng Field trong lưới.
Trên lưới QBE, khai báo các thông số cho từng trường:
Field: Tên trường hoặc biểu thức (sẽ tạo trường mới).
Table: Tên bảng nguồn của trường (tự động hiện).
Sort: Chọn kiểu sắp xếp (Ascending – tăng dần, Descending – giảm dần).
Show: Bỏ chọn nếu bạn muốn trường này tham gia vào việc lọc/tính toán nhưng không hiển thị trong kết quả.
Criteria: Nhập điều kiện để lọc dữ liệu. (Xem chi tiết mục 3)
Or: Nhập thêm điều kiện hoặc (OR) trên cùng một trường.
B4: Chạy thử và lưu Query.
Để xem kết quả, nhấn Run (biểu tượng dấu chấm than màu đỏ) trên tab Design.
Để quay lại chế độ thiết kế, nhấn View -> Design View.
Nhấn Ctrl + S và đặt tên cho Query để lưu lại.
3. Khai báo điều kiện (Criteria) trong Query
Điều kiện được nhập vào dòng Criteria (hoặc Or) của lưới QBE. Access sẽ so sánh giá trị của trường với điều kiện này và chỉ hiển thị các bản ghi thỏa mãn.
3.1. Các phép toán sử dụng trong điều kiện
| Loại phép toán | Ký hiệu | Ý nghĩa | Ví dụ |
|---|---|---|---|
| So sánh | <, <=, >, >=, =, <> | Nhỏ hơn, nhỏ hơn hoặc bằng, lớn hơn, lớn hơn hoặc bằng, bằng, không bằng. | >60, <> "Nam" |
| Luận lý | AND, OR, NOT | Và, Hoặc, Phủ định. | >=0 AND <=10 |
| Khoảng | BETWEEN ... AND ... | Trong một khoảng (bao gồm cả hai giá trị biên). | BETWEEN #1/1/1990# AND #31/12/1999# |
| Danh sách | IN (value1, value2, ...) | Nằm trong một danh sách các giá trị cho trước. | IN ("Hà Nội", "TP HCM", "Đà Nẵng") |
| Mẫu | LIKE | So sánh với một mẫu, sử dụng các ký tự đại diện. | LIKE "Nguyễn*" |
| Ký tự đại diện trong LIKE | * | Đại diện cho một chuỗi ký tự bất kỳ (có thể không có). | LIKE "*A*" (chứa chữ A) |
? | Đại diện cho một ký tự đơn bất kỳ. | LIKE "T?N" (TAN, TEN, TIN,…) | |
# | Đại diện cho một chữ số đơn (0-9). | LIKE "NV###" (NV001, NV123,…) |
3.2. Viết biểu thức cho các kiểu dữ liệu khác nhau
| Kiểu dữ liệu | Cách viết | Ví dụ |
|---|---|---|
| Số (Number, Currency) | Viết trực tiếp giá trị số. | >=5000000, <> 0 |
| Ngày tháng (Date/Time) | Đặt giữa hai dấu thăng #. | =#12/10/1959#, <#01/01/2000# |
| Văn bản (Text) | Đặt giữa dấu nháy kép “”. Có thể dùng với LIKE. | "Nữ", LIKE "Lê*" |
| Đúng/Sai (Yes/No) | Nhập Yes/No, True/False, On/Off, hoặc -1/0. | Yes, True |
3.3. Một số ví dụ cụ thể
Tìm người có ngày sinh 21/04/1973:
#4/21/1973#Tìm người có họ Trần hoặc Lý:
"Trần" Or "Lý"hoặcIn("Trần","Lý")Tìm người có trình độ từ cấp 2 trở lên:
>=2Tìm người có tên bắt đầu bằng chữ N:
Like "N*"Tìm người có tên dài hơn 4 ký tự:
Len([Ten]) > 4(Sử dụng hàmLen)
4. Tạo trường mới (Calculated Field) trong Select Query
Select Query cho phép tạo ra các trường mới từ các trường đã có bằng các biểu thức tính toán.
Cú pháp:
Tên_trường_mới: Biểu_thức_tính_toán
Lưu ý: Tên trường mới và biểu thức được phân cách bởi dấu hai chấm (:). Tên trường trong biểu thức phải được đặt trong dấu ngoặc vuông [].
Ví dụ:
Tính thành tiền:
ThanhTien: [SoLuong] * [DonGia]Tính năm hiện tại:
NamHienTai: Year(Date())Tính tuổi:
Tuoi: DateDiff("yyyy", [NgaySinh], Date())Tính họ và tên đầy đủ:
HoVaTen: [Ho] & " " & [Ten]
5. Sử dụng tham số (Parameters) trong Query
Tham số cho phép người dùng nhập giá trị từ bàn phím mỗi khi chạy Query, làm cho Query trở nên linh hoạt và có thể tái sử dụng cho nhiều giá trị khác nhau.
Cách thực hiện:
B1: Khai báo tham số (tùy chọn nhưng nên làm).
Trong chế độ Design View của Query, trên tab Design, nhóm Show/Hide, chọn Parameters.
Hộp thoại Query Parameters xuất hiện.
Nhập tên tham số vào cột Parameter (ví dụ:
[Nhap ma phong]). Tên tham số thường được đặt trong dấu ngoặc vuông.Chọn kiểu dữ liệu tương ứng cho tham số trong cột Data Type (ví dụ: Text).
Nhấn OK.
B2: Sử dụng tham số trong điều kiện (Criteria).
Tại dòng Criteria của trường muốn áp dụng, thay vì nhập giá trị cụ thể, bạn nhập tên tham số đã khai báo (kể cả dấu ngoặc vuông).
Ví dụ: Tại trường
MaPhong, nhập[Nhap ma phong]vào ô Criteria.
B3: Chạy Query.
Khi bạn nhấn Run, một hộp thoại nhỏ sẽ hiện ra yêu cầu “Enter Parameter Value” với tên tham số bạn đã đặt.
Nhập giá trị mong muốn và nhấn OK. Query sẽ chạy và trả về kết quả dựa trên giá trị bạn vừa nhập.
Bài tập về :Select Query
Hãy mở CSDL qlyNhanSu.accdb và thực hành trên đó:
PHẦN A: SELECT QUERY CƠ BẢN (Làm quen với lưới QBE)
Bài 2.1: Truy vấn đơn giản trên 1 bảng
Liệt kê toàn bộ thông tin của tất cả nhân viên từ bảng
tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien.Liệt kê danh sách chỉ gồm:
MaNV,HoVaTen,PHAI,NgaySinh.Liệt kê danh sách các phòng ban từ bảng
tbl_Danh_Sach_Phong_Bangồm:MaPB,TenPB.Liệt kê tất cả các dòng chấm công từ bảng
tbl Cham Cong Hang Ngay(chú ý tên bảng có khoảng trắng).
BẢNG MÔ TẢ LỖI THƯỜNG GẶP
BÀI 2.1: TRUY VẤN ĐƠN GIẢN TRÊN 1 BẢNG
| STT | Bài tập | Hiện tượng | Nguyên nhân | Cách xử lý | Ví dụ minh họa |
|---|---|---|---|---|---|
| B1 | 2.1.1 – Lấy tất cả thông tin | Query chạy nhưng thiếu cột | Dùng dấu * nhưng bảng có cột mới thêm sau | Chạy lại query hoặc chọn lại * | SELECT * FROM ... |
| B2 | 2.1.1 – Lấy tất cả thông tin | Query quá chậm | Bảng có quá nhiều dòng (hàng nghìn bản ghi) | Thêm điều kiện lọc hoặc chỉ lấy cột cần thiết | |
| B3 | 2.1.2 – Lấy một số trường | Trường bị lặp lại | Nhấp đúp cùng trường nhiều lần | Xóa cột bị lặp (chọn cột → Delete) | |
| B4 | 2.1.2 – Lấy một số trường | Thứ tự cột không mong muốn | Thêm trường không theo thứ tự | Kéo thả cột để sắp xếp lại thứ tự | |
| B5 | 2.1.3 – Lấy từ bảng khác | Không tìm thấy bảng tbl_Danh_Sach_Phong_Ban | Tên bảng trong CSDL thực tế khác với đề bài | Kiểm tra lại tên bảng thực tế trong Navigation Pane | |
| B6 | 2.1.4 – Bảng có tên khoảng trắng | Lỗi khi thêm bảng | Không tìm thấy bảng do tên có khoảng trắng | Tìm bảng đúng tên trong list, Access tự xử lý | [tbl Cham Cong Hang Ngay] |
Bài 2.2: Truy vấn có sắp xếp (Sort)
Danh sách nhân viên (
MaNV,HoVaTen,NgaySinh) sắp xếp theoHoVaTentăng dần (A→Z).Danh sách nhân viên sắp xếp theo
NgaySinhgiảm dần (người lớn tuổi nhất lên đầu).Danh sách chấm công (
MaNV,Ngay,NghiCoPhep) sắp xếp theoNgaygiảm dần và theoMaNVtăng dần.
BẢNG MÔ TẢ LỖI THƯỜNG GẶP
BÀI 2.2: TRUY VẤN CÓ SẮP XẾP (SORT)
| STT | Bài tập | Hiện tượng | Nguyên nhân | Cách xử lý | Ví dụ minh họa |
|---|---|---|---|---|---|
| B7 | 2.2.1 – Sort tăng dần | Dữ liệu không sắp xếp như mong đợi | Quên chọn Sort hoặc chọn sai cột | Kiểm tra lại ô Sort của đúng cột | HoVaTen: Sort = Ascending |
| B8 | 2.2.1 – Sort tăng dần | Tên có dấu bị sắp xếp sai | Access sắp xếp theo mã Unicode, có dấu tiếng Việt có thể không đúng thứ tự | Chấp nhận hoặc dùng thêm cột phụ không dấu | |
| B9 | 2.2.2 – Sort giảm dần theo ngày | Người già nhất không lên đầu | Chọn Ascending thay vì Descending | Đổi lại Sort = Descending | NgaySinh cũ nhất (nhỏ nhất) → Descending |
| B10 | 2.2.2 – Sort theo ngày | Kết quả lộn xộn | Trường NgaySinh có giá trị NULL | Kiểm tra dữ liệu, xử lý NULL hoặc thêm điều kiện IS NOT NULL | |
| B11 | 2.2.3 – Sort nhiều cột | Chỉ sort được 1 cột | Quên thiết lập Sort cho cột thứ 2 | Thiết lập Sort cho cả 2 cột | Ngay: Descending, MaNV: Ascending |
| B12 | 2.2.3 – Sort nhiều cột | Thứ tự ưu tiên sai | Đặt sai thứ tự cột trong lưới QBE | Sắp xếp lại thứ tự cột (cột ưu tiên để bên trái) | Ngay (trái) → MaNV (phải) |
Bài 2.3: Truy vấn có điều kiện (Criteria) – Kiểu số
Danh sách nhân viên có lương cơ bản (
LuongCoBantrong bảngtbl Danh Sach Nhan Vien) lớn hơn 5,000,000. Gồm:MaNV,LuongCoBan,ChucVu. Hướng dẫnDanh sách nhân viên có lương từ 3,000,000 đến 6,000,000. Hướng dẫn
Danh sách nhân viên có hệ số lương (có thể hiểu là
CapBac) từ 3.0 trở lên. Hướng dẫnDanh sách những ngày công có số giờ tăng ca (
SoGioTangCatrong bảngtbl Theo Doi Gio Tang Ca) lớn hơn 4 giờ.2. Hướng dẫn
Các toán tử so sánh số trong Bài 2.3
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
> | Lớn hơn | >5000000 |
>= | Lớn hơn hoặc bằng | >=3.0 |
< | Nhỏ hơn | <1000000 |
<= | Nhỏ hơn hoặc bằng | <=2000000 |
= | Bằng | =5000000 |
<> | Khác | <>0 |
Between...And | Trong khoảng (bao gồm cả 2 đầu) | Between 3000000 And 6000000 |
And | Và (kết hợp điều kiện) | >=3000000 And <=6000000 |
BẢNG MÔ TẢ LỖI THƯỜNG GẶP
BÀI 2.3: TRUY VẤN CÓ ĐIỀU KIỆN (CRITERIA)
| STT | Bài tập | Hiện tượng | Nguyên nhân | Cách xử lý | Ví dụ minh họa |
|---|---|---|---|---|---|
| B13 | 2.3.1 – Điều kiện số | Không lọc được | Dùng dấu phẩy thay vì dấu chấm (VD: 5,000,000) | Dùng số nguyên không dấu phẩy | 5000000 (đúng) – 5,000,000 (sai) |
| B14 | 2.3.1 – Điều kiện số | Lỗi “Data type mismatch” | So sánh số với chuỗi | Đảm bảo trường là kiểu Number | |
| B15 | 2.3.2 – Điều kiện ngày | Không lọc được theo tháng | Quên hàm Month() | Dùng Month([NgaySinh]) = 5 | |
| B16 | 2.3.2 – Điều kiện ngày | Lỗi khi nhập ngày | Không đặt ngày trong dấu # | Đặt ngày trong # | #01/01/1980# |
| B17 | 2.3.3 – Điều kiện chuỗi | Lọc không chính xác | Dùng = thay vì LIKE | Dùng LIKE với ký tự đại diện | LIKE "Nguyễn*" |
| B18 | 2.3.3 – Điều kiện chuỗi | LIKE không hoạt động | Quên dấu ngoặc kép | Đặt chuỗi trong dấu ” “ | LIKE "Hà Nội" |
| B19 | 2.3.4 – Kết hợp AND/OR | Kết quả sai | Đặt AND/OR sai chỗ | AND cùng dòng, OR khác dòng | Criteria: >0 AND <10 |
| B20 | 2.3.4 – Kết hợp AND/OR | Không lọc được OR | Ghi OR trên cùng dòng | Ghi điều kiện OR ở dòng Or riêng |
Bài mở rộng
Hãy tự thực hành thêm:
5. Danh sách nhân viên có lương nhỏ hơn 4,000,000
6. Danh sách nhân viên có hệ số lương từ 2.5 đến 3.5
7. anh sách tăng ca có số giờ từ 2 đến 4 giờ
8. Kết hợp điều kiện: lương > 5,000,000 VÀ hệ số lương > 3.0
Bài 2.4: Truy vấn có điều kiện – Kiểu ngày tháng
Danh sách nhân viên sinh sau ngày 01/01/1980. Gồm:
HoVaTen,NgaySinh,NoiSinh. Hướng dẫnDanh sách nhân viên sinh trong tháng 5 (bất kỳ năm nào). (Gợi ý: dùng hàm
Month([NgaySinh]) = 5). Hướng dẫnDanh sách chấm công trong tháng 3 năm 2026 (bảng
tbl Cham Cong Hang Ngay). Hướng dẫnDanh sách tăng ca trong quý 1 năm 2026 (bảng
tbl Theo Doi Gio Tang Ca). Hướng dẫn
Bài tập mở rộng:
Câu | Yêu cầu | Gợi ý |
5 | Nhân viên sinh trong năm 1990 | Year([NgaySinh]) = 1990 |
6 | Chấm công trong tháng 12/2025 | Month([Ngay])=12 And Year([Ngay])=2025 |
7 | Tăng ca trong quý 4/2026 | DatePart(“q”,[Ngay])=4 And Year([Ngay])=2026 |
8 | Nhân viên sinh từ 1980 đến 1990 | Between #01/01/1980# And #31/12/1990# |
9 | Chấm công 7 ngày gần nhất | [Ngay] >= Date() – 7 |
Bảng các hàm xử lý ngày tháng
| Hàm | Ý nghĩa | Ví dụ |
|---|---|---|
Month([Ngay]) | Lấy tháng (1-12) | Month([NgaySinh]) = 5 |
Year([Ngay]) | Lấy năm (4 số) | Year([Ngay]) = 2026 |
Day([Ngay]) | Lấy ngày trong tháng (1-31) | Day([Ngay]) = 15 |
DatePart("q", [Ngay]) | Lấy quý (1-4) | DatePart("q", [Ngay]) = 1 |
Weekday([Ngay]) | Lấy thứ trong tuần (1-7) | Weekday([Ngay]) = 2 (thứ 2) |
Date() | Ngày hiện tại | [Ngay] < Date() |
Các toán tử so sánh ngày
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
> | Sau ngày | > #01/01/1980# |
< | Trước ngày | < #01/01/2000# |
>= | Từ ngày trở đi | >= #01/01/2026# |
<= | Đến ngày | <= #31/12/2026# |
Between...And | Trong khoảng ngày | Between #01/01/2026# And #31/03/2026# |
Lưu ý quan trọng
Ngày tháng phải trong dấu #:
#01/01/1980#(đúng) –01/01/1980(sai)Định dạng ngày phụ thuộc vào Regional Settings của máy tính
Nếu máy tính dùng định dạng dd/mm/yyyy: gõ
#01/01/1980#Nếu máy tính dùng mm/dd/yyyy: gõ
#01/01/1980#vẫn được, Access tự xử lý
Kết hợp nhiều điều kiện: Dùng
Andđể kết hợpSử dụng hàm trong Criteria: Không cần dấu ngoặc kép cho tên hàm
BẢNG MÔ TẢ LỖI THƯỜNG GẶP
BÀI 2.4: TRUY VẤN TÍNH TOÁN (CALCULATED FIELD)
| STT | Bài tập | Hiện tượng | Nguyên nhân | Cách xử lý | Ví dụ minh họa |
|---|---|---|---|---|---|
| B21 | 2.4.1 – Tính thâm niên | Lỗi “Undefined function” | Sai tên hàm DateDiff | Kiểm tra lại cú pháp hàm | DateDiff("yyyy",[NgayVaoLam],Date()) |
| B22 | 2.4.1 – Tính thâm niên | Kết quả sai (số âm) | Đảo ngược tham số | Đảm bảo tham số đúng thứ tự | Ngày cũ trước, ngày mới sau |
| B23 | 2.4.2 – Tính tuổi | Kết quả lẻ | Dùng sai hàm | Dùng DateDiff("yyyy",[NgaySinh],Date()) | |
| B24 | 2.4.3 – Tính phụ cấp | Lỗi #Name? | Tên trường sai | Kiểm tra lại tên trường trong ngoặc vuông | [LuongCoBan] (đúng) |
| B25 | 2.4.3 – Tính phụ cấp | Kết quả 0 | Lỗi kiểu dữ liệu (số lưu dạng text) | Chuyển đổi kiểu dữ liệu trong bảng | |
| B26 | 2.4.4 – Tính tổng công | Kết quả NULL nếu có trường NULL | NULL + số = NULL | Dùng hàm Nz() | Nz([NghiKhongPhep],0) + Nz([NghiCoPhep],0) |
Bài 2.5: Truy vấn có điều kiện – Kiểu chuỗi (Text)
Danh sách nhân viên nữ (
PHAI = Yes). Hiển thịMaNV,HoVaTen,PHAI.Danh sách nhân viên có nơi sinh (
NoiSinh) ở “Hà Nội”.Danh sách nhân viên có họ (ký tự đầu tiên của
HoVaTen) là “Nguyễn”. (Gợi ý: dùngLIKE "Nguyễn*").Danh sách nhân viên có số CMND (
SoCMND) bắt đầu bằng “123”.
Bài 2.6: Kết hợp nhiều điều kiện (AND, OR)
Danh sách nhân viên Nữ và có lương cơ bản trên 4,000,000.
Danh sách nhân viên Nam hoặc có nơi sinh ở “TP HCM”.
Danh sách nhân viên sinh từ năm 1980 đến 1990 và có quê ở “Hà Nội”.
Danh sách những ngày công có
NghiKhongPhep> 0 hoặcNghiCoPhep> 0.
PHẦN B: SELECT QUERY NÂNG CAO (Tính toán, liên kết bảng)
Bài 2.7: Tạo trường mới (Calculated Field)
Tạo Query tính Thâm niên công tác (số năm) của mỗi nhân viên dựa trên
NgayVaoLam(bảngtbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien) so với ngày hiện tại (Date()). Gồm:MaNV,HoVaTen,NgayVaoLam,ThamNien: DateDiff("yyyy",[NgayVaoLam],Date()).Tạo Query tính Tiền phụ cấp thâm niên =
LuongCoBan* 1% *ThamNien(cần tính thâm niên trước hoặc kết hợp biểu thức).Tạo Query tính Tuổi của nhân viên dựa trên
NgaySinh.Tạo Query tính Tổng công =
NghiKhongPhep+NghiCoPhep+PhepNam+NghiBenh75+NghiBenh100từ bảngtbl Cham Cong Hang Ngay. Gồm:MaNV,Ngay,TongCong.
Bài 2.8: Truy vấn liên kết nhiều bảng (Join)
Liệt kê danh sách nhân viên kèm theo tên phòng ban (kết nối
tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vienvớitbl_Danh_Sach_Phong_BanquaMaPB). Gồm:MaNV,HoVaTen,TenPB.Liệt kê thông tin chấm công kèm theo họ tên nhân viên (kết nối
tbl Cham Cong Hang Ngayvớitbl_Thong_Tin_Ca_Nhan_Cua_Nhan_VienquaMaNV). Gồm:Ngay,HoVaTen,NghiKhongPhep,NghiCoPhep.Liệt kê thông tin tăng ca kèm theo họ tên và phòng ban của nhân viên (kết nối 3 bảng:
tbl Theo Doi Gio Tang Ca,tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien,tbl_Danh_Sach_Phong_Ban). Gồm:Ngay,HoVaTen,TenPB,SoGioTangCa,GhiChu.Danh sách nhân viên và cấp bậc/hệ số lương hiện tại (kết nối
tbl Danh Sach Nhan Vienvớitbl_Thong_Tin_Ca_Nhan_Cua_Nhan_VienquaMaNV). Gồm:MaNV,HoVaTen,ChucVu,LuongCoBan.
Bài 2.9: Sử dụng tham số (Parameters) trong Query
Tạo Query cho phép nhập
MaNVtừ bàn phím và hiển thị toàn bộ thông tin cá nhân của nhân viên đó.Tạo Query cho phép nhập
TenPB(tên phòng ban) và hiển thị danh sách nhân viên thuộc phòng đó.Tạo Query cho phép nhập khoảng lương (từ… đến…) và hiển thị danh sách nhân viên có lương trong khoảng đó.
Tạo Query cho phép nhập tháng và năm (ví dụ: 3 và 2026) và hiển thị danh sách chấm công của tháng đó.
6. Thiết kế Action Query
Lưu ý quan trọng: Action Query trực tiếp thay đổi dữ liệu trong bảng. Cần hết sức thận trọng khi chạy các loại Query này. Nên sao lưu CSDL trước khi thực hiện.
6.1. Make-Table Query (Truy vấn tạo bảng)
Dùng để tạo một bảng mới từ dữ liệu của Query.
Cách tạo: Thiết kế Select Query như bình thường -> Trên tab Design, nhóm Query Type, chọn Make Table -> Nhập tên bảng mới -> Nhấn Run.
6.2. Delete Query (Truy vấn xóa)
Dùng để xóa các bản ghi thỏa mãn điều kiện.
Cách tạo: Thiết kế Select Query với các trường và điều kiện để xác định các bản ghi cần xóa -> Trên tab Design, chọn Delete -> Lưới QBE sẽ xuất hiện dòng Delete (thường là “Where”) -> Nhấn Run và xác nhận xóa.
6.3. Update Query (Truy vấn cập nhật)
Dùng để cập nhật giá trị của một hoặc nhiều trường hàng loạt.
Cách tạo: Thiết kế Select Query với các trường cần cập nhật và điều kiện -> Trên tab Design, chọn Update -> Lưới QBE xuất hiện dòng Update To -> Tại ô Update To của trường cần sửa, nhập giá trị mới hoặc biểu thức (ví dụ:
[LuongCoBan] * 1.1) -> Nhập điều kiện tại dòng Criteria (nếu cần) -> Nhấn Run và xác nhận cập nhật.
6.4. Append Query (Truy vấn thêm)
Dùng để thêm các bản ghi từ Query này vào cuối một bảng khác đã tồn tại.
Cách tạo: Thiết kế Select Query với các trùng chứa dữ liệu nguồn -> Trên tab Design, chọn Append -> Hộp thoại Append hiện ra, chọn tên bảng đích -> Nhấn OK -> Lưới QBE xuất hiện dòng Append To để ánh xạ trường nguồn với trường đích -> Nhấn Run và xác nhận thêm.
Bài tập
Lưu ý quan trọng: Trước khi thực hành, hãy sao lưu CSDL qlyNhanSu.accdb bằng cách Copy/Paste thành file qlyNhanSu_Backup.accdb để phòng trường hợp cần khôi phục dữ liệu.
BÀI TẬP 2.10: THIẾT KẾ MAKE-TABLE QUERY
Yêu cầu chung: Sử dụng các bảng dữ liệu trong tệp qlyNhanSu.accdb để thực hiện các câu truy vấn tạo bảng sau:
10.1: Tạo bảng nhân viên nữ từ bảng thông tin cá nhân. (Dùng tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien, lọc PHAI = Yes).
10.2: Tạo bảng nhân viên lương cao từ bảng danh sách nhân viên. (Dùng tbl Danh Sach Nhan Vien, lọc LuongCoBan > 5000000).
10.3: Tạo bảng chấm công tháng 3 năm 2026 từ bảng chấm công. (Dùng tbl Cham Cong Hang Ngay, lọc Month([Ngay])=3 And Year([Ngay])=2026, lấy tất cả trường).
10.4: Tạo bảng nhân viên tăng ca nhiều (>4 giờ) từ bảng theo dõi tăng ca. (Dùng tbl Theo Doi Gio Tang Ca, lọc SoGioTangCa > 4, lấy các trường chính).
BÀI TẬP 2.11: THIẾT KẾ DELETE QUERY
Yêu cầu chung: Sử dụng các bảng dữ liệu trong tệp qlyNhanSu.accdb để thực hiện các câu truy vấn xóa sau:
11.1. Xóa tất cả nhân viên nữ khỏi bảng Nu_NhanVien (bảng đã tạo ở bài 2.10.1).
11.2. Xóa các nhân viên có lương cơ bản < 3,000,000 khỏi bảng LuongCao (bảng đã tạo ở bài 2.10.2).
11.3. Xóa toàn bộ dữ liệu trong bảng ChamCong_Thang3_2026 (bảng đã tạo ở bài 2.10.3).
11.4. Xóa các bản ghi có số giờ tăng ca <= 2 giờ khỏi bảng TangCa_Nhieu (bảng đã tạo ở bài 2.10.4).
11.5. Xóa tất cả nhân viên thuộc phòng ban có mã MaPB = 5 khỏi bảng tbl Danh Sach Nhan Vien.
BÀI TẬP 2.12: THIẾT KẾ UPDATE QUERY
Yêu cầu chung: Sử dụng các bảng dữ liệu trong tệp qlyNhanSu.accdb để thực hiện các câu truy vấn cập nhật sau:
12.1. Tăng lương cơ bản thêm 10% cho tất cả nhân viên thuộc phòng ban có mã MaPB = 4 (Phòng Kinh Doanh) trong bảng tbl Danh Sach Nhan Vien.
12.2. Cập nhật chức vụ thành “Quản lý cấp cao” cho những nhân viên có lương cơ bản > 7,000,000 trong bảng tbl Danh Sach Nhan Vien.
12.3. Cập nhật cột GhiChu thành “Tăng ca nhiều” cho các bản ghi trong bảng tbl Theo Doi Gio Tang Ca có SoGioTangCa > 5.
12.4. Cập nhật hệ số lương (CapBac) thành 3.5 cho những nhân viên có lương cơ bản > 6,000,000 trong bảng tbl Danh Sach Nhan Vien.
12.5. Cập nhật cột GhiChu thành “Nghỉ không phép” cho các bản ghi trong bảng tbl Cham Cong Hang Ngay có NghiKhongPhep > 0.
12.6. Tăng lương cơ bản thêm 5% cho tất cả nhân viên có CapBac >= 4.0 trong bảng tbl Danh Sach Nhan Vien.
BÀI TẬP 2.13: THIẾT KẾ APPEND QUERY
Yêu cầu chung: Sử dụng các bảng dữ liệu trong tệp qlyNhanSu.accdb để thực hiện các câu truy vấn thêm sau:
13.1. Thêm các nhân viên nữ từ bảng tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien vào bảng Nu_NhanVien (bảng đã tạo ở bài 2.10.1).
13.2. Thêm các nhân viên có lương > 5,000,000 từ bảng tbl Danh Sach Nhan Vien vào bảng LuongCao (bảng đã tạo ở bài 2.10.2).
13.3. Thêm các bản ghi chấm công trong tháng 4 năm 2026 từ bảng tbl Cham Cong Hang Ngay vào bảng ChamCong_Thang3_2026 (bảng đã tạo ở bài 2.10.3).
13.4. Thêm các bản ghi tăng ca có số giờ từ 2 đến 4 giờ từ bảng tbl Theo Doi Gio Tang Ca vào bảng TangCa_Nhieu (bảng đã tạo ở bài 2.10.4).
13.5. Thêm các nhân viên có CapBac >= 4.0 từ bảng tbl Danh Sach Nhan Vien vào bảng NhanVien_CapCao (tạo bảng mới nếu chưa có, gồm các trường: MaNV, CapBac, ChucVu, LuongCoBan).
13.6. Thêm các bản ghi có NghiKhongPhep > 0 từ bảng tbl Cham Cong Hang Ngay vào bảng NghiKhongPhep_List (tạo bảng mới nếu chưa có, gồm các trường: MaNV, Ngay, NghiKhongPhep).
13.7. Thêm các nhân viên có NgaySinh trước ngày 01/01/1980 từ bảng tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien vào bảng NhanVien_LonTuoi (tạo bảng mới nếu chưa có, gồm các trường: MaNV, HoVaTen, NgaySinh, NoiSinh).
7. Thiết kế Total Query (Truy vấn tổng hợp)
Total Query là loại truy vấn đặc biệt trong Microsoft Access (và các hệ quản trị CSDL tương tự) dùng để nhóm dữ liệu theo một hoặc nhiều trường, sau đó thực hiện các phép tính thống kê trên từng nhóm. Nó thường được sử dụng khi bạn muốn phân tích dữ liệu ở mức tổng hợp thay vì chi tiết từng bản ghi.
Chức năng chính
Nhóm dữ liệu (Group By): Các bản ghi có cùng giá trị ở một hoặc nhiều trường sẽ được gom lại thành một nhóm.
Ứng dụng thực tế
Báo cáo doanh thu theo từng tháng/năm.
Thống kê số lượng sản phẩm bán ra theo từng loại.
Tính điểm trung bình của sinh viên theo lớp/khoa.
Đếm số đơn hàng theo từng nhân viên bán hàng.
Ví dụ minh họa
Giả sử bạn có bảng Hóa đơn với các trường:
MaKH(Mã khách hàng)SoTien(Số tiền hóa đơn)
Nếu bạn tạo Total Query:
Group By MaKH
Sum SoTien
👉 Kết quả sẽ cho biết tổng số tiền mà mỗi khách hàng đã chi trả.
| Hàm | Ý nghĩa |
|---|---|
| Group By | Nhóm các bản ghi có cùng giá trị lại với nhau. |
| Sum | Tính tổng các giá trị của trường trong nhóm. |
| Avg | Tính giá trị trung bình của trường trong nhóm. |
| Count | Đếm số lượng bản ghi trong nhóm. |
| Max | Tìm giá trị lớn nhất của trường trong nhóm. |
| Min | Tìm giá trị nhỏ nhất của trường trong nhóm. |
| Expression | Cho biết trường này là một biểu thức tính toán tùy chỉnh. |
| Where | Dùng để chỉ định điều kiện lọc trước khi nhóm. Trường có chọn Where sẽ không hiển thị trong kết quả. |
Các bước thực hiện:
Thiết kế Select Query bình thường, đưa các trường cần thiết vào lưới QBE.
Trên tab Design, nhóm Show/Hide, chọn Totals (biểu tượng chữ Σ). Một dòng mới Total: sẽ xuất hiện trên lưới QBE.
Tại dòng Total:
Với trường dùng để nhóm (ví dụ:
MaKhachHang), chọn Group By.Với trường cần tính toán (ví dụ:
ThanhTien), chọn hàm tổng hợp mong muốn (ví dụ: Sum để tính tổng tiền).
Thiết lập điều kiện (nếu cần) tại dòng Criteria. Có thể đặt điều kiện cho trường nhóm hoặc cho trường tổng hợp.
Chạy và lưu Query.
CÁC LỖI THƯỜNG GẶP
| Hiện tượng | Nguyên nhân | Cách xử lý |
|---|---|---|
| Thiếu dòng Total | Quên nhấn nút Totals (Σ) | Nhấn Totals trên tab Design |
| Kết quả sai | Chọn sai hàm (VD: Sum thay vì Avg) | Kiểm tra lại dòng Total |
| Lỗi “Cannot group on Memo” | Cột là kiểu Memo | Chuyển sang Text hoặc không Group By |
| Kết quả NULL | Có giá trị NULL trong dữ liệu | Dùng hàm Nz() hoặc xử lý dữ liệu |
| Thiếu dữ liệu | Quên điều kiện lọc | Thêm điều kiện ở dòng Criteria |
BÀI TẬP 2.14: THIẾT KẾ TOTAL QUERY
Yêu cầu chung: Sử dụng các bảng dữ liệu trong tệp qlyNhanSu.accdb để thực hiện các câu truy vấn tổng hợp (Total Query) sau:
14.1. Tính tổng số nhân viên theo từng phòng ban. Hiển thị: MaPB, TongSoNV. Hướng dẫn
14.2. Tính tổng số nhân viên theo từng chức vụ. Hiển thị: ChucVu, TongSoNV.Hướng dẫn
14.3. Tính lương trung bình của nhân viên theo từng phòng ban. Hiển thị: MaPB, LuongTrungBinh. Hướng dẫn
14.4. Tính lương trung bình của nhân viên theo từng chức vụ. Hiển thị: ChucVu, LuongTrungBinh. Hướng dẫn
14.5. Tính tổng số giờ tăng ca theo từng nhân viên (từ bảng tbl Theo Doi Gio Tang Ca). Hiển thị: MaNV, TongGioTangCa. Hướng dẫn
14.6. Tính tổng số ngày nghỉ không phép theo từng nhân viên (từ bảng tbl Cham Cong Hang Ngay). Hiển thị: MaNV, TongNghiKhongPhep. Hướng dẫn
14.7. Tính tổng số ngày nghỉ có phép theo từng nhân viên (từ bảng tbl Cham Cong Hang Ngay). Hiển thị: MaNV, TongNghiCoPhep. Hướng dẫn
14.8. Tính tổng số ngày nghỉ phép năm theo từng nhân viên (từ bảng tbl Cham Cong Hang Ngay). Hiển thị: MaNV, TongPhepNam. Hướng dẫn
14.9. Tính tổng số ngày nghỉ bệnh (cả 75% và 100%) theo từng nhân viên (từ bảng tbl Cham Cong Hang Ngay). Hiển thị: MaNV, TongNghiBenh. Hướng dẫn
14.10. Tính điểm trung bình (nếu có bảng điểm) hoặc tính tổng số nhân viên theo từng quê quán (từ bảng tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien). Hiển thị: NoiSinh, SoLuong. Hướng dẫn
8. Thiết kế Crosstab Query (Truy vấn tham chiếu chéo)
Crosstab Query là một loại truy vấn đặc biệt trong Microsoft Access, dùng để trình bày dữ liệu tổng hợp dưới dạng bảng hai chiều (giống bảng tính Excel). Nó giúp bạn dễ dàng so sánh dữ liệu theo cả hàng và cột, thay vì chỉ theo một chiều như Total Query.
🛠 Đặc điểm chính
Hàng (Row Heading): Xác định cách dữ liệu được nhóm theo chiều dọc.
Cột (Column Heading): Xác định cách dữ liệu được nhóm theo chiều ngang.
Giá trị (Value): Là kết quả thống kê (Sum, Avg, Count, Max, Min…) hiển thị tại giao điểm giữa hàng và cột.
📊 Ví dụ minh họa
Giả sử bạn có bảng Doanh số với các trường:
NhanVien(Tên nhân viên)Thang(Tháng bán hàng)SoTien(Doanh số bán được)
Nếu tạo Crosstab Query:
Row Heading:
NhanVienColumn Heading:
ThangValue:
Sum(SoTien)
👉 Kết quả sẽ là bảng hiển thị tổng doanh số của từng nhân viên theo từng tháng, rất trực quan để so sánh.
Các thành phần trong Crosstab Query:
Row Heading (Tiêu đề hàng): Các trường sẽ được hiển thị thành các hàng.
Column Heading (Tiêu đề cột): Một trường duy nhất sẽ được hiển thị thành các cột.
Value (Giá trị): Một trường duy nhất sẽ được tổng hợp và hiển thị tại các ô giao nhau giữa hàng và cột.
Các bước thực hiện:
Thiết kế Select Query chứa tất cả các trường cần thiết (ít nhất 3 trường: cho hàng, cho cột, cho giá trị).
Trên tab Design, nhóm Query Type, chọn Crosstab. Lưới QBE sẽ xuất hiện thêm dòng Crosstab và Total.
Tại dòng Crosstab:
Chọn trường làm tiêu đề hàng: chọn Row Heading.
Chọn trường duy nhất làm tiêu đề cột: chọn Column Heading.
Chọn trường duy nhất làm giá trị: chọn Value.
Tại dòng Total:
Với trường Row Heading và Column Heading: chọn Group By.
Với trường Value: chọn hàm tổng hợp (ví dụ: Sum, Count, Avg).
(Tùy chọn) Để cố định thứ tự các cột, nhấp chuột phải vào vùng trống của cửa sổ thiết kế, chọn Properties, và nhập danh sách các tiêu đề cột vào thuộc tính Column Headings (ví dụ:
"Quy1";"Quy2";"Quy3";"Quy4").Chạy và lưu Query.
TÓM TẮT CÁC BƯỚC THỰC HIỆN CHUNG
| Bước | Thao tác | Hình ảnh minh họa | Giải thích |
|---|---|---|---|
| 1 | Trên thanh Ribbon, chọn tab Create | [Create] | Tạo đối tượng mới |
| 2 | Trong nhóm Queries, nhấn Query Design | [Query Design] | Tạo truy vấn mới |
| 3 | Thêm các bảng cần dùng vào truy vấn | Chọn bảng → Add → Close | |
| 4 | Trên tab Design, nhóm Query Type, chọn Crosstab | [Crosstab] | Chuyển sang chế độ Crosstab |
| 5 | Lưới QBE xuất hiện thêm dòng Crosstab và Total | ||
| 6 | Đưa các trường vào lưới QBE | Nhấp đúp vào các trường | |
| 7 | Thiết lập tại dòng Crosstab: | ||
| – Trường làm tiêu đề hàng: chọn Row Heading | |||
| – Trường làm tiêu đề cột: chọn Column Heading | |||
| – Trường làm giá trị: chọn Value | |||
| 8 | Thiết lập tại dòng Total: | ||
| – Row Heading và Column Heading: chọn Group By | |||
| – Value: chọn hàm tổng hợp (Sum, Count, Avg, …) | |||
| 9 | Nhấn Run để xem kết quả | [! Run] | |
| 10 | Lưu truy vấn: Ctrl + S, đặt tên |
BÀI TẬP 2.15: THIẾT KẾ CROSSTAB QUERY
Yêu cầu chung: Sử dụng các bảng dữ liệu trong tệp qlyNhanSu.accdb để thực hiện các câu truy vấn tham chiếu chéo (Crosstab Query) sau:
15.1. Thống kê tổng số nhân viên theo từng phòng ban và theo từng chức vụ. Hướng dẫn
Row Heading:
TenPB(tên phòng ban)Column Heading:
ChucVu(chức vụ)Value: Đếm số lượng nhân viên (
Count)
5.2. Thống kê tổng lương cơ bản của nhân viên theo từng phòng ban và theo từng chức vụ. Hướng dẫn
Row Heading:
TenPB(tên phòng ban)Column Heading:
ChucVu(chức vụ)Value: Tổng lương cơ bản (
SumcủaLuongCoBan)
15.3. Thống kê số lượng nhân viên theo từng quê quán và theo từng giới tính. Hướng dẫn
Row Heading:
NoiSinh(quê quán)Column Heading:
PHAI(giới tính)Value: Đếm số lượng nhân viên (
Count)
15.4. Thống kê tổng số giờ tăng ca theo từng nhân viên và theo từng tháng. Hướng dẫn
Row Heading:
MaNV(mã nhân viên)Column Heading: Tháng (trích từ trường
Ngay)Value: Tổng số giờ tăng ca (
SumcủaSoGioTangCa)
15.5. Thống kê tổng số ngày nghỉ không phép theo từng nhân viên và theo từng tháng. Hướng dẫn
Row Heading:
MaNV(mã nhân viên)Column Heading: Tháng (trích từ trường
Ngay)Value: Tổng số ngày nghỉ không phép (
SumcủaNghiKhongPhep)
15.6. Thống kê tổng số ngày nghỉ có phép theo từng nhân viên và theo từng quý. Hướng dẫn
Row Heading:
MaNV(mã nhân viên)Column Heading: Quý (sử dụng
DatePart("q", [Ngay]))Value: Tổng số ngày nghỉ có phép (
SumcủaNghiCoPhep)
15.7. Thống kê lương trung bình của nhân viên theo từng phòng ban và theo từng cấp bậc (CapBac). Hướng dẫn
Row Heading:
TenPB(tên phòng ban)Column Heading:
CapBac(cấp bậc)Value: Lương trung bình (
AvgcủaLuongCoBan)
15.8. Thống kê số lượng nhân viên theo từng chức vụ và theo từng năm sinh (theo thập niên). Hướng dẫn
Row Heading:
ChucVu(chức vụ)Column Heading: Thập niên (ví dụ: 1970, 1980, 1990 – trích từ
Year([NgaySinh]))Value: Đếm số lượng nhân viên (
Count)
15.9. Thống kê tổng số ngày nghỉ phép năm theo từng nhân viên và theo từng năm. Hướng dẫn
Row Heading:
MaNV(mã nhân viên)Column Heading: Năm (trích từ trường
Ngay)Value: Tổng số ngày nghỉ phép năm (
SumcủaPhepNam)
15.10. Thống kê tổng số ngày nghỉ bệnh (cả 75% và 100%) theo từng nhân viên và theo từng quý. Hướng dẫn
Row Heading:
MaNV(mã nhân viên)Column Heading: Quý (sử dụng
DatePart("q", [Ngay]))Value: Tổng số ngày nghỉ bệnh (
Sumcủa[NghiBenh75] + [NghiBenh100])