1. Trang chủ
  2. » Luận Văn - Báo Cáo

Hệ Quản Trị Cơ Sở Dữ Liệu Đồ Án Nhóm Đề Tài Project 1.Pdf

18 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Trang 1

ĐẠI HỌC DUY TÂN

KHOA CÔNG NGHỆ THÔNG TIN

HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU ĐỒ ÁN NHÓM

ĐỀ TÀI: PROJECT 1GVHD: Nguyễn Dũng

LỚP: IS 401 F

Nhóm thực hiện: Thái Bá Hưng

05/2024

Trang 2

Câu 1 Viết câu lệnh SQL để tạo CSDL có tên QLNV và tạo ra các bảng

Bảng PHONG

CREATE TABLE PHONG (

MAPHONG CHAR(3)PRIMARY KEY, TENPHONG NVARCHAR( ),40 DIACHI NVARCHAR( ),50 TEL CHAR( )10

Bảng NHANVIEN

CREATE TABLE NHANVIEN ( MANV CHAR(5)PRIMARY KEY, HOTEN NVARCHAR(40), GIOITINH BIT,

NGAYSINH DATETIME, HESOLUONG FLOAT, MAPHONG CHAR( ),3 NGAYCONG INT, NGAYBC DATETIME, MATKHAU CHAR( ),20

FOREIGN KEY (MAPHONG)REFERENCES PHONG(MAPHONG));

Bảng TDNN

CREATE TABLE TDNN ( MANV CHAR( ),5 MANN CHAR( ),2 TDO CHAR( ),1

PRIMARY KEY (MANV, MANN),

FOREIGN KEY (MANV)REFERENCES NHANVIEN(MANV), FOREIGN KEY (MANN)REFERENCES DMNN(MANN));

Trang 3

Câu 2 Viết các thủ tục để nhập dữ liệu và dùng thủ tục vừa viết để tạo nhập dữ liệu vào các bảng

CREATE PROCEDURE InsertOrUpdate_PHONG @MAPHONG VARCHAR(10),

@TENPHONG NVARCHAR(100), @DIACHI NVARCHAR(200), @TEL NVARCHAR( )20AS

INSERT INTO PHONG(MAPHONG, TENPHONG DIACHI TEL, , ) VALUES (@MAPHONG, @TENPHONG @DIACHI @TEL, , ); END

SET NOCOUNT ON;

IFEXISTS(SELECT FROM 1 DMNN WHERE MANN @MANN= )

Trang 4

BEGIN

UPDATE DMNN SET TENNN @TENNN= WHERE MANN @MANN= ; END

ELSE BEGIN

INSERT INTO DMNN(MANN, TENNN) VALUES (@MANN, @TENNN); END

EXECUTE InsertOrUpdate_DMNN '01' N'Anh', ;EXECUTE InsertOrUpdate_DMNN '02' N'Nga', ;EXECUTE InsertOrUpdate_DMNN '03' N'Pháp', ;EXECUTE InsertOrUpdate_DMNN '04' N'Nhật', ;EXECUTE InsertOrUpdate_DMNN '05',N'Trung Quốc';EXECUTE InsertOrUpdate_DMNN '06',N'Hàn Quốc';CREATE PROCEDURE InsertOrUpdate_NHANVIEN @MANV CHAR(5),

@HOTEN NVARCHAR(40), @GIOITINH BIT,

@NGAYSINH DATETIME, @HESOLUONG FLOAT, @MAPHONG CHAR( ),3 @NGAYCONG INT, @NGAYBC DATETIME, @MATKHAU CHAR( )20AS

ELSE

Trang 5

EXECUTE InsertOrUpdate_NHANVIEN 'HC001',N'Nguyễn Thị Hà', 0 ,'1950-08-27', 2.34,'HCA', 30 ,'1975-02-08',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'HC002',N'Trần Văn Nam', 1 ,'1975-12-06', 4.0,'HCA',15,'1997-08-06',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'HC003',N'Nguyễn Thanh Huyền', ,'1978-03-07', 5.7,'HCA', 29 ,'1999-09-24',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KD001',N'Lê Tuyết Anh', ,'1977-03-02', 6.4,'KDA',30,'2001-10-02',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KD002',N'Nguyễn Anh Tú', 1 ,'1942-04-07', 7.2,'KDA', 30 ,'1999-09-24',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KD003',N'Phạm An Thái', ,'1977-09-05', 3.4,'KDA',28,'1999-09-24',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KD004',N'Lê Văn Hải', ,'1976-02-01', 2.34,'KDA',27,'1997-06-08',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KD005',N'Nguyễn Phương Minh', 1 ,'1980-02-01', 4.0,'KDA', 26 ,'2001-10-02',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT001',N'Trần Đình Khâm', , 1 '1981-02-12', 5.7,'KTA', 28 ,'2005-01-01', NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT002',N'Nguyễn Mạnh Hùng', ,'1980-08-16', 6.4,'KTA', 17 ,'2005-01-01', NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT003',N'Phạm Thanh Sơn', , 1 '1984-08-20', 7.2,'KTA', 30 ,'2005-01-01', NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT004',N'Vũ Thị Hoài', , 0 '1980-05-12', 3.4,'KTA',30,'2001-10-02',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT005',N'Nguyễn Thu Lan', , 0 '1977-05-10', 2.34,'KTA', 30 ,'2001-10-02', NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT006',N'Trần Hoài Nam', ,'1978-02-07', 4.0,'KTA',30,'1997-06-08',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT007',N'Hoàng Nam Sơn', , 1 '1940-03-12', 5.7,'KTA', 30 ,'1965-07-02', NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT008',N'Lê Thu Trang', ,'1950-06-07', 6.4,'KTA',30,'1968-08-02',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT009',N'Khúc Nam Hải', ,'1980-07-22', 7.2,'KTA',30,'2005-01-01',NULL;

EXECUTE InsertOrUpdate_NHANVIEN 'KT010',N'Phùng Trung Dũng', ,'1978-08-28', 3.4,'KTA', 30 ,'1999-09-24', NULL;

CREATE PROCEDURE InsertOrUpdate_TDNN

Trang 6

@MANV CHAR(5), @MANN CHAR(2), @TDO CHAR(1)AS

SET NOCOUNT ON;

IFEXISTS(SELECT FROM 1 TDNN WHERE MANV @MANV= ) BEGIN

UPDATE TDNN SET MANN @MANN= , TDO @TDO=

WHERE MANV @MANV= ; END

ELSE BEGIN

INSERT INTO TDNN(MANV, MANN TDO, ) VALUES (@MANV, @MANN @TDO, ); END

EXEC InsertOrUpdate_TDNN 'HC001' '01' 'A', , ;EXEC InsertOrUpdate_TDNN 'HC001' '02' 'B', , ;EXEC InsertOrUpdate_TDNN 'HC002' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'HC002' '03' 'C', , ;EXEC InsertOrUpdate_TDNN 'HC003' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KD001' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'KD001' '02' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD002' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KD002' '02' 'A', , ;EXEC InsertOrUpdate_TDNN 'KD003' '01' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD003' '02' 'C', , ;EXEC InsertOrUpdate_TDNN 'KD004' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'KD004' '04' 'A', , ;EXEC InsertOrUpdate_TDNN 'KD004' '05' 'A', , ;EXEC InsertOrUpdate_TDNN 'KD005' '01' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD005' '02' 'D', , ;EXEC InsertOrUpdate_TDNN 'KD005' '03' 'B', , ;EXEC InsertOrUpdate_TDNN 'KD005' '04' 'B', , ;EXEC InsertOrUpdate_TDNN 'KT001' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KT001' '04' 'E', , ;EXEC InsertOrUpdate_TDNN 'KT002' '01' 'C', , ;EXEC InsertOrUpdate_TDNN 'KT002' '02' 'B', , ;EXEC InsertOrUpdate_TDNN 'KT003' '01' 'D', , ;EXEC InsertOrUpdate_TDNN 'KT003' '03' 'C', , ;EXEC InsertOrUpdate_TDNN 'KT004' '01' 'D', , ;

Trang 7

EXEC InsertOrUpdate_TDNN 'KT005' '01' 'C', , ;

Câu 3 Viết thủ tục in ra thông tin chi tiết của nhân viên dựa vào mã nhân viên gồm: Mã

nhân viên, tên nhân viên, tuổi, giới tính (nam, nữ)CREATE PROCEDURE CAU_3

@MANV VARCHAR( )10AS

WHEN GIOITINH 1 = THEN 'Nam'

WHEN GIOITINH 0 = THEN N'Nữ'

END AS GioiTinhFROM NHANVIENWHERE MANV = @MANV;COMMIT;

EXECUTE CAU_3 @MANV ='HC001';

Câu 4 Viết thủ tục in ra thông tin của nhân viên như câu 3 dựa vào họ của nhân viên

CREATE PROCEDURE CAU_4 @LastName NVARCHAR( )40AS

WHEN NHANVIEN GIOITINH 1 = THEN'Nam'

WHEN NHANVIEN GIOITINH 0 = THENN'Nữ'

ELSE'Không xác định'

END AS'Giới tính'

FROM NHANVIENWHERE

NHANVIEN HOTEN LIKE'%'+ @LastName +'%';

Trang 8

EXECUTE CAU_4 @LastName =N'Nguyễn';

Câu 5 Viết thủ tục in ra hai nhân viên nữ và hai nhân viên nam có thời gian công tác ở

Nhân viên nữ có thời gian công tác lâu nhất SELECT TOP (@FemaleCount)

NHANVIEN MANV AS 'Mã nhân viên', NHANVIEN HOTEN AS 'Tên nhân viên',

DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) AS 'Thời gian công tác (năm)', N'Nữ' AS 'Giới tính'

