Tải bản đầy đủ (.docx) (25 trang)

Tổng hợp các bài tập truy vấn cơ sở dữ liệu

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (85.57 KB, 25 trang )

CHƯƠNG 1: THIẾT KẾ BẢNG TRONG CSDL VÀ RÀNG BUỘC TOÀN VẸN
create database QLSV1
use QLSV1
create table tblKhoa
(
MaKhoa nvarchar(10) not null,
TenKhoa nvarchar(20),
)
create table tblSinhVien
(
MaSV nvarchar(10) not null,
HoTen nvarchar(50),
DiaChi nvarchar(100),
NamSinh Datetime,
MaKhoa nvarchar(10)
)
create table tblMonHoc
(
MaMon nvarchar(10) primary key,
tenMon nvarchar(30)
)
create table tblDiemThi
(
MaMon nvarchar(10) not null,
MaSV nvarchar(10) not null,
DiemThi float
)
1.1.
Tao ràng buộc khóa trên cột MaSV của bảng tblSinhVien
alter table tblSinhVien add constraint p_SV primary key(MaSV)
1.2.


tạo ràng buộc khóa trên cột khoa của bảng tblKhoa
alter table tblKhoa add constraint p_Khoa primary key(MaKhoa)
1.3.
Tạo ràng buộc khóa trên cột MaSV va MaMon của bảng tblDiemThi
alter table tblDiemThi add constraint p_DiemThi primary key(MaSV,MaMon)
1.4.

Tạo ra chỉ mục trên cột HoTen của bảng tblSinhVien(co p_SV nen k the tao duoc
chi muc clustered)
create nonclustered index SV_HoTen on tblSinhVien(HoTen)


1.5.
Thêm cột KhoaHoc(khóa học ) của bảng tblSinhVien
alter table tblSinhVien add KhoaHoc nvarchar(10)
1.6. Tạo ràng buộc not null trên cột tên khoa
alter table tblKhoa alter column TenKhoa varchar(20) not null
1.7. Tạo ràng buộc not null trên cột DiemThi
alter table tblDiemThi alter column DiemThi float not null
1.8.
Tạo ràng buộc để cột điểm thi chỉ có thể nhận các giá trị từ 0-10
alter table tblDiemThi add constraint c_DiemThi check(DiemThi>0 and DiemThi<10)
1.9.

Tạo ràng buộc trên cột NamSinh để chỉ có thể nhạn giá trị từ '1/1/1999'
đến'30/12/2005'
alter table tblSinhVien add constraint c_NamSinh check (NamSinh between '1/1/1999'
and '12/30/2005')
1.10. Thêm cột ghichu vào bảng tblKhoa
alter table tblKhoa add GhiChu nvarchar(100)

1.11. Tạo quan hệ 1-n từ bảng tblKhoa sang bảng tblSinhVien
alter table tblSinhVien add constraint f_SV_Khoa foreign key(MaKhoa) references
tblKhoa(MaKhoa)
1.12. Tạo quan hệ 1-n từ bảng tblSinhVien sang bảng tblDiemThi
alter table tblDiemThi add constraint f_SV_DiemThi foreign key(MaSV ) references
tblSinhVien(MaSV )
1.13. Tạo quan hệ 1-nt ừ bảng tblMonHoc sang bảng tbDiemThi
alter table tblDiemThi add constraint f_MH_DiemThi foreign key(MaMon) references
tblMonHoc(MaMon)
1.14. Chèn 1 số bản ghi vào các bảng
insert into tblKhoa values ('101','CNTT',' ')
insert into tblKhoa values ('102','Điện Tử',' ')
insert into tblKhoa values ('103','May',' ')
insert into tblKhoa values ('104','Môi Trường',' ')
insert into tblKhoa values ('105','Kế toán',' ')
insert into tblKhoa values ('3','Công nghệ thông tin',' ')


insert into tblSinhVien values ('SV1','bcxfv','HY','2/2/1999','101','2009-2013')
insert into tblSinhVien values ('SV2','fb xd','HY','3/3/2000','101','2009-2013')
insert into tblSinhVien values ('SV3','bcgfbxfv','HY','5/2/1999','101','2009-2013')
insert into tblSinhVien values ('SV4','fbgxd','HY','3/7/2000','101','2009-2013')
insert into tblSinhVien values ('SV5','fbgvhgxd','HY','8/7/2000','104','2009-2013')
insert into tblSinhVien values ('SV6','Nguyễn Văn Bình','HY','2/2/2003','101','20092013')
insert into tblMonHoc values ('M1','Toán cao cấp 1')
insert into tblMonHoc values ('M2','Toán cao cấp 2')
insert into tblMonHoc values ('M3','Toán cao cấp 3')
insert into tblMonHoc values ('M4','Hóa học đại cương')
insert into tblMonHoc values ('M5','Tin học đại cương')
insert into tblMonHoc values ('5','JaVa')

