Bài 2 : THIẾT KẾ TRUY VẤN – QUERY

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ánKý hiệuÝ nghĩaVí 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ýANDORNOTVà, Hoặc, Phủ định.>=0 AND <=10
KhoảngBETWEEN ... 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áchIN (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ẫuLIKESo 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ệuCách viếtVí 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/NoTrue/FalseOn/Off, hoặc -1/0.YesTrue

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ặc In("Trần","Lý")

  • Tìm người có trình độ từ cấp 2 trở lên: >=2

  • Tì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àm Len)

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:

text
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

  1. 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.

  2. Liệt kê danh sách chỉ gồm: MaNVHoVaTenPHAINgaySinh.

  3. Liệt kê danh sách các phòng ban từ bảng tbl_Danh_Sach_Phong_Ban gồm: MaPBTenPB.

  4. 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).

Hướng dẫn thực hành Bài 1: Truy vấn đơn giản trên 1 bảng

Chuẩn bị

Mở CSDL

  1. Mở file qlyNhanSu.accdb (hoặc CSDL của bạn)

  2. Kiểm tra các bảng cần dùng:

    • tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien (chứa thông tin nhân viên)

Hướng dẫn chi tiết: Câu 1; Câu 2; Câu 3; Câu 4

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

STTBài tậpHiện tượngNguyên nhânCách xử lýVí dụ minh họa
B12.1.1 – Lấy tất cả thông tinQuery chạy nhưng thiếu cộtDùng dấu * nhưng bảng có cột mới thêm sauChạy lại query hoặc chọn lại *SELECT * FROM ...
B22.1.1 – Lấy tất cả thông tinQuery quá chậmBả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 
B32.1.2 – Lấy một số trườngTrường bị lặp lạiNhấp đúp cùng trường nhiều lầnXóa cột bị lặp (chọn cột → Delete) 
B42.1.2 – Lấy một số trườngThứ tự cột không mong muốnThêm trường không theo thứ tựKéo thả cột để sắp xếp lại thứ tự 
B52.1.3 – Lấy từ bảng khácKhông tìm thấy bảng tbl_Danh_Sach_Phong_BanTên bảng trong CSDL thực tế khác với đề bàiKiểm tra lại tên bảng thực tế trong Navigation Pane 
B62.1.4 – Bảng có tên khoảng trắngLỗi khi thêm bảngKhông tìm thấy bảng do tên có khoảng trắngTì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)

  1. Danh sách nhân viên (MaNVHoVaTenNgaySinh) sắp xếp theo HoVaTen tăng dần (A→Z).

  2. Danh sách nhân viên sắp xếp theo NgaySinh giảm dần (người lớn tuổi nhất lên đầu).

  3. Danh sách chấm công (MaNVNgayNghiCoPhep) sắp xếp theo Ngay giảm dần và theo MaNV tăng dần.

Hướng dẫn thực hành Bài 2.2 : Truy vấn có sắp xếp (Sort)

Chuẩn bị

Mở CSDL

  1. Mở file qlyNhanSu.accdb (hoặc CSDL của bạn)

  2. Kiểm tra các bảng cần dùng:

    • tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien (chứa thông tin nhân viên)

    • tbl Cham Cong Hang Ngay (chứa thông tin chấm công)

    •  

Hướng dẫn chi tiết: Câu 1; Câu 2; Câu 3.

BẢNG MÔ TẢ LỖI THƯỜNG GẶP

BÀI 2.2: TRUY VẤN CÓ SẮP XẾP (SORT)