FROM NHANVIEN WHERE

NHANVIEN GIOITINH 0 = ORDER BY

DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) DESC; Nhân viên nam có thời gian công tác lâu nhất

SELECT TOP (@MaleCount)

NHANVIEN MANV AS 'Mã nhân viên', NHANVIEN HOTEN AS 'Tên nhân viên',

DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) AS 'Thời gian công tác (năm)', 'Nam'AS'Giới tính'

FROM NHANVIEN WHERE

NHANVIEN GIOITINH 1 = ORDER BY

DATEDIFF YEAR( , NHANVIEN.NGAYBC,GETDATE()) DESC; COMMIT TRANSACTION;

END;

Trang 9

EXECUTE CAU_5;

Câu 6 Viết thủ tục in ra thông tin nhân viên gồm: mã nhân viên, tên nhân viên, tuổi, giới

tính, Lương theo tên của phòng ban.

Lương của mỗi nhân viên được tính theo công thức: Lương =LCB*ngày công/số ngày côngchuẩn: LCB=1.500.000 Ngày công chuẩn là 26.

CREATE PROCEDURE CAU_6 @Tenphong NVARCHAR( )40AS

BEGIN TRANSACTION;

DECLARE @LCB FLOAT = 1500000.0; Lương cơ bản DECLARE @Ngaycongchuan INT 26= ; Số ngày công chuẩn SELECT

