You are on page 1of 20

Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

Bài tập SQL 2005 2

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 1 of 20

35/115 Phố Định Công – Hoàng Mai


Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

Lời giới thiệu

Sách bài tập do tập thể giáo viên AiTi-Aptech thiết kế và được sử dụng như một phần không thể
tách rời khỏi giáo trình đang học của Aptech Ấn Độ với các học viên đang theo học tại Trung tâm.

Tập sách bài tập này là tài liệu lưu hành nội bộ, chỉ dành cho các học viên theo học tại Trung tâm
đào tạo Lập trình viên Quốc tế AiTi-Aptech. Mọi hình thức sao chép lại nội dung của sách là vi phạm
bản quyền và không tuân thủ Luật Sở hữu trí tuệ của Nhà nước Việt Nam.

AiTi-Aptech luôn mong mỏi tạo dựng một môi trường học tập tốt cho các bạn học viên theo học tại
trung tâm. Mọi ý kiến đóng góp về xây dựng Sách bài tập, cải tiến hệ thống xin gửi mail về
contact.aiti@gmail.com hoặc đường dây nóng (04) 6 64 8848. Chúng tôi sẽ ghi nhận và cải
tiến để có thể cung cấp cho các bạn một môi trường học tập ngày một tốt hơn.

“Sự nghiệp tương lai của các bạn là thành công của chúng tôi”

Đội thiết kế Sách bài tập

Việt Nam luôn thiếu Lập trình viên đẳng cấp Quốc tế

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 3 of 20

35/115 Phố Định Công – Hoàng Mai


Contents
Bài thực hành SQLDO - Quản lý điểm....................................................................................................................3
Bài thực hành SQLSDO - Quản lý bán hàng.............................................................................................................7
Bài tập thực hành SQLSDO - Quản lý bán sách.......................................................................................................10

Bài thực hành SQLDO - Quản lý điểm

Các bảng trong csdl QLDIEM có cấu trúc như sau:

Sơ đồ quan hệ (relationship) dạng đơn giản:

Sơ đồ quan hệ cùng cấu trúc chi tiết các bảng:


Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

Số liệu mẫu trong bảng Class:

Số liệu mẫu trong bảng Subject:

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 5 of 20

35/115 Phố Định Công – Hoàng Mai


Số liệu mẫu trong bảng Student:

Số liệu mẫu trong bảng Mark:

Ghi chú: Trong bảng Class chứa thông tin về các lớp dự định mở và như vậy thông tin về lớp được nhập
trước khi lớp nhận sinh viên. Vì vậy có trường hợp tuy lớp đã đăng ký, nhưng do vì một lý do nào đó mà
lớp không khai giảng thì thông tin về lớp vẫn còn trong bảng Class nhưng trong bảng Student lại không
có.

Ngoài các bảng trên, hãy tạo thêm bảng testXML có chứa cột Address có kiểu XML, sẽ được dùng để
thử cho các lệnh liên quan đến kiểu dữ liệu này như index, view…

Bảng testXML có cấu trúc như sau:


Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

BÀI 1
Câu 1:

1. Tạo các bảng trên đây (lưu ý là trong bảng Class không có cột Stud_no).
2. Nhập một số bản ghi cho các bảng trên.

Câu hỏi 2:

Viết các lệnh T-SQL thực hiện các công việc sau:

1. Đặt foreign key constraint cho cột ClassCode trong bảng Student.

2. Tạo các loại index một cách thích hợp và theo dõi tác động của các lệnh này khi thực hiện các lệnh
truy vấn (select).

3 Hiển thị không lặp lại tên của sinh viên có một phần địa chỉ email là “fpt.vn” hoặc "fpt.com.vn"

4. Hiển thị những lớp có ngày kết thúc là 23/7/2006 mà không có sinh viên nào.
5. Loại bỏ các bản ghi từ các bảng CLASS, STUDENT và MARK của các lớp có ngày kết thúc trước
1/1/2005.

6. Hiển thị ClassCode, RollNo, FullName và tổng số sinh viên với mỗi lớp. Hiển thị tổng số sinh viên
cho tất cả các lớp.

7. Tạo view viewClass1 chứa danh sách lớp đối với các lớp có hơn 17 sinh viên.

8. Hiển thị SubjectCode (mã môn học) , SubjectName (tên môn học) và số sinh viên đã thi môn đó với
số sinh viên tham gia đông nhất.

Câu hỏi 3:

Tạo trigger có tên là TrigDelClass cho thao tác xóa lớp trên bảng CLASS.