STTBài tậpHiện tượngNguyên nhânCách xử lýVí dụ minh họa
B72.2.1 – Sort tăng dầnDữ liệu không sắp xếp như mong đợiQuên chọn Sort hoặc chọn sai cộtKiểm tra lại ô Sort của đúng cộtHoVaTen: Sort = Ascending
B82.2.1 – Sort tăng dầnTên có dấu bị sắp xếp saiAccess 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 
B92.2.2 – Sort giảm dần theo ngàyNgười già nhất không lên đầuChọn Ascending thay vì DescendingĐổi lại Sort = DescendingNgaySinh cũ nhất (nhỏ nhất) → Descending
B102.2.2 – Sort theo ngàyKết quả lộn xộnTrường NgaySinh có giá trị NULLKiểm tra dữ liệu, xử lý NULL hoặc thêm điều kiện IS NOT NULL 
B112.2.3 – Sort nhiều cộtChỉ sort được 1 cộtQuên thiết lập Sort cho cột thứ 2Thiết lập Sort cho cả 2 cộtNgay: Descending, MaNV: Ascending
B122.2.3 – Sort nhiều cộtThứ tự ưu tiên saiĐặt sai thứ tự cột trong lưới QBESắ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ố

  1. Danh sách nhân viên có lương cơ bản (LuongCoBan trong bảng tbl Danh Sach Nhan Vien) lớn hơn 5,000,000. Gồm: MaNVLuongCoBanChucVu. Hướng dẫn

  2. Danh sách nhân viên có lương từ 3,000,000 đến 6,000,000. Hướng dẫn

  3. 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ẫn

  4. Danh sách những ngày công có số giờ tăng ca (SoGioTangCa trong bảng tbl 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ĩaVí 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...AndTrong khoảng (bao gồm cả 2 đầu)Between 3000000 And 6000000
AndVà (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)

STTBài tậpHiện tượngNguyên nhânCách xử lýVí dụ minh họa
B132.3.1 – Điều kiện sốKhông lọc đượcDù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ẩy5000000 (đúng) – 5,000,000 (sai)
B142.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 
B152.3.2 – Điều kiện ngàyKhông lọc được theo thángQuên hàm Month()Dùng Month([NgaySinh]) = 5 
B162.3.2 – Điều kiện ngàyLỗi khi nhập ngàyKhông đặt ngày trong dấu #Đặt ngày trong ##01/01/1980#
B172.3.3 – Điều kiện chuỗiLọc không chính xácDùng = thay vì LIKEDùng LIKE với ký tự đại diệnLIKE "Nguyễn*"
B182.3.3 – Điều kiện chuỗiLIKE không hoạt độngQuên dấu ngoặc képĐặt chuỗi trong dấu ” “LIKE "Hà Nội"
B192.3.4 – Kết hợp AND/ORKết quả saiĐặt AND/OR sai chỗAND cùng dòng, OR khác dòngCriteria: >0 AND <10
B202.3.4 – Kết hợp AND/ORKhông lọc được ORGhi OR trên cùng dòngGhi đ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

  1. Danh sách nhân viên sinh sau ngày 01/01/1980. Gồm: HoVaTenNgaySinhNoiSinh. Hướng dẫn

  2. Danh 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ẫn

  3. Danh sách chấm công trong tháng 3 năm 2026 (bảng tbl Cham Cong Hang Ngay). Hướng dẫn

  4. Danh 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ĩaVí 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ĩaVí 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...AndTrong khoảng ngàyBetween #01/01/2026# And #31/03/2026#

Lưu ý quan trọng

  1. Ngày tháng phải trong dấu ##01/01/1980# (đúng) – 01/01/1980 (sai)

  2. Đị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ý

  3. Kết hợp nhiều điều kiện: Dùng And để kết hợp

  4. Sử 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)

STTBài tậpHiện tượngNguyên nhânCách xử lýVí dụ minh họa
B212.4.1 – Tính thâm niênLỗi “Undefined function”Sai tên hàm DateDiffKiểm tra lại cú pháp hàmDateDiff("yyyy",[NgayVaoLam],Date())
B222.4.1 – Tính thâm niênKế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
B232.4.2 – Tính tuổiKết quả lẻDùng sai hàmDùng DateDiff("yyyy",[NgaySinh],Date()) 
B242.4.3 – Tính phụ cấpLỗi #Name?Tên trường saiKiểm tra lại tên trường trong ngoặc vuông[LuongCoBan] (đúng)
B252.4.3 – Tính phụ cấpKết quả 0Lỗi kiểu dữ liệu (số lưu dạng text)Chuyển đổi kiểu dữ liệu trong bảng 
B262.4.4 – Tính tổng côngKết quả NULL nếu có trường NULLNULL + số = NULLDù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)

  1. Danh sách nhân viên nữ (PHAI = Yes). Hiển thị MaNVHoVaTenPHAI.

  2. Danh sách nhân viên có nơi sinh (NoiSinh) ở “Hà Nội”.

  3. Danh sách nhân viên có họ (ký tự đầu tiên của HoVaTen) là “Nguyễn”. (Gợi ý: dùng LIKE "Nguyễn*").

  4. 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)

  1. Danh sách nhân viên Nữ và có lương cơ bản trên 4,000,000.

  2. Danh sách nhân viên Nam hoặc có nơi sinh ở “TP HCM”.

  3. Danh sách nhân viên sinh từ năm 1980 đến 1990 và có quê ở “Hà Nội”.

  4. Danh sách những ngày công có NghiKhongPhep > 0 hoặc NghiCoPhep > 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)

  1. 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ảng tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien) so với ngày hiện tại (Date()). Gồm: MaNVHoVaTenNgayVaoLamThamNien: DateDiff("yyyy",[NgayVaoLam],Date()).

  2. 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).

  3. Tạo Query tính Tuổi của nhân viên dựa trên NgaySinh.

  4. Tạo Query tính Tổng công = NghiKhongPhep + NghiCoPhep + PhepNam + NghiBenh75 + NghiBenh100 từ bảng tbl Cham Cong Hang Ngay. Gồm: MaNVNgayTongCong.