insert into tblDiemThi values ('M1','SV1','4')
insert into tblDiemThi values ('M2','SV4','5')
insert into tblDiemThi values ('M3','SV3','6')
insert into tblDiemThi values ('M2','SV2','7')
insert into tblDiemThi values ('M4','SV3','9')
insert into tblDiemThi values ('5','SV6','9')
insert into tblDiemThi values ('5','SV3','4')

1.15. Cho biết các sinh viên thi lai môn java biết môn 'java' có mã môn la 5
select * from tblSinhVien where MaSV in(select MaSV from tblDiemThi where
MaMon='5' and DiemThi<5)
1.16.
a. Cho biết điểm môn 'java' của sinh viên tên la 'nguyễn văn bình'
select DiemThi from tblDiemThi where MaSV in(select MaSV from tblSinhVien where
HoTen='Nguyễn Văn Bình')
b. Số lượng các sinh viên bị trượt môn java
select count(MaSV ) from tblDiemThi where MaMon= '5' and DiemThi<5
1.17. Cho biết số lượng SV của khoa CNTT biet makhoa la 3
select count(MaSV ) from tblSinhVien where MaKhoa='3'
1.18. Hủy bỏ điểm thi của sinh viên có mã la 1
delete from tblDiemThi where MaSV ='SV1'


1.19. sửa lại điểm thi của SV co mã là 2 thành 8
update tblDiemThi
set DiemThi=8 where MaSV ='SV2'
1.20. Xóa ràng buộc chỉ mục trên cột hoten
drop index SV_HoTen on tblSinhVien
1.21. Xóa ràng buộc từ bảng tblKhoa sang bảng tblSinhVien
alter table tblSinhVien drop constraint f_SV_Khoa


CHƯƠNG 2: TRUY VẤN NÂNG CAO
I: Cơ sở dữ liệu QLSV
create database QLSV2
use QLSV2
create table tblSinhVien
(
MaSV nvarchar(10) primary key,
HoTen nvarchar(50),
DiaChi nvarchar(100)
)
create table tblMonHoc
(
MaMon nvarchar(10) primary key,
TenMon nvarchar(50)
)
create table tblDiemThi
(
MaMon nvarchar(10),
MaSV nvarchar(10),
Diem float,
constraint f_MaMon foreign key (MaMon) references tblMonHoc(MaMon),
constraint f_MaSV foreign key (MaSV ) references tblSinhVien(MaSV) ,
constraint p_DiemThi primary key(MaMon, MaSV)
)


2.1.

Cho biết các ds sinh viên có địa chỉ là một trong các tỉnh sau: HY, BG,

NB,TH,NA,HG
select * from tblSinhVien
where DiaChi in('HY','BG','NB','TH','NA','HG')

2.2.

Cho biết ds SV trong top 10 SV có điểm tin cao nhất

select top 10 tblSinhVien.MaSV , HoTen,DiaChi, Diem from tblSinhVien,tblDiemThi
where tblSinhVien.MaSV =tblDiemThi.MaSV and tblSinhVien.MaSV in(select MaSV
from tblDiemThi where MaMon in
(select MaMon from tblMonHoc where TenMon ='Tin'))
order by (Diem)
2.4.

Cho biết ds các sinh viên bị trượt môn tin học

select * from tblSinhVien where MaSV in
(select MaSV from tblDiemThi where Diem<4 and MaMon in(select MaMon from
tblMonhoc where TenMon='Tin'))
2.5.

Cho biết ds các SV bị trượt ít nhất 1 môn

select * from tblSinhVien where MaSV in(
select MaSV from tblDiemThi where Diem<=4
group by (MaSV)
having count(Diem)>=1
)
2.6.


cho biết ds các SV bị trượt tất cả các môn

select * from tblSinhVien where MaSV in(
select MaSV from tblDiemThi where Diem<=4
group by (MaSV )
having count(Diem)=count(MaSV )
)
2.7.

cho biết ds các SV dã thi tất cả các môn

select * from tblSinhVien where MaSV not in(select MaSV from tblDiemThi)


2.8.

cho biết ds cac sv chua thi tất cả các môn

select * from tblSinhVien where MaSV in(
select MaSV from tblDiemThi group by (MaSV) having count (MaMon)< (select
count(maMon) from tblMonHoc))
II: Cơ sở dữ liệu BanHang
2.9.

Liệt kê NH_NCC có địa chỉ ở Hà Nội

select *from DM_NhaCungCap
where DiaChi='Hà Nội'
2.10.


Liệt kê hóa đơn bán hàng trong thang 4/2008

select *from DM_HoaDon
where month(NgayLapHoaDon)='4' and year(NgayLapHoaDon)='2009'
2.11.

Liệt kê hóa đơn nhập hàng do nhân viên 'Nguyễn Thị A' phụ trách lập trong
T4/2008

select * from DM_HoaDon
where year(NgayLapHoaDon)='2009' and month(NgayLapHoaDon)='4'
and MaNV in(select MaNV from DM_NhanVien where TenNhanVien='Nguyễn Thị A')
2.12.

Lập báo cáo tổng hợp mặt hàng xuất từ đầu năm đến nay: MaHang| SoLuong