Trước khi xóa thì mã lớp, tên giáo viên chủ nhiệm và ngày xóa được lưu vào bảng CLASS_HIST. Đồng
thời xóa các bản ghi liên quan trong các bảng STUDENT và MARK.

Cấu trúc của bảng CLASS_HIST

Cột Mô tả
ClassCode Mã lớp
HeadTeacher Tên giáo viên chủ nhiệm
DelDate Ngày xóa lớp

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 7 of 20

35/115 Phố Định Công – Hoàng Mai


BÀI 2

Câu 1: Tạo bảng và nhập dữ liệu


1. Viết các câu SQL tạo bảng có đủ các khoá chính và khoá ngoại theo lược đồ và mô tả trên.

2. Viết các câu SQL nhập đầy đủ và chính xác những dữ liệu theo mô tả trên vào các bảng vừa tạo.
(Lưu ý thứ tự nhập dữ liệu).

Câu 2: Viết các câu truy vấn dữ liệu (query)


1. Viết câu lệnh SQL cho kết quả là số sinh viên đã có điểm thi môn “CF”.

2. Viết câu lệnh SQL cho kết quả là danh sách các môn học cùng với số sinh viên đã có điểm thi tương
ứng của từng môn học, theo thứ tự tăng dần của tên môn học.

3. Viết câu lệnh SQL cho kết quả là danh sách các sinh viên quê ở "HT" (Hà Tây), cùng với tên các
môn học đã thi nhưng không qua (< 10 điểm).

4. Viết câu lệnh SQL cho kết quả là danh sách các lớp học, cùng với tổng số sinh viên trong lớp.

5. Viết câu lệnh SQL cho kết quả là danh sách các sinh viên, cùng với tên đầy đủ các môn học mà sinh
viên đó đã tham gia thi.

6. Viết câu lệnh SQL cho kết quả là danh sách các sinh viên, cùng với số lần đã tham gia thi thực hành
(mỗi record trong bảng MARK có điểm PMark là một lần thi).

7. Viết câu lệnh SQL cho kết quả là danh sách các tỉnh, cùng với điểm trung bình tất cả các môn thi của
sinh viên quê ở tỉnh đó. Sắp xếp theo thứ tự giảm dần của điểm trung bình.

8. Viết lệnh SQL cho kết quả là danh sách các sinh viên có điểm trung bình tất cả các môn học >15.

Câu 3: Viết Stored Procedure


Viết một script tạo stored procedure với các yêu cầu sau:

- Tên Procedure: procStudentList

- Thông số: pClassCode as varchar(10), pMark as float

- Xử lý:
Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

+ Nếu thông số pClassCode được truyền = '' hoặc không truyền, procedure sẽ liệt kê danh sách:
ClassCode, RollNo, FullName, SubjectCode, Mark lớn hơn hay bằng tham số pMark được
truyền vào.

+ Nếu thông số pMark không truyền thì nhận giá trị ngầm định =0.

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 9 of 20

35/115 Phố Định Công – Hoàng Mai


BÀI 3

Viết các lệnh T-SQL thực hiện các công việc sau:
1. Liệt kê danh sách lớp với tên lớp, giáo viên chủ nhiệm và số sinh viên thực tế trong lớp (là số bản
ghi có mã lớp như nhau trong bảng student).
2. Thêm một trường mới vào bảng Class có tên là Stud_no có kiểu là smallint. Trường này nhận giá trị
là số sinh viên thực tế trong lớp, tức là số sinh viên đếm được từ bảng Student. Hãy cập nhật thông
tin cho trường này.
3. Hãy sửa lại thông tin đã tính toán cho trường stud_no trong bảng Class. Như vậy thông tin về trường
này trong những bản ghi đã sửa đổi không khớp với số bản ghi tương ứng trong bảng Student. Hãy
viết câu lệnh liệt kê trên màn hình những lớp mà thông tin về số sinh viên trong trong hai bảng
không khớp nhau. Danh sách các trường là:
ClassCode, HeadTeacher, Stud_no, CountStud_no
trong đó CountStud_no là số sinh viên được tính toán từ bảng student.
4. Viết lệnh loại bỏ trường Stud_no trong bảng Class và thực hiện, để bảo đảm rằng trường này không
còn tồn tại trong bảng Class. Hãy viết một stored procedure có tên là proc1 tạo bảng có tên là T1
gồm các thông tin sau:
ClassCode, HeadTeacher, CountStud_no
trong đó CountStud_no là số sinh viên thực tế có trong bảng Student. Nếu bảng đã tồn tại từ trước
thì xóa bảng trước khi tạo mới. Nếu tên lớp đã có trong bảng Class nhưng trong bảng Student không
có bản ghi nào tương ứng thì lớp được coi là có số sinh viên = 0.
5. Viết Function có tên là func1 có tham số vào là pClassCode có kiểu varchar(10) và trả về số sinh viên
thực tế của lớp đó. Viết lệnh thử lại kết quả trên màn hình, sau đó dùng hàm này để cập nhật trường
stud_no của bảng Class.