Bài 2.8: Truy vấn liên kết nhiều bảng (Join)

  1. 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_Vien với tbl_Danh_Sach_Phong_Ban qua MaPB). Gồm: MaNVHoVaTenTenPB.

  2. 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 Ngay với tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien qua MaNV). Gồm: NgayHoVaTenNghiKhongPhepNghiCoPhep.

  3. 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 Catbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vientbl_Danh_Sach_Phong_Ban). Gồm: NgayHoVaTenTenPBSoGioTangCaGhiChu.

  4. 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 Vien với tbl_Thong_Tin_Ca_Nhan_Cua_Nhan_Vien qua MaNV). Gồm: MaNVHoVaTenChucVuLuongCoBan.

Bài 2.9: Sử dụng tham số (Parameters) trong Query

  1. Tạo Query cho phép nhập MaNV từ bàn phím và hiển thị toàn bộ thông tin cá nhân của nhân viên đó.

  2. 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 đó.

  3. 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 đó.

  4. 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: MaNVCapBacChucVuLuongCoBan).

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: MaNVNgayNghiKhongPhep).

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: MaNVHoVaTenNgaySinhNoiSinh).

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 ByNhóm các bản ghi có cùng giá trị lại với nhau.
SumTính tổng các giá trị của trường trong nhóm.
AvgTính giá trị trung bình của trường trong nhóm.
CountĐếm số lượng bản ghi trong nhóm.
MaxTìm giá trị lớn nhất của trường trong nhóm.
MinTìm giá trị nhỏ nhất của trường trong nhóm.
ExpressionCho biết trường này là một biểu thức tính toán tùy chỉnh.
WhereDù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:

  1. Thiết kế Select Query bình thường, đưa các trường cần thiết vào lưới QBE.

  2. 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.

  3. 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).

  4. 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.

  5. Chạy và lưu Query.

CÁC LỖI THƯỜNG GẶP

Hiện tượngNguyên nhânCách xử lý
Thiếu dòng TotalQuên nhấn nút Totals (Σ)Nhấn Totals trên tab Design
Kết quả saiChọ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 MemoChuyển sang Text hoặc không Group By
Kết quả NULLCó giá trị NULL trong dữ liệuDùng hàm Nz() hoặc xử lý dữ liệu
Thiếu dữ liệuQuên điều kiện lọcThê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ị: MaPBTongSoNV. Hướng dẫn

14.2. Tính tổng số nhân viên theo từng chức vụ. Hiển thị: ChucVuTongSoNV.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ị: MaPBLuongTrungBinh. 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ị: ChucVuLuongTrungBinh. 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ị: MaNVTongGioTangCa. 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ị: MaNVTongNghiKhongPhep. 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ị: MaNVTongNghiCoPhep. 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ị: MaNVTongPhepNam. 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ị: MaNVTongNghiBenh. 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ị: NoiSinhSoLuong. 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àngcộ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: NhanVien

  • Column Heading: Thang

  • Value: 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:

  1. 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ị).

  2. 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.

  3. 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.

  4. 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ụ: SumCountAvg).

  5. (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").

  6. Chạy và lưu Query.

TÓM TẮT CÁC BƯỚC THỰC HIỆN CHUNG

BướcThao tácHình ảnh minh họaGiải thích
1Trên thanh Ribbon, chọn tab Create[Create]Tạo đối tượng mới
2Trong nhóm Queries, nhấn Query Design[Query Design]Tạo truy vấn mới
3Thêm các bảng cần dùng vào truy vấn Chọn bảng → Add → Close
4Trên tab Design, nhóm Query Type, chọn Crosstab[Crosstab]Chuyển sang chế độ Crosstab
5Lướ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
7Thiế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  
8Thiế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, …)  
9Nhấn Run để xem kết quả[! Run] 
10Lư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 (Sum của LuongCoBan)

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 (Sum của SoGioTangCa)

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 (Sum của NghiKhongPhep)

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 (Sum của NghiCoPhep)

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 (Avg của LuongCoBan)

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 (Sum của PhepNam)

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 (Sum của [NghiBenh75] + [NghiBenh100])