select MaHang,SoLuong from DM_ChiTietHoaDon
where MaHD in(select maHD from DM_HoaDon where NgayLapHoaDon between
'1/1/2011' and getdate())
2.13.

Liệt kê 10 mặt hàng bán chạy nhất trong T4/2008(số lượng khách hàng giao dịch
nhiều nhất)

select top 10 MaHang, sum(SoLuong) as SoLuong from DM_ChiTietHoaDon
where MaHD in(select MaHD from DM_HoaDon where year(NgayLapHoaDon)='4' and
month(NgayLapHoaDon)='2008')
group by MaHang
order by sum(SoLuong) desc



2.14.

Thống kê doanh thu ban hàng của nhân viên trong T4/2008 DoanhThu=SL*DGSL*DG*ChietKhau

select MaNV, sum(SoLuong*DonGia-SoLuong*DonGia*ChietKhau) as DoanhThu
from DM_ChiTietHoaDon,DM_HoaDon
where DM_ChiTietHoaDon.MaHD=DM_HoaDon.MaHD and
month(NgayLapHoaDon)='4'and year(NgayLapHoaDon)='2008'
group by MaNV
2.15. Báo cáo tổng hợp nhập, xuất, tồn tinh từ 01/04/2008 đến 30/04/2008
MaHang| Tồn đầu kỳ| Tổng Nhập| Tổng xuất| Tồn cuối kì
2.16. Liệt kê các mặt hàng không có người mua trong T4/2008
select *from DM_HangHoa
where MaHang not in (select MaHang from DM_HoaDon where
year(NgayLapHoaDon)='2008' and month(NgayLapHoaDon)='4')
2.17.

Báo cáo tổng hợp kết quả kinh doanh trong tháng 4/2008 TongHangNhap|
TongHangXuat

2.18.

Liệt kê mặt hàng bán chạy nhất

select * from DM_HangHoa
where MaHang in(
select MaHang from DM_CHiTietHoaDon group by MaHang having sum(Soluong)>
all(select sum(soluong) from DM_CHiTietHoaDon))

III. CSDL Quản Lí Nhân Sự
2.19. Tìm những CB nhập ngũ từ năm 1960-1965 quê ở hà tây
select *from HSCB where( year(NgayNhapNgu) between 1960 and 1965) and
MaQue in(select MaDonVi from DMDonvi where TenDonVi='Hà Tây')
2.20.

liệt kê ds CB đến tuổi chờ nghỉ hưu(Nam>=55, nữ >=50)

select * from HSCB where (year(NgaySinh )>=55 and GioiTinh='True')
or(year(NgaySinh )>=50 and GioiTinh='False')


2.21.

Thống kê sỹ số của từng đơn vị tính đến thời điểm hiên tại

select MaCB from QTCongTac
where ToiNgay<=getdate()
compute count(MaCB)
2.22.

liệt kê quá trình công tác của CB 'Nguyễn Văn A' sắp xếp theo thời gian tăng dần

select MaDonVi, MaChucVu,TuNgay,ToiNgay from QTCongTac
where MaCB in(select MaCB from HSCB where HoDem='Nguyễn Văn ' and Ten='A')
group by MaDonVi, MaChucVu,TuNgay,ToiNgay
order by TuNgay-ToiNgay
2.23.

Liệt kê CB dã hoăc đang đảm nhiêm chức vụ pho phòng


select * from HSCB where MaCB in(
select MaCB from QTCongTac where MaChucVu in(
select MaChucVu from DMChucVu where TenChucVu='Phó Phòng'
))
2.24.

Liệt kê các CB đã đảm nhiệm chức vụ 'Trưởng Phòng'

select *from HSCB where MaCB in(
select MaCB from QTCOngTac where MaChucVu in(
select MaChucVu from DMChucVu where TenChucVu='Trưởng Phòng'
))
2.25.

Liệt kê CB có số lần luân chuyển nhiều nhất

select * from HSCB
where MaCB in (
select MaCB from QTCongTac group by MaCB
having count(MaChucVu)>all(
select count(MaChucVu) from QTCongTac group by MaCB))
2.26.

Liệt kê trong khoảng thời gian từ năm 2005 đến nay, tại phòng dào tạo có bao
nhiêu CB dược chuyển đến và chuyển đi
select count(MaCB) from QTCongTac where (year(TuNgay)>=2005 or
year(ToiNgay)>=2005) and MaDonVi in(
select MaDonVi from DMDonVi where TenDonVi='Phòng Đào Tạo'
)



2.27. Hiển thị thông tin về đơn vị, CB tương ứng của đơn vị đó và thống kê số lượng
NV thuộc mỗi đơn vị
select * from HSCB,QTCongTac
where HSCB.MaCB=QTCongTac.MaCB
compute count(QTCongTac.MaDonVi)
2.28. Xếp hạng CB theo độ tuổi
select * from HSCB
order by year(NgaySinh )-year(getdate())