6. Viết Stored Procedure có tên là procTopClass có các tham số vào là pClassCode, pSubjectCode là mã lớp
và mã môn học; tham số ra là pRollNo, là mã sinh viên có điểm thi môn học này cao nhất trong lớp. Viết
lệnh thử lại bằng cách nhập mã lớp, mã môn học sau đó in ra màn hình mã sinh viên cùng với FullName có
điểm thi cao nhất.

7. Viết User-function có tên là func2 có các tham số vào là pClassCode, pSubjectCode là mã lớp và mã môn
học; giá trị trả về là mã sinh viên có điểm thi môn học này cao nhất trong lớp. Viết lệnh thử lại bằng cách
nhập mã lớp, mã môn học sau đó in ra màn hình mã sinh viên cùng với FullName có điểm thi cao nhất.
Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

8. Sử dụng cursor hiển thị classcode, rollno, fullname của các sinh viên tại các bản ghi chẵn trong bảng
Student.

9. Sử dụng cursor sửa lại giá trị mark của các sinh viên tại các bản ghi 3, 6, 9,... thành 25 trong bảng Mark
(câu này không có ý nghĩa thực tế, chủ yếu là để hiểu rõ hơn về cursor mà thôi).

Bài thực hành SQLSDO - Quản lý bán hàng


CSDL BANHANG lưu trữ thông tin về quản lý bán hàng tại siêu thị Bình Minh ở Hà Nội gồm 6 bảng
có cấu trúc như sau:

Dữ liệu mẫu trong bảng NhaCungCap:

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 11 of 20

35/115 Phố Định Công – Hoàng Mai


Dữ liệu mẫu trong bảng KhachHang:

Dữ liệu mẫu trong bảng NhanVien:

Dữ liệu mẫu trong bảng LoaiSanPham:


Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

(xem tiếp trang 3)Cấu trúc các bảng bảng có dạng (bạn có thể thay kiểu nvarchar bằng kiểu varchar):

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 13 of 20

35/115 Phố Định Công – Hoàng Mai


(tiếp theo trang 1)

Dữ liệu mẫu trong bảng SanPham:

Lưu ý: Trường SoLuongTT có nghĩa là số lượng tối thiểu phải có trong kho. Nếu số lượng đến mức này
thì phải nhập hàng từ nhà cung cấp.

Dữ liệu mẫu trong bảng HoaDon:

Dữ liệu mẫu trong bảng HoaDonChiTiet:

Hãy viết các lệnh T-SQL thực hiện các công việc sau:

1. Tạo các loại index một cách thích hợp và theo dõi tác động của các lệnh này khi thực hiện các lệnh
truy vấn (select).
Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

2. Trong bảng HoaDonChiTiet cột thành tiền còn chưa được tính toán, hãy cập nhật trường ThanhTien=
DonGia*SoLuong*(1-GiamGia).

3. Sau khi đã có thông tin về ThanhTien trong HoaDonChiTiet, hãy cập nhật thông tin của trường Tien
trong hóa đơn = tổng số tiền của các mặt hàng có trong hóa đơn = tổng của cột ThanhTien của các
bản ghi trong HoaDonChiTiet có cùng số hóa đơn (MaHD). Cập nhật trường
TongSoTien=Tien*(1+Thue).

4. Hiển thị danh sách các mặt hàng với đầy đủ các thông tin sau: Loại hàng, mã hàng, tên hàng sắp xếp
tăng dần theo tên hàng.

5. Liệt kê từng mặt hàng và tổng số hàng đã bán (có trong hóa đơn chi tiết) theo từng mặt hàng.

6. Liệt kê từng mặt hàng và tổng số tiền đã bán (có trong hóa đơn chi tiết) theo từng mặt hàng.

7. Liệt kê chi tiết các mặt hàng đã bán bao gồm các thông tin sau:

Số hóa đơn, Mã sản phẩm (hàng), tên sản phẩm, đơn giá, số lượng, giảm giá và thành tiền. Chỉ liệt
kê những mặt hàng có giảm giá trên 1% (tức là trường GiamGia > 0.01), và ThanhTien <10000.

