1. HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
TRƯỜNG ĐH CÔNG NGHỆ GIAO THÔNG VẬN TẢI
Giảng viên: Nguyễn Thị Kim Huệ
1
2. PHẦN 3:
NGÔN NGỮ THAO TÁC DỮ LIỆU
(Data Manaipulation language- DML)
2
3. 1. GIỚI THIỆU
Ngôn ngữ thao tác dữ liệu gồm các lệnh sau:
▪ SELECT: Sử dụng để truy xuất dữ liệu từ một hoặc nhiều
bảng
▪ INSERT: Bổ sung dữ liệu
▪ UPDATE: Cập nhật dữ liệu
▪ DELETE: Xóa dữ liệu
3
4. INSERT - Chèn dữ liệu
➢ Cú pháp:
INSERT [INTO] <tên bảng> [(ds cột)]
VALUES (giá trị cần chèn của hàng 1)
[, (giá trị cần chèn của hàng 2)
,…]
(Thành phần trong [] có thể có hoặc không)
Chú ý:
• Nếu dữ liệu kiểu text và kiểu Date, khi chèn phải có ‘ ‘, nếu là kiểu
nvachar thì phải có tiếp đầu ngữ N’ ’.
• Dữ liệu kiểu Date yêu cầu nhập tháng/ngày/năm hoặc năm/tháng/ngày
• Dữ liệu dạng tự tăng thì không cần nhập.
• Với dữ liệu mặc định, nếu không thay đổi giá trị mặc định khi chèn dữ
liệu cần liệt kê danh sách các cột mà không có cột có ràng buộc mặc
định (default)
6. Lưu ý khi nhập dữ liệu
➢ Chú ý thứ tự nhập dữ liệu vào các bảng.
➢ Trong 1 bảng:
• Khóa chính:
o Không được trùng
o Tên bất kỳ theo đúng kiểu dữ liệu
• Khóa ngoại:
o Không được đặt bất kỳ
o Phải có rồi.
7. UPDATE - Cập nhật dữ liệu
3. Cập nhật dữ liệu:
UPDATE <Tên bảng>
SET <tên cột>= <giá trị mới>
[ WHERE <Điều kiện>]
Ví dụ:
8. DELETE - Xóa dữ liệu
▪ Xóa các dòng thỏa mãn điều kiện:
DELETE FROM table_name
WHERE <tên cột>=<giá trị>;
Ví dụ:
▪ Xóa tất cả các dòng nhưng vẫn giữ nguyên cấu trúc bảng:
DELETE FROM table_name;
Ví dụ:
9. Truy xuất dữ liệu với câu lệnh SELECT
SELECT [DISTINCT |Top n |* ] <biểu thức/ cột [AS <tên mới>],..>
[INTO <tên bảng mới>]
FROM <tên bảng> [<bí danh>],...
[WHERE <điều kiện chọn>]
[GROUP BY < ds tên cột gom nhóm>]
[HAVING <điều kiện lọc nhóm>]
[ORDER BY <tên cột>[ASC|DESC],…];
10. Truy xuất dữ liệu với câu lệnh SELECT
▪ Truy vấn có ba loại:
• Truy vấn trên một bảng
• Truy vấn trên nhiều bảng
• Truy vấn lồng
11. TRUY VẤN TRÊN MỘT BẢNG
▪ A. Truy vấn đơn giản
▪ <danh sách các cột>
• Tên các thuộc tính (cột) sẽ được hiển thị trong kết quả truy vấn.
▪ <danh sách các bảng>
• Tên các bảng liên quan để lấy kết quả
▪ <biểu thức điều kiện>
• là điều kiện đưa vào để chọn lọc dữ liệu, thường gồm:
• Các phép toán so sánh: < , > , <= , >= , = , < >
• Các phép toán logic: AND, OR, và NOT
• Các từ khóa: BETWEEN … AND, IN, EXISTS, LIKE…
SELECT <danh sách các cột>
FROM <danh sách các bảng>
[WHERE <biểu thức điều kiện>]
12. TRUY VẤN TRÊN MỘT BẢNG
▪ Ví dụ 1: Cho danh sách sinh viên gồm Mã SV, Họ tên, Ngày sinh của tất cả các
sinh viên
Select MaSV, TenSV, Ngaysinh
from Sinhvien
▪ Ví dụ 2: Cho danh sách sinh viên nữ thuộc lớp L02
Select *
From Sinhvien
Where (GT=N'Nữ') and (Lop='L02‘)
▪ Ví dụ 3: Thêm ĐỊNH DANH CHO BẢNG VÀ CHO CỘT (sử dụng từ khóa AS)
select sv.MaSV, TenSV as 'Tên Sinh Viên'
from Sinhvien as sv
/* sau khi định danh cho bảng thì từ đó sử dụng tên định danh*/
13. TRUY VẤN TRÊN MỘT BẢNG
▪ Xử lý dữ liệu kiểu chuỗi dùng Like hoặc not like để tìm chuỗi gần đúng
%: Thay thế 1 chuỗi
-: thay thế 1 ký tự
▪ VD 4.1: Cho danh sách các sinh viên có tên là ‘Nga’
select *
from sinhvien
where TenSV like N'% Nga'
▪ VD 4.2: Cho danh sách những sinh viên họ Trần
select *
from sinhvien
where TenSV like N'Trần %'
14. TRUY VẤN TRÊN MỘT BẢNG
▪ Sử dụng BETWEEN <GT1> AND <GT2> để lấy những bản ghi thỏa
mãn nằm giữa GT1 và GT2.
VD: Cho danh sách gồm mã sinh viên, ma môn học của sinh viên có điểm từ 5
đến 7
select MaSv, MaMH
from ketqua
where diem between 5 and 7
▪ Note: Not Between .. and … có ý nghĩa ngược lại.
15. TRUY VẤN TRÊN MỘT BẢNG
Sử dụng NULL/NOT NULL cho các trường hợp sau:
- Không biết - không xác định (value unknown)
- Không thể áp dụng (value inapplicable)
- Không tồn tại (value withheld)
VD: Cho danh sách gồm Mã Sinh viên và mã môn học của sinh viên không
có điểm thi
select MaSV, MaMH
from ketqua
where Diem is Null
16. TRUY VẤN TRÊN MỘT BẢNG
Sử dụng IN (NOT IN):
• VD: Cho danh sách các sinh viên có quê ở Hà Nội hoặc Phú Thọ
Select *
From Sinhvien
where que in (N'Hà nội', N'Phú Thọ’)
Sử dụng các toán tử DISTINCT, TOP N, With ties
- Distinct : loại bỏ các dòng dữ liệu trùng
- Top n : lấy n dòng đầu tiên
- Top n with ties: lấy tất cả dòng có giá trị bằng giá trị top n
(Thường kết hợp với order by)
VD: Liệt kê danh sách các tỉnh có sinh viên theo học tại trường
select distinct Que
from Sinhvien
17. TRUY VẤN TRÊN MỘT BẢNG
▪ VD 8.2: Cho thông tin của hai sinh viên đầu tiên trong danh sách
sinh viên
select top (2) MaSV, TenSV,Que
from Sinhvien
18. TRUY VẤN TRÊN MỘT BẢNG
▪ VD mở rộng
SELECT MANV, HONV + ‘ ’ + DEMNV + ‘ ’ + TENNV AS ‘HO TEN’
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’ HO TEN
Nguyen Thanh Tung
Nguyen Manh Hung
333445555
987987987
MANV
SELECT MANV, LUONG*1.1 AS ‘LUONG10%’
FROM NHANVIEN
WHERE PHG=5 AND PHAI=‘Nam’
LUONG10%
33000
27500
333445555
987987987
MANV
19. TRUY VẤN TRÊN MỘT BẢNG
B. HÀM KẾT HỢP
▪ Được sử dụng để tính giá trị thống kê trên toàn bảng hoặc trên mỗi
nhóm dữ liệu
▪ Các hàm cơ bản:
Sum( [All | Distinct] biểu-thức), Avg( [All | Distinct] biểu-thức)
Cout( [All | Distinct] biểu-thức) : đếm số dòng khác Null trong cột,
biểu thức.
Count(*) : đếm số dòng được chọn trong bảng, kể cả Null
Max( biểu-thức ), Min( biểu-thức )
▪ Các hàm thực hiện tính toán trên toàn bộ dữ liệu, bỏ bớt giá trị trùng
nhau thêm từ distinct
20. TRUY VẤN TRÊN MỘT BẢNG
B. HÀM KẾT HỢP
▪ VD: Tìm tổng lương, lương cao nhất, lương thấp nhất và lương
trung bình của các nhân viên
NHANVIEN(MaNV, TenNV, GT, NS, DChi, Luong, MaPB)
▪ Kết quả:
SELECT sum(Luong) AS ‘Tổng lương’ ,
max(Luong) AS ‘Lương cao nhất’ ,
min(Luong) AS ‘Lương thấp nhất’ ,
avg(Luong) AS ‘Lương trung bình’
FROM NhanVien
Tổng lương Lương cao nhất Lương thấp nhất Lương trung bình
12.000.000 3.000.000
2.500.000
4.000.000
21. TRUY VẤN TRÊN MỘT BẢNG
B. HÀM KẾT HỢP
▪ VD: Cho biết số lượng nhân viên của phòng 5
NHANVIEN(MaNV, TenNV, GT, NS, DChi, Luong, MaPB)
SELECT count(MNV) AS [Số nhân viên]
FROM NhanVien
WHERE MaPB = 5
22. TRUY VẤN TRÊN MỘT BẢNG
C. MỆNH ĐỀ GROUP BY
▪ Để thực hiện gom nhóm các bộ theo một tiêu chí xác định để thực
hiện tính toán
▪ Cú pháp
- Sau khi gom nhóm: Mỗi nhóm, các bộ sẽ có cùng giá trị tại các
thuộc tính gom nhóm
- Danh sách cột gom nhóm ở trong câu lệnh SELECT phải xuất hiện
đầy đủ ở mệnh đề GROUP BY
SELECT <DS cột gom nhóm>, <Hàm tính toán>
FROM <danh sách các bảng>
[WHERE <biểu thức điều kiện>]
GROUP BY <DS cột gom nhóm>
HAVING <điều kiện tính toán nhóm>
23. TRUY VẤN TRÊN MỘT BẢNG
VD1: Đưa ra tên sinh viên theo từng lớp
select tensv, lop
from sv
group by lop, tensv
▪ VD2: Đếm số sinh viên ở mỗi lớp
select lop, count (tensv) as ' Số SV'
from sv
group by lop
VD3: cho biết lớp có số sinh viên lớn hơn bằng 3
select lop, count (tensv) as ' Số SV’
from sv
where
group by lop
Having count (tensv)>=3
24. TRUY VẤN TRÊN MỘT BẢNG
NHẬN XÉT:
▪ Mệnh đề GROUP BY
• Các thuộc tính không nằm trong hàm nhóm của mệnh đề
SELECT phải được xuất hiện trong mệnh đề GROUP BY
▪ Mệnh đề HAVING
• Sử dụng các hàm kết hợp trong mệnh đề SELECT để kiểm
tra một số điều kiện nào đó
• Chỉ kiểm tra điều kiện trên nhóm, mệnh đề Having không
lọc trên từng bản ghi.
• Điều kiện trên nhóm (ở mệnh đề HAVING) được thực hiện
sau khi gom nhóm.
25. TRUY VẤN TRÊN MỘT BẢNG
NHẬN XÉT:
▪ Thứ tự thực hiện câu truy vấn có mệnh đề GROUP BY và
HAVING
• (1) Chọn ra những dòng thỏa điều kiện trong mệnh đề WHERE
• (2) Những dòng này sẽ được gom thành nhiều nhóm tương ứng
với mệnh đề GROUP BY
• (3) Áp dụng các hàm kết hợp cho mỗi nhóm
• (4) Bỏ qua những nhóm không thỏa điều kiện trong mệnh đề
HAVING
• (5) Rút trích các giá trị của các cột và hàm kết hợp trong mệnh
đề SELECT
26. Bài tập
1. ĐƯa ra tên mặt hàng của loại hàng 1 hoặc 2
2. Đếm số lượng của mỗi loại hàng
3. Đưa ra loại hàng có giá hàng < 2 triệu và có số
mã hàng >3
4. Cho biết tổng số lượng hàng đã bán theo từng mã
hàng.
27. TRUY VẤN TRÊN MỘT BẢNG
C. MỆNH ĐỀ ORDER BY
▪ Hiển thị kết quả câu truy vấn theo một thứ tự nào đó trên các cột
▪ Cú pháp
ASC (ASCending): tăng (mặc định)
DESC (DESCending): giảm
SELECT <danh sách các thuộc tính>
FROM <danh sáchcác bảng>
WHERE <biểu thức điều kiện>
ORDER BY <thuộc tính sắp xếp> [ASC | DESC]
28. TRUY VẤN TRÊN MỘT BẢNG
C. MỆNH ĐỀ ORDER BY
VD: Sắp xếp sv theo thứ tự giảm dần của lop, và tăng dần theo masv
select * from sv
order by lop desc, MaSV
29. TRUY VẤN TRÊN NHIỀU BẢNG
▪ Khi cần thực hiện một yêu cầu truy vấn dữ liệu từ hai hay nhiều bảng.
▪ VD xét:
▪ → Đưa ra tên các mặt hàng của đơn hàng có sohoadon=2 trong bảng
ChiTietDatHang
ChiTietDatHang MatHang
30. TRUY VẤN TRÊN NHIỀU BẢNG
▪ Có hai cách kết nối bảng:
• Sử dụng mệnh đề where
• Sử dụng Join/inner Join/Left Join/Right Join/Full Join
▪ Trong đó: Join, inner Join và where là tương đương nhau
▪ Sử dụng Where:
SELECT <ds cột>
FROM <Danh sách Tên các bảng>
WHERE <điều kiện nối hai bảng>
▪ Sử dụng inner join
SELECT <danh sách cột>
FROM table1 INNER JOIN table 2
ON <điều kiện nối hai bảng>
31. TRUY VẤN TRÊN NHIỀU BẢNG
→ Đưa ra Sohoadon, mahang và tenhang trong bảng ChiTietHoaDon
C1:
Select sohoadon,mh.mahang,tenhang
from chitietdathang ct,mathang mh
where ct.mahang=mh.mahang and sohoadon=2
C2:
select sohoadon,mh.mahang,tenhang
from chitietdathang ct inner join mathang mh
on ct.mahang= mh.mahang
where sohoadon = 2
ChiTietDatHang MatHang
32. INNER, LEFT, RIGHT, FULL JOIN
▪ INNER JOIN/JOIN: trả về các dòng của hai bảng thỏa mãn điều kiện
nối
▪ LEFT JOIN: Trả về tất cả các hàng từ bảng bên trái, ngay cả khi
không có so khớp trong bảng bên phải. Nếu dữ liệu có ở bảng trái
không có ở phải vẫn hiển thị
▪ RIGHT JOIN: Trả về tất cả các hàng từ bảng bên phải, ngay cả khi
không có so khớp nào trong bảng bên trái. Nếu dữ liệu có ở bảng phải
không có ở trái vẫn hiển thị
▪ FULL JOIN: Bảng được kết hợp sẽ chứa tất cả bản ghi từ cả hai bảng,
và điền vào đó giá trị NULL cho các giá trị không so khớp nhau.
33. LEFT JOIN
KhachHang
MaKH TenKH
01 Trần Nhật Lệ
02 Lê Thị Nhàn
03 Hoàng Lê Minh
04 Bùi Ngọc Quang
HoaDon
MaKH MaSP TenSP
01 A100 Quạt máy
01 A102 Tủ lạnh
03 A120 Máy giặt
05 A230 Ti vi
TenKH TenSP
Trần Nhật Lệ Quạt máy
Trần Nhật Lệ Tủ lạnh
Lê Thị Nhàn NULL
Hoàng Lê Minh Máy giặt
Bùi Ngọc Quang NULL
SELECT TenKH, TenSP
FROM Khachhang LEFT JOIN hoadon
ON Khachhang.MaKH = Hoadon.MaKH
34. RIGHT JOIN
KhachHang
MaKH TenKH
01 Trần Nhật Lệ
02 Lê Thị Nhàn
03 Hoàng Lê Minh
04 Bùi Ngọc Quang
HoaDon
MaKH MaSP TenSP
01 A100 Quạt máy
01 A102 Tủ lạnh
03 A120 Máy giặt
05 A230 Ti vi
SELECT TenKH, TenSP
FROM Khachhang RIGHT JOIN hoadon
ON Khachhang.MaKH = Hoadon.MaKH
TenKH TenSP
Trần Nhật Lệ Quạt máy
Trần Nhật Lệ Tủ lạnh
Hoàng Lê Minh Máy giặt
NULL Tivi
35. FULL JOIN
KhachHang
MaKH TenKH
01 Trần Nhật Lệ
02 Lê Thị Nhàn
03 Hoàng Lê Minh
04 Bùi Ngọc Quang
HoaDon
MaKH MaSP TenSP
01 A100 Quạt máy
01 A102 Tủ lạnh
03 A120 Máy giặt
05 A230 Ti vi
SELECT TenKH,
TenSP
FROM Khachhang
FULL JOIN hoadon
ON Khachhang.MaKH
= Hoadon.MaKH
TenKH TenSP
Trần Nhật Lệ Quạt máy
Trần Nhật Lệ Tủ lạnh
Lê Thị Nhàn NULL
Hoàng Lê Minh Máy giặt
Bùi Ngọc Quang NULL
NULL Tivi
36. THỨ TỰ XỬ LÝ CỦA LỆNH SELECT
SELECT lop, count (tensv)
FROM sv
[WHERE…]
GROUP BY lop
HAVING count (tensv)>=3
37. Bài tập
1. Cho danh sách họ tên của nhân viên sinh vào tháng 3 hoặc tháng 10
2. Cho danh sách khách hàng có địa chỉ không thuộc quận Đống Đa
hoặc quận Hoàng Mai
3. Tính tổng số tiền của từng hóa đơn xuất
5. Tổng tiền mỗi khách hàng đã mua hàng (Đưa tên khách hàng)
6. Liệt kê danh sách các khách hàng đã mua trên 10 triệu
7. Trong năm 2014, tên mặt hàng nào chỉ được̉ mua đc đúng 1 lần
8. Cho danh sách các tên mặt hàng đã được mua trong năm 2014 và
tổng tiền trên 10 triệu
9. Đưa ra những nhân viên có cùng ngày tháng năm sinh
10. Đưa ra những khách hàng mua hàng với tổng tiền cao nhất.
38. TRUY VẤN CON
▪ Là thực hiện lồng ghép nhiều câu lệnh SELECT với
nhau
▪ VD: Đưa ra những nhân viên có lương cao hơn lương
của nhân viên A
Truy vấn chính
Những nhân viên nào có lương lớn hơn
lương của nhân viên A
Mức lương của nhân viên A là bao nhiêu
Truy vấn con
39. TRUY VẤN CON
SELECT <Ds các cột>
FROM <Ds các bảng>
WHERE <biểu thức> Toán tử (
SELECT <Ds các cột>
FROM <Ds các bảng>
WHERE <điều kiện>)
- Truy vấn con thi hành môt lần trước
truy vấn chính (truy vấn cha).
- Kết quả trả về từ truy vấn con được sử
dụng trong câu truy vấn chính.
- Truy vấn con phải đặt trong đóng cặp
đóng mở ngoặc đơn
- Sử dụng các toán tử một dòng với các
truy vấn con trả về một dòng và sử
dụng các toán tử nhiều dòng với các
truy vấn con trả về nhiều dòng.
Cú pháp Lưu ý:
40. TRUY VẤN CON
➢ Toán tử so sánh 1 dòng:
o = Bằng
o > Lớn hơn
o >= Lớn hơn hoặc bằng
o < Nhỏ hơn
o <= Nhỏ hơn học bằng
o <> Không bằng
➢ Toán tử so sánh nhiều dòng:
o IN, NOT IN : Bằng, không bằng một trong các giá trị
o ANY: Chỉ cần thỏa một trong các giá trị trả về bởi truy
vấn con
o ALL: Phải thỏa tất cả các giá trị trả về bởi truy vấn con
- EXISTS, NOT EXISTS: Kiểm tra sự tồn tại
41. TRUY VẤN CON
➢ VD1: Đưa ra những nhân viên có lương cao hơn lương của
nhân viên A (manhanvien = nv1)
? Truy vấn con trả về 1 hay nhiều dòng
42. TRUY VẤN CON
➢ VD2: Đưa ra mức lương thấp nhất của các phòng với đk: mức
lương thấp nhất của phòng đó phải lớn hơn mức lương thấp nhất
của phòng có mã ‘P1’
➢ (Có bảng nhanvien, các trường: mucluong, maphong
Select maphong,min(mucluong)
From nhanvien
Group by maphong
Having min(mucluong)> (select min(mucluong)
from nhanvien
where maphong = ‘P1’)
43. TRUY VẤN CON
➢ VD3: Câu lệnh sau sai ở đâu:
Select manv, tennv
From nhanvien
Where mucluong = (select min(mucluong)
from nhanvien
Group by maphong)
44. TRUY VẤN CON
➢ VD4: Tìm tên những mặt hàng có số lượng nhỏ hơn mọi số
lượng của mặt hàng có maloaihang= 3
select tenhang,soluong,maloaihang
from mathang
where soluong< (select soluong
from mathang
where maloaihang=3)
All
45. TRUY VẤN CON
➢ VD4: Tìm tên những mặt hàng có số lượng nhỏ hơn mọi số
lượng của mặt hàng có maloaihang= 3
➢ Cách 1:
➢ Cách 2
select tenhang,soluong,maloaihang
from mathang
where soluong< (select min(soluong)
from mathang
where maloaihang=3)
46. Bài tập có truy vấn con
1. Những mặt hàng chưa từng đc khách hàng đặt
2. Những nhan viên có lương cơ bản cao nhất
3. ĐƯa ra nhân viên có tuổi cao nhất.
4. Đưa ra mặt hàng có số lượng lớn hơn số lượng trung bình trong loại
hàng của mặt hàng đó
5. Đưa ra những công ty có cung cấp loại hàng 2 và có số lượng mã hàng
>2
47. CÁC PHÉP TOÁN TẬP HỢP
➢ Gồm:
• UNION: Hợp
• INTERSECT: Giao
• EXCEPT: Trừ
➢ Chú ý: Các trường trong select phải giống nhau mới thực
hiện được
48. CÁC PHÉP TOÁN TẬP HỢP
select MaSV
from sv
except
select masv
from KetQua
where Diem is not null
VD 1: Cho danh sách mã sinh viên của
những sinh viên không có bất kỳ một điểm
thi của một môn học nào.
Bảng
Sinhvien
Bảng
Ketqua
select masv, TenSV
from sv
where masv not in(select masv
from KetQua
where diem is not null)
Cách 1
Cách 2
49. CÁC PHÉP TOÁN TẬP HỢP
VD 1: Đưa ra những sinh viên có đủ điểm
thi 2 môn có maMH =5 và 6
Bảng
Ketqua
50. CÁC PHÉP TOÁN TẬP HỢP
VD 1: Đưa ra những sinh viên có đủ điểm thi 2 môn có
maMH =5 và 6
Đưa ra cả Tên sinh viên
51. NỘI DUNG ÔN TẬP
I. Ngôn ngữ định nghĩa dữ liệu
- Tạo bảng (Creat table…)
- Sửa đổi cấu trúc bảng (Alter table..)
II. Ngôn ngữ thao tác dữ liệu
- Thêm dữ liệu (insert into .. Values…)
- Sửa dữ liệu (update…set…where…)
- Truy xuất:
- Select
- From
- Where
- Group by
- Having
- Order by
- Truy vấn con
52. BÀI TẬP
▪ Dựa vào CSDL trang ..,viết câu lệnh truy vấn đầy đủ thực hiện các yêu cầu sau:
1. Cho danh sách họ tên của nhân viên sinh vào tháng 3 hoặc tháng 10
2. Đưa ra nhân viên có tuổi cao nhất hiện nay
3. Cho danh sách các tên hàng chưa được bán lần nào
4. Liệt kê danh sách các khách hàng đã mua trên 10 triệu
5. Cho danh sách các mặt hàng đã được mua trong năm 2014 và tổng tiền trên 10triệu
6. Tính tổng số tiền đã bán được của từng hóa đơn
7. Tính tổng số lượng và tổng số tiền đã bán được của từng mặt hàng
8. Tính tổng số lượng và tổng số tiền đã bán được của từng mặt hàng trong năm 2013
9. Tính tổng số tiền đã mua hàng của từng khách hàng, thống kê dựa vào tên khách
hàng
10. Cho biết tên mặt hàng đã bán với số lượng nhiều nhất
11. (Đối với những nhân viên đã lập hóa đơn,) thống kê xem mỗi nhân viên đó được
bao nhiêu hóa đơn