CHƯƠNG 3. VIEW
3.0. Ứng với mỗi đề tài tạo view cho biết: tên đề tài, tên sinh ven tham gia, tên giao viên
hướng dẫn
create view DeTai
as
select TenDT, SinhVien.HoTen, GiaoVien.HoTen
from SinhVien, GiaoVien,DeTai
where
3.1. Ứng với mỗi mỗi giáo viên cho biết tên của các đề tài hướng dẫn
create view view1
as
select HoTen, TenDT
from GiaoVien,DeTai, GiaoVien_DeTai
where GiaoVien.MaGV=GiaoVien_DeTai.MaGV and
DeTai.MaDT=GiaoVien_DeTai.MaDT
3.2. Cho biết các sinh vên có kết quả bảo vệ đề tài loại khá
create view view2
as
select * from SinhVien

where MaSV in(select MaSV from KetQua where Diem>=7)


3.3. Cho biết tên GV hướng dẫn các đề tài có kết quả bảo vệ loại khá
create view view3
as
select *from GiaoVien where MaGV in(
select MaGV from GiaoVien_DeTai where MaDT in(
select MaDT from KetQua where Diem>=7 ))
3.4. Ứng với mỗi GV cho biết số lượng các đề tài hướng dẫn
create view view4
as
select HoTen, count(MaDT) as SoLuongDT
from GiaoVien, GiaoVien_DeTai
where GiaoVien.MaGV=GiaoVien_DeTai.MaGV
group by GiaoVien.MaGV, HoTen
3.5. Ứng với mỗi SV cho biết số lượng các đề tài ma SV do tham gia
create view view5
as
select HoTen, count(maDT) as SoLuongDT
from SinhVien, SinhVien_DeTai
where SinhVien.MaSV =SinhVien_DeTai.MaSV
group by HoTen
3.6. Ứng với mỗi SV cho biết tên các đề tài mà SV đó tham gia
create view view6
as
select HoTen,TenDT from SinhVien,DeTai, SinhVien_DeTai
where SinhVien.MaSV =SinhVien_DeTai.MaSV and
DeTai.maDT=SinhVien_DeTai.MaDT
3.7. Cho biết tên các GV không tham gia hướng dẫn đề tài nào

create view view7
as
select MaGV,HoTen from GiaoVien where MaGV not in
(select MaGV from GiaoVien_DeTai)


3.8. cho biết tên của các đề tài không có SV tham gia
create view view8
as
select * from DeTai where MaDT in(select MaDT from SinhVien_DeTai)
3.9. cho biết danh sách các đề tài có cùng số lượng SV tham gia
create view view9
as
select *from DeTai
where MaDT in(select MaDT from SinhVien_DeTai group by MaDT
having count(MaSV )> all (select count(MaSV ) from SinhVien_DeTai))
3.10. cho biết ds giáo viên và số lượng SV mà GV đó hướng dẫn
create view view10
as
select GiaoVien.HoTen, count(MaSV ) as SoLuong
from GiaoVien,GiaoVien_DeTai, KetQua
where GiaoVien.MaGV=GiaoVien_DeTai.MaGV and
GiaoVien_DeTai.MaDT=KetQua.MaDT
group by GiaoVien.HoTen

CHƯƠNG 4: CHỈ MỤC
I.

Cho bảng tblSinhVien(MaSV,HoTen,Que,NgaySinh,SoCMT)


4.1 Tạo khóa chính trên cột maSV
alter table tblSinhVien_ChiMuc add constraint p_SV_CM primary key(MaSV )
4.2. Tạo chỉ mục nonclustered trên cột HoTen
create nonclustered index i_HoTen on tblSinhVien_ChiMuc( HoTen)
4.3. tạo chỉ mục nonclustered tren cột Que
create nonclustered index i_Que on tblSinhVien_ChiMuc(Que)


4.4. Tạo chỉ mục nonclustered phức hợp trên cột HoTen và Quê
create nonclustered index i_HoTen_Que on tblSinhVien_ChiMuc(HoTen,Que)
4.5. tạo chỉ mục duy nhất (unique) trên cột SoCMT
create unique index i_SoCMT on tblSinhVien_ChiMuc(SoCMT)
4.6.xem lại tất cả các chỉ mục trên bang tblSinhVien_ChiMuc
exec sp_helpindex tblSinhVien_ChiMuc
4.7. Tìm tất cả các SV có tên 'Nguyễn Văn A' bằng cách sử dụng chỉ mục dược tạo tring
câu 2
select * from tblSinhVien_ChiMuc with (index=i_HoTen)
where HoTen='Nguyễn Văn A'
4.8. Tìm tất cả các SV có que ở Hưng Yên bằng cách sử dụng chỉ mục được tạo trong câu
3
select *from tblSinhVien_ChiMuc with (index=i_Que)
where Que='Hưng Yên'
4.9. tìm tất cả các SV có tên bắt đàu bằng 'Nguyễn Văn' và có quê ở 'Hưng Yên'
select * from tblSinhVien_ChiMuc with (index=i_HoTen_Que)
where HoTen like 'Nguyễn Văn%' and Que='Hưng Yên'
4.10. xóa các chỉ mục dược tạo trong câu 2-4
drop index i_HoTen on tblSinhVien_ChiMuc
drop index i_Que on tblSinhVien_ChiMuc
drop index i_HoTen_Que on tblSinhVien_ChiMuc
4.11. Xóa ràng buộc khóa chính tại bảng tblSinhVien_ChiMuc

