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.. Viết câu lệnh SQL cho kết q
Trang 1Bài tập SQL 2005 2
Trang 3Lờ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ề
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ế
Trang 4Bà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:
Trang 5Số liệu mẫu trong bảng Class:
Số liệu mẫu trong bảng Subject:
Trang 6Số 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:
Trang 7BÀ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
ClassCode
HeadTeacher
DelDate
Mã lớp Tên giáo viên chủ nhiệm Ngày xóa lớp
Trang 8BÀ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ý:
Trang 9+ 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
Trang 10BÀ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 ậ ớ ọ ớ ể ấ
Trang 118 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:
Trang 12Dữ 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:
Trang 13(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):
Trang 14(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)
Trang 152 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 ả ứ ả ứ ạ ế ế ả
Trang 16Bà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
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
Trang 17Ví 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
D
MaKH MaSach NgayBan Soluong
Quan hệ giữa các bảng như sau:
Trang 18Trong 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
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).
Trang 19Câ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.