8. Hãy liệt kê danh sách khách hàng với đầy đủ các thông tin như: Mã khách hàng, tên khách hàng, địa
chỉ, điện thoại, số hóa đơn đã đặt mua hàng trong tháng 3 năm 1997. (Chỉ liệt kê các khách hàng này
và sắp xếp theo thứ tự tăng dần của họ và tên).

9. Liệt kê danh sách các mặt hàng đã bán theo từng loại hàng. Với mỗi loại hàng tính tổng số mặt hàng
đã bán, tổng số tiền và cuối cùng có tổng số tất cả mặt hàng đã bán và tổng số tiền.

10. Liệt kê danh sách tất cả các khách hàng đã mua hàng trong tháng 11/2006 và tổng số tiền mà học đã
mua.

11. Liệt kê danh sách tất cả các nhân viên và số tiền hàng họ bán được trong tháng 11/2006.

12. Viết Stored Procedure có tên là procProductList có hai tham số vào là pYear và pMonth. Cả hai
tham số là số nguyên chỉ năm và tháng. Procedure có một tham số OUTPUT là pMaLoaiHang, là
mã của loại hàng đã bán được số tiền nhiều nhất trong tháng pMonth và năm pYear. Số tiền cho mỗi
mặt hàng là: DonGia x SoLuong, không tính đến GiamGia. Sau khi viết xong Procedure thì thử lại,
sau đó in ra mã và cả tên loại hàng có mã là pMaLoaiHang.