alter table tblSinhVien_ChiMuc drop constraint p_SV_CM
4.12. Tạo lại khóa chính trên bảng tblSinhVien_ChiMuc, trong quá trình tạo khóa chính
sử dụng tùy chọn NunClustered để SQL server, không tạo chỉ mục clustered trên chỉ mục
khóa chính (vì mặc định khi tạo khóa chính SQL tự đọng tạo chỉ mục Clustered trên cột
khóa )//////////////////////


create clustered index id_SV_CM on tblSinhVien_ChiMuc
with drop_existing
4.13. tạo chỉ mục clustered và unique trên cột SoCMT với hệ số điền đầy bằng 60
create unique clustered index id_SoCMT on tblSinhVien_ChiMuc(SoCMT)
with FillFactor=60
4.14. Tạo chỉ mục fulltext trên cột Que và ứng dụng tìm kiếm fulltext trên cột này (sử
dụng từ khóa contains và freetext)???????
exec sp_help tblSinhVien
exec sp_fulltext_database 'enable'
create fulltext catalog catalog_Que
create fulltext index on tblSinhVien(Que)
key index MaSV on catalog_Que
seletc * from tblSinhVien where contains (Que,'Hưng','Hải')
II.
Cho CSDL sau:
create table tblTacGia
(
MaTG varchar(10) constraint p_TG primary key(MaTG),
TenTG nvarchar(50),
DiaChi nvarchar(100)
)
create table tblSach
(

MaSach varchar(10) constraint p_Sach primary key(MaSach),
TuaSach nvarchar(50),
SoTrang smallint,
MaTG varchar(10) constraint f_MaTG foreign key(MaTG) references tblTacGia(MaTG),
NamXB int,
TuKhoa nvarchar(20),
NXB nvarchar(40)
)
create table ChiTietSach
(
MaSach varchar(10)
MaCaBiet nvarchar(50) constraint p_CTS primary key,


TinhTrangSach tinyint,
TinhTrangPhucVu tinyint,
)
create table tblSachTG
(
MaSach varchar(10),
MaTG varchar(10)
constraint p_Sach_TG primary key(MaSach,MaTG),
)
create table tblDocGia
(
SoThe varchar(10) constraint p_DG primary key(SoThe),
HoTen nvarchar(50),
DVCT nvarchar(100)
)
create table tblSachMuon

(
SoThe varchar(10),
MaCaBiet nvarchar(50)
constraint p_SachMuon primary key(SoThe,MaCaBiet ),
constraint f_MaCaBiet foreign key (MaCaBiet ) references ChiTietSach(MaCaBiet ),
NgayMuon datetime ,
NgayPhaiTra datetime,
NgayTra datetime
)
4.15. hãy tạo chỉ mục cho các bảng sao cho các thao tác tìm kiếm, cập nhật tối ưu, biết
rằng:
Ta thường xuyên tìm kiếm theo tựa đè sách, tên TG, từ khóa, NXB hoặc kết hợp các tiêu
chí đó
Ta thường xuyên tìm kiếm độc giả theo: số thẻ, họ tên
create nonclustered index id_TacGia on tblTacGia (TenTG)
create nonclustered index id_Sach on tblSach(TuaSach ,TuKhoa, NXB)
create nonclustered index id_DocGia on tblDocGia(SoThe, HoTen)
4.16. Tạo các ràng buộc khóa ngoại trên các bảng sau:
alter table tblSachTG add constraint f_Sach_TG1 foreign key(maTG) references
tblTacGia(MaTG)
alter table tblSachTG add constraint f_SachTG_Sach foreign key(MaSach ) references
tblSach(MaSach )


alter table ChiTietSach add constraint f_CTS_Sach foreign key(MaSach) references
tblSach(MaSach )
alter table tblSachMuon add constraint f_SachMuon_DG foreign key (SoThe) references
tblDocGia(SoThe)
4.17. tạo các ràng buộc sau
trong bảng tblSach trường SoTrang>0