NHANVIEN MANV AS 'Mã nhân viên', NHANVIEN HOTEN AS 'Tên nhân viên',

DATEDIFF YEAR( , NHANVIEN.NGAYSINH,GETDATE()) AS 'Tuổi', CASE

WHEN NHANVIEN GIOITINH 1 = THEN'Nam'

WHEN NHANVIEN GIOITINH 0 = THENN'Nữ'

ELSE'Không xác định'

END AS'Giới tính',

(@LCB NHANVIEN NGAYCONG @Ngaycongchuan * / )AS 'Lương'

FROM NHANVIEN

INNER JOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG WHERE

PHONG TENPHONG @Tenphong = ; COMMIT TRANSACTION;

EXECUTE CAU_6 @Tenphong ='Hành chính tổ hợp';

Câu 7 Viết thủ tục in ra thông tin chi tiết của nhân viên có tuổi năm trong khoảng 25 đến 30 theo

từng phòng ban với mã phòng ban truyền vào.

Trang 10

CREATE PROCEDURE CAU_7 @MaPhong CHAR(3)AS

BEGIN TRANSACTION;

DECLARE @TuoiToiThieu INT 25= ; DECLARE @TuoiToiDa INT = 30; SELECT

NHANVIEN MANV AS'Ma nhan vien', NHANVIEN HOTEN AS'Ten nhan vien',

DATEDIFF YEAR( , NHANVIEN.NGAYSINH,GETDATE())AS'Tuoi', CASE

WHEN NHANVIEN GIOITINH 1 = THEN 'Nam'

WHEN NHANVIEN GIOITINH 0 = THEN N'Nữ'

ELSE 'Khong xac dinh'

END AS 'Gioi tinh'

FROM NHANVIEN

INNERJOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG WHERE

PHONG MAPHONG @MaPhong =

ANDDATEDIFF YEAR( , NHANVIEN.NGAYSINH,GETDATE())BETWEEN @TuoiToiThieu AND @TuoiToiDa;

COMMIT TRANSACTION;END;

EXECUTE CAU_7 @MaPhong ='KTA';

Câu 8 Viết thủ tục thống kê lương trung bình cho mỗi phòng ban: gồm mã phòng ban, tên

phòng ban, lương trinh bình.CREATE PROCEDURE CAU_8AS

BEGIN TRANSACTION;

DECLARE @LCB FLOAT 1500000.0 = ; Lương cơ bản DECLARE @Ngaycongchuan INT = 26 ; Số ngày công chuẩn SELECT

PHONG MAPHONG AS'Mã phòng ban',

Trang 11

PHONG TENPHONG AS N'Tên phòng ban',