13. Viết Function có tên là funcDonGia có tham số vào là mã mặt hàng (sản phẩm) và trả về đơn giá của
mặt hàng này. Viết lệnh thử lại kết quả trên màn hình.
14. Viết trigger xóa bản ghi trong bảng LoaiSanPham. Khi xóa thi lưu thông tin mã loại sản phẩm
(MaLoaiSP), và thông tin ngày xóa (DelDate) vào bảng LoaiSP_Hist đồng thời xóa các bản ghi tương ứng
trong các bảng liên quan (tức là các bảng có chứa khóa ngoại tham chiếu đến bảng LoaiSanPham.

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 15 of 20

35/115 Phố Định Công – Hoàng Mai


Bài tập thực hành SQLSDO - Quản lý bán sách
Cho CSDL lưu trữ thông tin về quản lý sách ở cửa hàng sách Rạng Đông ở Hà Nội gồm ba bảng
có cấu trúc như sau:

Sach: Chứa danh sách các quyển sách có trong cửa hàng Rạng Đông

Field Description
MaSach Mã sách, là Primary key
TenSach Tên sách
TacGia Tác giả
NhaXB Tên nhà xuất bản
ChuDe Chủ đề
TrongKho Số lượng còn trong kho

Ví dụ, bảng Sach có thể chứa các thông tin như sau:

MaSach TenSach TacGia ChuDe DonGia TrongKho


1 Hoang hon tren song Gia Phong Tinh yeu 120 11
2 Cay lua nuoc Le May Khoa hoc 30 24
3 Tam ly truoc mua thi Hai Dang Tam ly 42 32

KhachHang: Chứa danh sách khách hàng của cửa hàng

Field Description
MaKH Mã khách hàng, là Primary key
TenKH Tên khách hàng
DiaChi Địa chỉ kháchhàng
Quan Tên quận hoặc huyện nơi khách hàng cư trú
DienThoai Số điện thoại của kháchàng
Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

Ví dụ, bảng KhachHang có thể chứa các thông tin như sau:

MaKH TenKH DiaChi Quan DienThoai NguoiGT


1 Le Cong 22 Hang Buom Hoan Kiem 098123654 Hoang Kim
2 Van Nghe 19 Lo Duc Hoan Kiem
3 Tran Thong 19 Doi Can Ba Dinh
4 Hoang Tin 38 Linh Nam Hoang Mai

SachBan: Chứa danh sách các quyển sách đã bán ở cửa hàng Rạng Đông.

Field Description
SoHD Số hóa đơn (là Primary key)
MaKH Mã khách hàng đã mua sách
MaSach Mã sách mà khách hàng đã mua
NgayMua Ngày mua sách
DonGia Đơn giá sách tại thời điểm bán sách
SoLuong Số lượng sách bán

Ví dụ, bảng SachBan có thể chứa các thông tin như sau:

SoH MaKH MaSach NgayBan Soluong


D
1 1 2 22/11/2006 5
2 1 3 15/7/2005 4
3 2 1 24/5/2006 7
4 3 1 15/11/2005 9

Quan hệ giữa các bảng như sau:

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 17 of 20

35/115 Phố Định Công – Hoàng Mai


Trong bảng SachBan thì field MaKH là khóa ngoại tham chiếu đến field MaKH trong bảng
KhachHang, còn field MaSach là khóa ngoại tham chiếu đến field MaSach trong bảng Sach.

Mô tả:

Trong bảng KhachHang thì mã số khách hàng (MaKH) là duy nhất, và các field dữ liệu về khách
hàng là bắt buộc nhập (not NULL), ngoại trừ field NguoiGT.

Một khách hàng lần đầu tiên mua hàng ở của hàng sách Rạng Đông, nhân viên sẽ hỏi thông tin về
khách hàng và nhập vào bảng KhachHang. Ví dụ, khách hàng là Tân đến mua sách ở Nhà Sách
Rạng Đông thì thông tin về Tân có thể được lưu trữ trong bang KhachHang như sau:

MaKH: 15

TenKH: Tân

DiaChi: 123 Doi Can

Quan: Ba Dinh

Dữ liệu mua sách sẽ được cập nhật vào bảng SachBan. Các field trong bảng này đều yêu cầu nhập
dữ liệu (not NULL). Bảng Sach lưu các thông tin về từng đầu sách như đã giới thiệu ở trên.

Chú ý: Các thuộc tính có gạch chân là khoá chính (primary key) của bảng

YÊU CẦU:

Tạo database có tên RangDong trong SQL server của máy cục bộ và thực hiện các công việc sau:

Câu 1: Tạo bảng và nhập dữ liệu


a. Viết các câu SQL tạo bảng có đủ các khoá chính và khoá ngoại theo lược đồ và mô tả trên.

b. Viết các câu SQL nhập đầy đủ và chính xác những dữ liệu theo mô tả trên vào các bảng vừa tạo.
(Lưu ý thứ tự nhập dữ liệu).

c. Tạo các loại index một cách thích hợp và theo dõi tác động của các lệnh này khi thực hiện các
lệnh truy vấn (select).
Sách bài tập SQL Server 2 AiTi-Aptech “Kiến tạo tương lai” Tài liệu lưu hành nội bộ

Câu 2: Viết các câu truy vấn dữ liệu (query)


a. Viết câu lệnh SQL cho kết quả là số đầu sách xuất bản bởi nhà xuất bản “KHKT”.

b. Viết câu lệnh SQL cho kết quả là danh sách các nhà xuất bản cùng với số đầu sách tương ứng
của từng NXB, theo thứ tự tăng dần của tên NXB

c. Viết câu lệnh SQL cho kết quả là danh sách các khách hàng sống trong quận "Ba Dinh", cùng
với tên các đầu sách mà từng khách hàng đó đã mua.

d. Viết câu lệnh SQL cho kết quả là danh sách các khách hàng, cùng với tổng số các cuốn sách
(total quantity) mà từng khách hàng đó đã mua.

e. Viết câu lệnh SQL cho kết quả là danh sách các khách hàng, cùng với tên các nhà xuất bản của
những đầu sách mà khách hàng đó đã mua.

f. Viết câu lệnh SQL cho kết quả là danh sách các khách hàng, cùng với số lần mua sách của từng
khách hàng đó (mỗi record trong bảng SachBan là một lần mua sách).

g. Viết câu lệnh SQL cho kết quả là danh sách các quận, cùng với tổng giá trị mua sách của các
khách hàng sống trong quận đó. Sắp xếp theo thứ tự giảm dần của giá trị.

Câu 3: Viết Stored Procedure


Viết một script tạo stored procedure với các yêu cầu sau:

- Tên Procedure: procSachBan

- Tham số: pChuDe

- Xử lý:

+ Nếu thông số pChuDe không được truyền, procedure sẽ liệt kê danh sách tất cả các
quyển sách đã bán (trong bảng SACHBAN) gổm: MaSach, TenSach, SoLuong,
ThanhTien. Lưu ý là một quyển sách với tiêu đề nào đó có thể được bán nhiều lần với số
lượng khác nhau, nhưng trong danh sách trên thì MaSach va TenSach chỉ hiển thị một
lần, không lặp lại.

+ Nếu thông số pChuDe được truyền, procedure sẽ liệt kê danh sách tất cả các quyển sách
đã bán (trong bảng SACHBAN) gổm: MaSach, TenSach, SoLuong, ThanhTien, nhưng
chỉ gồm những quyển thuộc chủ đề pChuDe mà thôi.

Trung tâm đào tạo Lập trình viên Quốc tế AiTi-Aptech Page 19 of 20

35/115 Phố Định Công – Hoàng Mai

You might also like