alter table tblSach add constraint check_SoTrang check(SoTrang>0)
- trong bảng tblSach trường NamXB phải nhỏ hơn năm hiện tại
alter table tblSach add constraint check_NamXB check(NamXB - trong bảng tblSachMuon trường NgayPhaiTra>=NgayMuon
alter table tblSachMuon add constraint check_Ngay check(NgayPhaiTra>=NgayMuon)
-

trong bảng tblSachMuon trường NgayTra>=NgayMuon

alter table tblSachMuon add constraint check_Muon_Tra check(NgayTra>=NgayMuon)

CHƯƠNG 5: STORED PROCEDURE
I.

Thủ tục lưu trữ với các tham số đầu vào

5.1. Viết thủ tục lưu trữ có tham số đầu vào là xâu kí tự, thủ tục này sẽ trả về đề tài có mã
tương ứng, tham số của thủ tục là: Tên đề tài, tên sinh viên tham gia, tên giáo viên hướng
dẫn
1. Tạo hàm:
create proc Pro_5_1
@TenDeTai nvarchar(100) output,
@TenSinhVien nvarchar(50)output,
@TenGiaoVien nvarchar(50)output,
@MaDeTai nvarchar(10)
as
begin


if exists (select MaDT from DeTai where MaDT=@MaDeTai)

begin
select GiaoVien_DeTai.MaGV,SinhVien_DeTai.MaSV
,TenDT,SinhVien.HoTen,GiaoVien.HoTen
from GiaoVien_DeTai,DeTai,SinhVien_DeTai,SinhVien,GiaoVien
where SinhVien_DeTai.MaDT=GiaoVien_DeTai.MaDT and
GiaoVien_DeTai.MaDT=DeTai.MaDT and SinhVien.MaSV=SinhVien_DeTai.MaSV
and GiaoVien.MaGV=GiaoVien_DeTai.MaGV
end
else
print 'Không tồn tại'
end
2. Thực thi:
declare @TenDeTai nvarchar(100)
declare @TenSinhVien nvarchar(50)
declare @TenGiaoVien nvarchar(50)
declare @MaDeTai nvarchar(10)
exec Pro_5_1 'DT01',@TenDeTai output,@TenGiaoVien output, @TenSinhVien output
if @TenDeTai=''
print @TenDeTai +'do'+ @TenGiaoVien +'hướng dẫn gồm các SV'+ @TenSinhVien
else
print 'Không tồn tai'
5.2. Viết thủ tục lưu trữ với tham số đầu vào là 1 số nguyên, thủ tuc này sẽ trả về các SV
có KQ bảo vệ đề tài nhỏ hơn giá trị của tham số thủ tục
create proc Pro_5_2
@Diem float ,
@MaSV nvarchar(10) output,
@HoTen nvarchar(50) output,
@DiaChi nvarchar(100) output,
@Lop nvarchar(20) output
as

begin
if exists (select MaSV from KetQua where Diem=@Diem)
begin
select @MaSV =MaSV ,@HoTen=HoTen ,@DiaChi=DiaChi,@Lop=Lop
from SinhVien
end
else
print 'không có'


end
5.3. Viết thủ tuc lưu trữ có tham số la 1 xâu kí tự, thủ tuc này sẽ trả về số lượng các đề tài
hướng dẫn của GV có mã bằng tham số của thủ tục
create proc Pro_5_3
@MaGV varchar(10),
@SoLuongDT int output
as
begin
if exists (select MaGV from GiaoVien_DeTai where MaGV=@MaGV)
begin
select @SoLuongDT=count(MaDT) from GiaoVien_DeTai group by MaGV
end
else
print 'Không có'
end
5.4. Viết thủ tuc lưu trữ có tham số la 1 xâu kí tự, thủ tuc này sẽ trả về số lượng các SV
tham gia DT có mã bằng tham số của thủ tục
create proc Pro_5_4
@MaDT nvarchar(10),
@SoLuongSV int output

as
begin
if exists (select MaDT from SinhVien_DeTai where MaDT=@MaDT)
begin
select @SoLuongSV=count(MaSV ) from SinhVien_DeTai group by MaDT
end
else
print ' Không có'
end
5.5. Hãy thêm cột XepLoai vào bảng KetQua và viết thủ tục lưu trữ cập nhật xếp loại cho
cột xếp loại theo công thức
Điểm<5: Yếu
Điểm >=5 và Điểm<7: Trung Bình
Điểm >=7 va Điểm<8: Khá
Điểm>=8: Giỏi
-

Chèn thêm cột XepLoai vào bảng KetQua:


alter table KetQua add XepLoai nvarchar(10)
- Viết thủ tục:
create proc Pro_5_5
as
begin
declare cur_XepLoai cursor scroll for
select Diem,
case
when Diem < 5 then 'Yếu'
when Diem >= 5 and Diem <7 then 'Trung Bình'

when Diem >= 7and Diem <8 then'Khá'
when Diem >= 8 then 'Giỏi'
end as XepLoai
from KetQua
open cur_XepLoai
declare @XL nvarchar(15)
declare @Diem float
fetch first from cur_XepLoai into @Diem,@XL
begin
update KetQua set XepLoai=@XL
where Diem=@Diem
fetch next from cur_XepLoai into @XL
end
close cur_XepLoai
deallocate cur_XepLoai
end
5.6. hãy bổ sung cột SoLuong vào bảng DeTai và viết thủ tục lưu trữ để cập nhật cột
SoLuong của bảng DeTai bằng số SV tham gia đề tài đó
- Bổ sung cột SoLuong vào bảng DeTai:
alter table DeTai add SoLuong int
- Viết thủ tục
create proc Pro_56
as
begin
declare cur_SLSV cursor scroll for
select DeTai.MaDT, SoLuong=count(SinhVien_DeTai.MaSV )
from DeTai left join SinhVien_DeTai
on DeTai.MaDT=SinhVien_DeTai.MaDT
group by DeTai.MaDT



open cur_SLSV
declare @MaDT nvarchar(20)
declare @SoLuong int
fetch first from cur_SLSV into @MaDT, @SoLuong
update DeTai set SoLuong=0
begin
update DeTai set SoLuong=@SoLuong
where MaDT=@MaDT
fetch next from cur_SLSV into @SoLuong
end
close cur_SLSV
deallocate cur_SLSV
end
II. Thủ tục lưu trữ với tham số đầu ra
5.7. Đưa vào tên giáo viên, trả về số lượng các GV có cùng tên
nếu k có GV nào cùng tên như vậy thì trả về 0
create proc Pro_5_7
@TenGiaoVien nvarchar(50),
@SoLuongGV int output
as
begin
if exists (select HoTen from GiaoVien where HoTen=@TenGiaoVien)
begin
select count(MaGV) from GiaoVien where HoTen=@TenGiaoVien
end
else
return 0
end
5.8. Đưa vào MaDT cho biết điểm của đề tài đó, nếu k tìm thấy đề tài tương ứng thì trả về

-1
create proc Pro_5_8
@MaDT nvarchar(10),
@Diem float output
as
begin
if exists (select MaDT from KetQua where MaDT=@MaDT)
begin
select Diem from KetQua where MaDT=@MaDT
end


else
return -1
end

CHƯƠNG 6: TRIGGER
I: Cho CSDL sau:
SinhVien(MaSV,HoTen,DiaChi, Lop)
HocVi(MaHV,TenHV)
DeTai(MaDT,TenDT)
SinhVien_DeTai(maSV,MaDT)
GiaoVien_DeTai(maGV,MaDT)
GiaoVien(MaGV,HoTen,DiaChi,MaHV)
KetQua(MaSV ,MaDT,Diem)
6.1. Viết trigger để không cho phép xóa học vị khi vẫn đang có GV có học vị đó
create trigger DeLeTeHocVi
on HocVi
for Delete
as

if exists (select Deleted.MaHV from Deleted where MaHV in(select MaHV from
GiaoVien))
begin
print 'không thể xóa học vị này vì nó được tham chiếu ở bảng GaaoVien'
Rollback Transaction
end
6.2. viết trigger để khi xóa 1 SV thì xóa tất cả các đè tài ma SV đó đang nghiên cứu
create trigger DeleteSV
on SinhVien_DeTai
for Delete
as
if exists (select Deleted.MaSV from Deleted where MaSV in(select MaSV from
SinhVien_DeTai) )
begin


Delete from SinhVien_DeTai where MaSV in(select Deleted.MaSV from Deleted)
print 'xóa thành công'
end
6.3. Viết trigger thiết lập ràng buộc sau
1. nếu Gv có học vị là tiến sĩ thì có thể hướng dẫn tối đa 4 đề tài
2. nếu Gv có học vị thạc sĩ thì có thể hướng dẫn tối đa 3 đề tài
3. nếu giáo viên có học vị kĩ sư thì có thể hướng dẫn tối đa 2 đề tài
4. nếu Gv có học vị khác các học vị trên thì không được hướng dẫn đề tài nào
create trigger Insert_1
on GiaoVien_DeTai
for insert
as
declare @MaGV varchar(10)
declare @TenHV varchar(10)

declare @SoLuong int
set @MaGV=(select MaGV from Inserted)
set @TenHV=(select TenHV from HocVi where MaHV in(select MaHV from GiaoVien
where MaGV=@MaGV))
set @SoLuong =(select count(MaDT) from GiaoVien_DeTai where MaGV =@MaGV)
if(@SoLuong>4 and @TenHV='Tiến Sĩ')
begin
print 'không thực hiện được. Tiến sĩ thì có thể hướng dẫn tối đa 4 đề tài'
rollback transaction
end
if(@SoLuong >3 and @TenHV='Thạc Sĩ')
begin
print 'Thạc sĩ thì có thể hướng dẫn tối đa 3 đề tài'
rollback transaction
end
if(@SoLuong >2 and @TenHV='Kĩ Sư')
begin
print 'kĩ sư thì có thể hướng dẫn tối đa 2 đề tài'
rollback transaction
end
if(@TenHV !='Tiến Sĩ' or @TenHV!='Thạc Sĩ'or @TenHV!='Kĩ Sư')
begin
print 'không thể hướng dẫn đề tài'
rollback transaction
end
6.4. viết trigger để khi thay đổi mã GV thì thay đổi thông tin mã Gv ở các bảng liên quan
create trigger Trigger_6_4


on GiaoVien

for update
as
begin
update GiaoVien set MaGV=(select MaGV from inserted ) where MaGV =(select MaGV
from Deleted )
print 'update thành công'
end
6.5. Viết 1 trigger để 1 đề tài không có quá 3 SV tham gia nghiên cứu
create trigger trigger_5
on SinhVien_DeTai
for Insert
as
declare @MaSV nvarchar(10)
declare @SoLuong int
set @MaSV =(select MaSV from Inserted )
set @SoLuong =(select count (MaSV ) from SinhVien_DeTai where MaSV =@MaSV )
if(@SoLuong>3)
begin
print '1 DT chỉ có thể có 3 SV tham gia '
rollback transaction
end
6.6. Viết trigger để khi xóa SV thì xóa kết quả bảo vệ của SV đó
create trigger Delete_KQ
on KetQua
for Delete
as
if exists (select Deleted.MaSV from Deleted where MaSV in(select MaSV from
SinhVien))
begin
Delete from KetQua where MaSV in(select Deleted.MaSV from Deleted)

print 'xóa thành công'
end
II: Cho CSDL sau:
KhoSach(MaKho,TenKho)
Sach(MaSach ,TenSach,NhaXB,SoTrang, NamXB )
Sach_CaBiet(MaSach ,MaCB,MaKho)


6.6. Viết trigger để không cho phép xóa kho khi vẫn còn sách trong kho
create trigger trigger_6
on KhoSach
for Delete
as
declare @SoLuong int
declare @MaKho nvarchar(50)
set @MaKho=(select MaKho from Deleted)
set @SoLuong=(select count(MaSach) from Sach_CaBiet where MaKho=@MaKho)
if(@SoLuong>0)
begin
print 'không thể xóa kho vì trong kho vẫn còn sách'
rollback transaction
end
6.7. Không cho phép thêm 1 sách mới hay sửa chữa 1 sách mà namXB nhỏ hơn năm hiện
tại
create trigger trigger_6_7
on Sach
for insert
as
if exists (select Inserted.NamXB from inserted where Inserted.NamXB begin

print 'không thể sửa'
rollback transaction
end
6.8. Hai kho có mã khác nhau thì không thể có tên kho giống nhau
create trigger trigger_6_8
on KhoSach
for Insert
as
if exists (select TenKho from Inserted )
begin
print 'Không được cùng tên kho'
rollback transaction
end


CHƯƠNG 7: QUẢN LÍ USER VÀ SECURITY
7.1. Hãy đăng nhập vào SQL Server bằng tài khoản sa(tài khoản có đặc quyền to nhất)
7.2. Tạo ra 2 CSDL: test và sach với các bảng tùy ý
7.3. Tạo ra các tài khoản dăng nhập(bằng cách sử dụng câu lệnh SQL và Enterprise
Manager ):
'sv1','sv2','sv3','sv4','sv5','sv6','gv1','gv2','gv3','gv4','admin1','admin2'
với mật khẩu tùy ý, sau đó lần lượt đăng nhập thử bằng các tài khoản đã tạo

7.4. thiết lập quyền hạn cho tài khoản đăng nhập 'admin1' và 'admin2' có toàn quyền thao
tác trên CSDL
7.5. Trong CSDL Sach tạo các tài khoản NSD có tên tương ứng với tài khoản sau:
SV1 - SinhVien1
SV2 - SinhVien2
SV3 - SinhVien3
SV4 - SinhVien4

SV5 - SinhVien5
Gv1 - GV1
Gv2 - GV2
Gv3 - GV3
Gv4 - GV4

7.6. thiết lập quyền hạn cho tất cả mọi người sử dụng trong CSDL Sach đều có quyền đọc
dữ liệu trên tát cả các bảng

7.7. Tạo ra nhóm 'GiaoVien1','GiaoVien2', 'SinhVien' trong CSDL Sach

7.8. Phân quyền cho nhom 'GiaoVien1' trong CSDL Sach có tát cả ác quyền trên các bảng


7.9. phân quyền cho nhóm 'GiaoVien2' trong CSDL Sách có quyền chèn thêm dữ liệu,
đọc dữ liệu nhưng không cho phepsuar và xóa dữ liệu

7.10. Phân quyến cho nhóm 'SinhVien1' trong CSDL Sách có quyền chèn, đọc, sửa dữ
liệu trên 1 bảng nào đó, nhưng không có quyền chèn, sửa, xóa dữ liệu trên các bảng khác

7.11. Thêm NSD 'gv1', 'gv2' vào nhóm 'GiaoVien1' bằng cả 2 cách
7.12. Thêm NSD 'gv3','gv4' vào nhóm 'GiaoVien1'
7.13. SD 'SinhVien1', 'SinhVien2', 'SinhVien3', 'SinhVien4', 'SinhVien5' vào nhóm
'SinhVien'

7.14. Đăng nhập thử bằng các tài khoản trên sau đó thử thực hiện 1 thao tác mà NSD đó
không có quyền,
chẳng hạn khi đăng nhập bằng tài khoản 'gv3' hãy thử sửa, xóa lại các bản ghi trong 1
bảng nào đó


7.15. Tìm hiểu cách kết nối CSDL với VB6 thông qua ví dụ sau:
-Giả sử CSDL có tên 'SinhVien'
-Trong CSDL 'SinhVien' có bảng tblSinhVien như sau:
tblSinhVien(MaSV varchar(10), HoTen varchar(100))


×