AVG(@LCB NHANVIEN NGAYCONG @Ngaycongchuan* / ) AS 'Lương trung bình'

FROM NHANVIEN

INNERJOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG GROUP BY

PHONG.MAPHONG, PHONG.TENPHONG; COMMIT TRANSACTION;END;

EXECUTE CAU_8;

Câu 9 Viết thủ tục in ra mã ngoại ngữ, tên ngoại ngữ, trình độ cao nhất theo mã nhân viên.

CREATE PROCEDURE CAU_9 @MaNhanVien CHAR(5)AS

BEGIN TRANSACTION; SELECT

TDNN MANV AS'Mã nhân viên', TDNN MANN AS'Mã ngoại ngữ', DMNN TENNN AS N'Tên ngoại ngữ', TDNN TDO AS'Trình độ cao nhất'

FROM TDNN

INNERJOIN DMNN ON TDNN MANN DMNN = MANN WHERE

TDNN MANV @MaNhanVien = ; COMMIT TRANSACTION;END;

EXECUTE CAU_9 @MaNhanVien ='HC001';

Câu 10 Viết thủ tục lọc ra tất cả những nhân viên chưa học ngoại ngữ nào gồm mã nhân viên, tên

nhân viên, tên phòng ban.CREATE PROCEDURE CAU_10AS

Trang 12

BEGIN TRANSACTION; SELECT

NHANVIEN MANV AS'Mã nhân viên', NHANVIEN HOTEN ASN'Tên nhân viên', PHONG TENPHONG AS 'Tên phòng ban'

FROM NHANVIEN

INNERJOIN PHONG ON NHANVIEN MAPHONG PHONG = MAPHONG WHERE

NHANVIEN MANV NOT IN( SELECT MANV FROM TDNN );

COMMIT TRANSACTION;END;

EXECUTE CAU_10;

Câu 11 Viết thủ tục in ra những phòng ban gồm mã phòng ban, tên phòng ban và tổng lương

Chỉ in ra những phòng ban có tổng lương >=5000CREATE PROCEDURE CAU_11

BEGIN TRANSACTION; DECLARE @LCB INT; SET @LCB 1500000= ; SELECT

PHONG MAPHONG AS'Mã phòng ban', PHONG TENPHONG AS N'Tên phòng ban',

SUM(@LCB NHANVIEN NGAYCONG 26 * / )AS'Tổng lương'

FROM PHONG

INNERJOIN NHANVIEN ON PHONG MAPHONG NHANVIEN = MAPHONG GROUP BY

PHONG.MAPHONG, PHONG.TENPHONG HAVING

SUM(@LCB NHANVIEN NGAYCONG 26 * / ) >= 5000;

Trang 13

COMMIT TRANSACTION;END;

EXECUTE CAU_11;

Câu 12 Viết thủ tục in ra tất cả các nhân viên có ngày sinh trùng với ngày sinh hiện tại

CREATE PROCEDURE CAU_12 IN RA CÁC NV CÓ NGÀY SINH TRÙNG VỚI NGÀY HIỆN TẠI

BEGIN TRANSACTION;

DECLARE @NgaySinhHienTai DATE; SET @NgaySinhHienTai =GETDATE(); SELECT

MANV AS 'Mã nhân viên', HOTEN AS 'Tên nhân viên', NGAYSINH AS'Ngày sinh'

FROM NHANVIEN WHERE

NGAYSINH @NgaySinhHienTai= ; COMMIT TRANSACTION;END;

EXECUTE CAU_12;

Câu 13 Viết hàm tạo mã nhân viên tự động dựa vào mã phòng ban và số lượng nhân viên thuộc

phòng ban đó có trong bảng nhân viên.

VD: Phòng ban KTA và số nhân viên thuộc phòng ban KTA trong bảng nhân viên đang có là 10 thì mã mới được tạo ra là KT011.

CREATE FUNCTION CAU_13 (@MaPhongBan VARCHAR( ))10 RETURNS VARCHAR(20)AS

Trang 14

SELECT @SoLuongNhanVien =COUNT(*)FROM NHANVIEN WHERE MAPHONG =@MaPhongBan;

Tạo mã nhân viên tự động dựa vào mã phòng ban và số lượng nhân viên

SET @MaNhanVien @MaPhongBan = +'-'+CAST(@SoLuongNhanVien 1 + AS VARCHAR(10));RETURN @MaNhanVien;

DECLARE @MaNhanVienTaoTuDong VARCHAR( );20SET @MaNhanVienTaoTuDong dbo= AUTO_MANV('KT010');

Câu 14 Viết hàm tạo mật khẩu từ ngày sinh

CREATE FUNCTION CAU_14 @DOB ( DATE)RETURNS VARCHAR( )50

DECLARE @Password VARCHAR(50) DECLARE @Year INT, @Month INT, @Day INT

SELECT @Year =YEAR(@DOB), @Month =MONTH(@DOB), @Day =DAY(@DOB) Tạo mật khẩu từ ngày sinh

SET @Password =REPLACE CONVERT( (VARCHAR( ),10 @DOB 112, ),'-',''

RETURN @PasswordEND

Cập nhật mật khẩu cho từng nhân viên

UPDATE NHANVIEN

SET MatKhau = dbo CAU_14 NgaySinh ( )

Câu 15 Viết thủ tục tri cập nhật một viên mới tự động cập nhật tất cả các ngoại ngữ cho nhân viên

Trang 15

SET NOCOUNT ON; BEGIN TRANSACTION;

DECLARE @MaPhongBan VARCHAR(10); DECLARE @SoLuongNhanVien INT;

Lấy mã phòng ban và số lượng nhân viên sau khi thêm hoặc cập nhật SELECT @MaPhongBan MAPHONG = FROM inserted;

SELECT @SoLuongNhanVien =COUNT(*) FROM NHANVIEN WHERE MAPHONG =@MaPhongBan;

Kiểm tra số lượng nhân viên và nếu vượt quá 20 thì rollback thao tác @SoLuongNhanVien 20IF >

Câu 17 Viết Trigger chèn tự động mật khẩu theo ngày sinh cho nhân viên.

CREATE TRIGGER CAU_17 SAU KHI INSERT Ở DƯỚI SẼ CẬP NHẬT MẬT KHẨU TỰ ĐỘNGTHEO NGÀY SINH

ON NHANVIENAFTER INSERTAS

SET NOCOUNT ON; UPDATE NHANVIEN

SET MatKhau =FORMAT(NGAYSINH,'MMddyyyy') WHERE MANV IN(SELECT MANV FROM inserted);END;

INSERT INTO NHANVIEN (MANV HOTEN, , GIOITINH, NGAYSINH, HESOLUONG ,MAPHONG, NGAYCONG NGAYBC, )

VALUES ('KT011',N'ABC', 1,'1978-05-20', 3.4,'KTA', 30,'1999-09-24');

Câu 18 Viết Trigger ngăn không cho xóa nhân viên có thời gian công tác trong công ty lớn hơn 10

năm.

Trang 16

CREATE TRIGGER CAU_18ON NHANVIEN

INSTEAD OF DELETEAS

INNERJOIN NHANVIEN n ON d MANV n = MANV WHEREDATEDIFF YEAR( , nNGAYBC,GETDATE())> 10 )

BEGIN

RAISERROR ('Không thể xóa nhân viên có thời gian công tác lớn hơn 10 năm.', 16 1, ); ROLLBACK TRANSACTION;

END ELSE BEGIN DELETE n

Câu 19 Viết Trigger không cho xóa nhân viên ở phòng kinh doanh

DROP TRIGGER CAU_18 TRƯỚC KHI CHẠY CAU_19 PHẢI DROP CAU_18 HOẶC NGƯỢC LẠI

CREATE TRIGGER CAU_19ON NHANVIEN

INSTEAD OF DELETEAS

Trang 17

FROM deleted d

INNERJOIN NHANVIEN n ON d MANV n = MANV WHERE n MAPHONG ='KDA'

) BEGIN

RAISERROR ('Không thể xóa nhân viên trong phòng kinh doanh.', 16 1, ); ROLLBACK TRANSACTION;

END ELSE BEGIN DELETE n

Câu 20 Ngăn không cho nhập nhân viên có số ngày công lớn hơn 31

CREATE TRIGGER CAU_20ON NHANVIEN

INSTEAD OF INSERT,UPDATE

ASBEGIN IF EXISTS( SELECT 1 FROM inserted

WHERE NGAYCONG 31> )

BEGIN

RAISERROR ('Số ngày công không hợp lệ Vui lòng nhập số ngày công từ 1 đến 31.', 16 1, ); ROLLBACK TRANSACTION;

RETURN; END;END;

INSERT INTO NHANVIEN (MANV HOTEN, , GIOITINH, NGAYSINH, HESOLUONG ,MAPHONG, NGAYCONG NGAYBC , ) THỬ NHẬP NHÂN VIÊN CÓ SỐ NGÀY CÔNG LỚN HƠN 31

VALUES ('KT012',N'ABC', 1,'1978-05-20', 3.4,'KTA', 32,'1999-09-24');

Ngày đăng: 27/06/2024, 15:55

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w