Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

--Cu1: --Vit th tc lu tr c tn sp_DTB vi m t nh sau: -Tham s u vo: MaSV -Tham s u ra: im trung bnh chung ca sinh vin c MaSV

trn. --Yu cu: kim tra MaSV c tn ti trong bng KetQua, nu vi phm th a ra --thng bo li. create proc sp_dtb (@ma char(6)) as begin declare @masv char(6),@diemtb float if exists ( select masv from KetQua ) begin select @masv=masv, @diemtb=round(AVG(diem),1) from KetQua group by masv having masv=@ma print @ma +N' c im trung binh la:'+ cast(@diemtb as char(6)) end else raiserror( 'ma sinh vien khong ton tai',16,1) end go -- thuc thi thu tuc exec sp_dtb 'sv0001' exec --Cu 2: -To trigger cho hnh ng chn d liu vo bng Khoa v MonHoc, -- kim tra cc rng buc ton vn sau: -S CBGD ca mi khoa phi ln hn 10 ngi -M mn hc (6 k t) phi tun theo qui tc sau: 2 k t u l MH, -- 4 k t sau biu th s k t. V d: MH0001 --Nu khng tha mn rng buc trn th hy hnh ng chn. --trigger 1 create trigger KTSlgv_khoa on khoa for insert as begin declare @socbgd int 1

select @socbgd =socbgd from inserted if (@socbgd<10) begin print 'so luong gv cua khoa phai >10' rollback tran end else print 'chen thanh cong' end ---kch hot trigger insert into khoa values ('dl', N'ng lc', 9) insert into khoa values ('dl', N'ng lc', 19) --trigger 2 create trigger kt_mamh on monhoc for insert as begin declare @2kt char(2),@s1 char(1),@s2 char(1), @s3 char(1), @s4 char(1) select @2kt=left(mamh,2) from inserted select @s1=substring(mamh,3,1) from inserted select @s2=substring(mamh,4,1) from inserted select @s3=substring(mamh,5,1) from inserted select @s4=substring(mamh,6,1) from inserted if (@2kt='MH' and @s1 in (0,1,2,3,4,5,6,7,8,9) and @s2 in (0,1,2,3,4,5,6,7,8,9) and @s3 in (0,1,2,3,4,5,6,7,8,9) and @s4 in (0,1,2,3,4,5,6,7,8,9)) print 'chen hop le, ma mon hoc thoa man' else begin print 'khong thanh cong' rollback tran end end --insert into monhoc values('mh0007', N'trit hc', 30,10) insert into monhoc values('mh009u', N'trit hc', 30,10) insert into monhoc values('mt0090', N'trit hc', 30,10)

DNG BI THI 2

Cho CSDL QLBH gm cc bng sau: LoaiSanPham (MaLoaiSP: nvarchar(10), TenLoaiSP : nvarchar(15), MoTa : nvarchar (16)) SanPham (MaSP: nvarchar(10), TenSP: nvarchar(40), HinhSP nvarchar(50), MaNhaCC: nvarchar(10), MaLoaiSP: nvarchar(10), DVT nvarchar(20), DonGia: smallint, SoLuong: smallint, SoLuongTT: smallInt, Discontinued: bit) NhaCungCap (MaNhaCC: nvarchar(10), TenNhaCC: nvarchar(40), DiaChi: nvarchar(60), Phone: nvarchar(24), Fax: nvarchar(24), Hompage: nvarchar (16)) Cu 1:Vit cc cu lnh T-SQL thc hin cc yu cu sau: a) Hin th danh sch cc sn phm vi y cc thng tin sau: Loi sn phm, m sn phm, tn sn phm sp xp gim dn theo tn sn phm SELECT l.*, s.masp, s.tensp From loaisanpham l, sanpham s Where l.maloaisp=s.maloaisp Order by s.tensp desc b) Lit k cc loi sn phm v s sn phm thuc loi sn phm SELECT l.maloaisp, l.tenloaisp, count(s.masp) as slsp From loaisanpham l, sanpham s Where l.maloaisp=s.maloaisp Group by l.maloaisp, l.tenloaisp c) Lit k cc sn phm trong kho m s lng mc ti thiu. Cc thng tin gm: M loi sn phm, tn sn phm, m sn phm, s lng trong kho v s lng mc ti thiu Select maloaisp, masp, tensp, soluong, soluongtt From sanpham Where soluong=soluongtt d) Lit k cc sn phm v s lng cc sn phm thuc loi sn phm ny mc ti thiu Select masp, tensp, soluong From sanpham Where soluong=soluongtt e) Lit k nhng nh cung cp v s sn phm do h cung cp Select c.manhacc, c.tennhacc, sum(s.soluong) as slsp From nhacungcap c, sanpham s Where c.mamhacc=s.manhacc Group by c.manhacc, c.tennhacc f) Lit k cc loi sn phm c ti a 10 sn phm SELECT l.maloaisp, l.tenloaisp, count(s.masp) as slsp From loaisanpham l, sanpham s Where l.maloaisp=s.maloaisp Group by l.maloaisp, l.tenloaisp Having count(s.masp) =10

Cu 2:Th tc lu tr - Store Procedure Vit th tc lu tr c tn sp_SoLuongSP c m t nh sau: Tham s vo: MaNhaCC. Tham s ra: s lng tt c sn phm ng vi m nh cung cp .

Yu cu: Kim tra MaNhaCC c tn ti trong bng SanPham, nu vi phm th thng bo li. Create proc sp_SoLuongSP (@manhacc nvarchar(10)) as Begin Declare @macc nvarchar(10) Declare @sl int If exists (select manhacc from sanpham, nhacungcap.manhacc=sanpham.manhacc) nhacungcap where

begin Select Manhacc, @sl=sum(soluong) From sanpham Where manhacc=@manhacc Group by Manhacc Print nha cc+ + @manhacc+ co tong sl sp la + cast (@sl as varchar(3)) End Else begin Print Ma nha cc nay khong ton tai return end end Cu 3 Trigger Vit trigger cho hnh ng chn d liu trn bng SanPham. Bit rng: ch c php chn thng tin sn phm khi tn ti MaNhaCC v MaLoaiSP cung cp hng. Nu khng tha mn iu kin trn th hy hnh ng chn. create trigger kt_maCC_maLoaiSP on sanpham for insert as begin if exists (select inserted.maloaisp from inserted, loaisanpham where loaisanpham.maloaisp=inserted.maloaisp) if exists (select inserted.manhacc from inserted, nhacungcap 4

where nhacungcap.manhacc=inserted.manhacc) print 'chen hop le, ma mon hoc thoa man' else begin print 'khong thanh cong' rollback tran end end

Cc v d trn lp

use QLSV select * from kq select * from lop select * from sv select * from mh --vd1: hien thi thong tin cua cac sv ho nguyen select * from sv where ht like 'nguyen %' --vd2: hien thi thong tin cua 2 sv ho nguyen dau tien select top 2 * from sv where ht like 'nguyen %' --vd3: hien thi thong tin cua sv: masv, ht, tuoi select masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh) from sv -select masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh) from sv order by YEAR(getdate())-YEAR(ngaysinh) --vd4: thong tin cua 1 sinh vien co dieml1 cua cac mon >=8, --masv, ht, dieml1 select top 1 sv.masv, ht, dieml1 from sv, kq where sv.masv =kq.masv and kq.dieml1>=8

--TOP (expression) [PERCENT] [ WITH TIES ] select top 4 masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh) from sv -select top 4 WITH TIES masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh) from sv order by YEAR(getdate())-YEAR(ngaysinh) desc -select * from mh --vd5: hien thi thong tin cuA CAC mh co stc cao nhat --c1: select mamh, tenmon, sotc as maxstc from mh where sotc>=all(select sotc from mh) --c2 select top 1 with ties mamh, tenmon, sotc from mh order by sotc desc --vd6: tinh so luong sv cua CSDL select count(masv) as slsv from sv --vd7: tinh so luong sv cua moi lop --malop, tenlop, slsv select lop.malop,tenlop, slsv= count(masv) from lop left join sv on lop.malop=sv.malop group by lop.malop,tenlop --c2 select lop.malop,tenlop, slsv= count(masv) from lop , sv where lop.malop=sv.malop group by lop.malop,tenlop --vd8 hien thi slsv cua lop --co cac ma '101091' va '601112' --c1 select lop.malop,tenlop, slsv= count(masv) from lop left join sv on lop.malop=sv.malop where lop.malop ='101091' or lop.malop= '601112' group by lop.malop,tenlop --c2 select lop.malop,tenlop, slsv= count(masv) from lop left join sv on lop.malop=sv.malop where lop.malop in ('101091','601112') group by lop.malop,tenlop --vd9: tinh diem tbl1 thuoc ki 1 cua moi sv --masv, ht, diemtbl1 select sv.masv ,ht, diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2) from sv, kq, mh where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1 group by sv.masv ,ht --vd10: hien thi thong tin cua cac sv co diemtbl1 thuoc --ki 1>=6.6 select sv.masv ,ht, diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2) from sv, kq, mh where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1

group by sv.masv ,ht having round(SUM(dieml1*sotc)/SUM(sotc),2)>=6.6 ---vd11: hien thi thong tin cua cac sv co diemtbl1 cao nhat --thuoc ki 1 select top 1 with ties sv.masv ,ht, diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2) from sv, kq, mh where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1 group by sv.masv ,ht order by round(SUM(dieml1*sotc)/SUM(sotc),2) desc --vd12: hien thi: slmh, sumsotc, avgsotc, maxsotc, minsotc select COUNT(mamh) as slmh,SUM(sotc) as sumsotc, avg(sotc) as avgsotc, MAX(sotc) as maxsotc, MIN(sotc) as minsotc from mh --vd13: hien thi tt cua sv: masv, ht, gt --va thong ke slsv trong bang sv select masv, ht, gt from sv compute count(masv) -select * from mh --compute count(mamh),sum(sotc), max(sotc), avg(sotc), min(sotc) compute max(sotc) -select MAX(sotc) from mh --vd14 --group by: --vd7: tinh so luong sv cua moi lop --malop, tenlop, slsv select lop.malop,tenlop,slsv= count(masv) from lop , sv where lop.malop=sv.malop group by lop.malop,tenlop --compute by select lop.malop,tenlop, sv.masv, ht from lop , sv where lop.malop=sv.malop order by lop.malop,tenlop compute count(sv.masv) by lop.malop,tenlop --vd15 select sv.masv ,ht, diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2) into kqsv from sv, kq, mh where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1 group by sv.masv ,ht --Hien thi thong tin cua bang kqsv: masv, ht, diemtbl1, hocluc select masv, ht, diemtbl1, hocluc= case when diemtbl1>=9 then 'xuat sac' when diemtbl1>=8 then 'Gioi' when diemtbl1>=7 then 'Kha' when diemtbl1>=6 then 'TB' else 'Kem' end

from kqsv --vd16: 2 bang sv, sv2 co cau truc giong nhau --tren 3 cot: masv, ht, gt --yeu cau: chen 2 ban ghi dau tien cua --bang sv vao bang sv2 insert into sv2 select top 2 masv, ht, gt from sv -select * into svtam from sv --sua (thay doi) que cua sv co ma sv01 thanh hai duong update svtam set qq='Hai duong' where masv='sv01' --sua thong tin ve qq cua 3 sv dau tien trong ds thanh 'Ninh Binh' update top (3) svtam set qq='Ninh Binh' --xoa thong tin cua cac sv nu khoi bang svtam delete from svtam where gt='nu' --xoa tt cua 4 sv dau tien trong bang svtam delete top (4) from svtam select * from svtam ----Phan hang rank() --vd1: phan hang mon hoc theo sotc select mamh, tenmon,sotc, Rank() over (order by sotc) as rank_sotc from mh -select mamh, tenmon,sotc, Rank() over(partition by sotc order by mamh) as ranks from mh --- phan hang theo vung Select masv, HT, YEAR(ngaysinh) AS namsinh, GT, rank()over (partition by gt order by YEAR(ngaysinh) desc) as xephang from SV --Select masv, HT, YEAR(ngaysinh) AS namsinh, GT, rank()over (partition by masv order by YEAR(ngaysinh) desc) as xephang from SV --vd2: xep hang theo tuoi cua sv dua vao DENSE_RANK select masv, ht, datediff(yy, ngaysinh,getdate())as tuoi ,DENSE_RANK() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'XHANG_DENSE_RANK' FROM sv --where datediff(yy, ngaysinh, getdate()) is not null

--VD3:phn hng theo tui dng hm row_number() select masv, ht, datediff(yy, ngaysinh, getdate())AS TUOI

,ROW_NUMBER() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Row Number' FROM sv --vd4: phan hang voi ham NTILE select masv, ht, datediff(yy, ngaysinh, getdate())as tuoi ,NTILE(7) OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Quartile' FROM Sv -- truy van co tat cac cac hm phan hang select masv, ht, datediff(yy, ngaysinh, getdate())as tuoi ,ROW_NUMBER() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Row Number' ,RANK() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Rank' ,DENSE_RANK() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Dense Rank' ,NTILE(5) OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Ntile' FROM sv where datediff(yy, ngaysinh, getdate()) is not null --select @@VERSION select masv, hoten, ROW_NUMBER() OVER (ORDER BY masv) AS 'Row Number' from sv --select masv, mamh, dieml1, RANK() OVER (ORDER BY dieml1) AS 'Rank' from kq order by masv --khai bao bien declare @i int set @i=100 print 'gt i='+cast(@i as char(5)) print @i

th tc
-vd2: vit th tc lu c tc dng nhp d liu vo bng lop -- bit rng thng tin cn nhp c truyn thng qua cc tham s create proc sp_nhaplop (@mal char(10), @tenl nvarchar(30)) as begin insert into lop values(@mal, @tenl) end ---, create proc chenSV ( @malop char(10), @Masv char(10), @Hoten nvarchar(50), @NS datetime, @QQ nvarchar(50), @kqht float )as begin if(exists (select Malop from lop where malop =@malop)) insert into sv values (@malop, @masv, @hoten,@ns, @qq, @kqht) else print Khng chn c end

---exec sp_nhaplop '101131', 'Tk11.3' select * from lop --vd3: vit th tc lu c tc dng tnh s lng sv ca mt lp -- bit rng, th tc ny c tham s truyn vo l m lp create proc sp_slsv (@malop char(10)) as begin select lop.malop, COUNT(sv.masv)as sl from lop left join sv on lop.malop =sv.malop group by lop.malop having lop.malop =@malop end --exec sp_slsv '101091' --alter proc sp_slsv (@malop char(10)='101091') as begin declare @ma char(10),@ssv int select @ma=lop.malop, @ssv=COUnT(sv.masv) from lop left join sv on lop.malop =sv.malop group by lop.malop having lop.malop =@malop print 'm lp:'+@ma +'c s sv l:'+ cast(@ssv as char(3)) end --exec sp_slsv exec sp_slsv '101131'

---vd4 create proc dieml1 @masv char(10) as select sv.masv, sum(dieml1*sotc)/sum(sotc) as dtbl1 from sv, mh, diem where sv.masv= diem.masv and diem.mamon= mh.mamon and sv.masv=@masv group by sv.masv -----V du: tra ve so ngy trong thng khi biet thng v nam --VD2: Create Proc spr_Days (@Thang Int, @Nam Int) As Declare @SN Int Set @SN = Case When @Thang In (1,3,5,7,8,10,12) Then 31 When @Thang In (4,6,9,11) Then 30 When @Nam % 4 = 0 Then 29 Else 28 End --Return @SN print @sn Go exec spr_Days 2, 2012 exec spr_Days 2, 2013

10

----V du: TINH TONG S = 1 + 3 + 5 + + (2N-1) alter Proc TongLe ( @N int ) AS DECLARE @I int, @S int SET @I = 1 SET @S = 0 WHILE @I <= 2*@N -1 BEGIN --WAITFOR DELAY '00:00:00.001' Set @S = @S + @I Set @I = @I + 2 END --Return @S print @S exec TongLe 5 ---xa th tc lu drop proc sp_nhaplop ----vd3_tong 2 so, co tham so output create procedure Tong_Output @a int, @b int, @c int output as select @c = @a + @b print @c

Trigger
--vd2--trigger cho su kien insert tren bang tt t/m: -- moi de tai co toi da 3 sv tham gia CREATE trigger sLsv_dt on tt for insert as begin if((select count (t1.masv) from tt as t1, inserted t2 where t1.madt =t2.madt)<=3) BEGIN print 'da nhap du lieu thanh cong' end else begin print 'Khong the co qua 3 sv tham gia 1 de tai' rollback tran end end go --kiem tra trigger use ttsv SELECT * FROM tt ORDER BY Madt SELECT * FROM sv SELECT * FROM dt -insert into tt 11

values('sv6','dt2','Hung Yen', 7.8) -insert into tt values('sv5','dt1','lo cai', 7.8) ----sua trigger alter trigger sosv_dt on tt for insert as begin if((select count (t1.masv) from tt as t1, inserted t2 where t1.madt =t2.madt)<=3) BEGIN print 'da nhap du lieu thanh cong' --lay thong tin ve ten de tai declare @tdt varchar(30), @sosv int select @tdt=t1.tendt from dt as t1, tt as t2, inserted as t3 where t1.madt=t2.madt and t2.madt=t3.madt --lay so luong sv tuong ung select @sosv=count(t1.masv) from tt as t1, inserted t2 where t1.madt=t2.madt ---in: ten dt, soluong sv print 'De tai: '+@tdt +' hien co: '+cast(@sosv as varchar)+ ' sinh vien' end else begin print 'Khong the co qua 3 sv tham gia 1 de tai' rollback tran end end go --VD3: khong cho phep sua du lieu cua --cot hoten trong bang sV select * from sv update sv set GT='NU' where masv='sv03' --SELECT * FROM SV --create TRIGGER NoUpdateHT ON sV FOR UPDATE AS IF UPDATE (HT) BEGIN PRINT 'Khong duoc UPDATE tren cot ht' ROLLBACK TRANSACTION END ---kiem tra trigger update sv 12

set ht='tran thi anh' where masv='sv2' ---vi du 4: viet trigger cho su kien xoa du lieu tren --bang lop --thi thong tin lien quan cung bi xoa theo -ALTER TABLE DT ALTER COLUMN MADT NCHAR(10) NOT NULL ALTER TABLE DT ADD CONSTRAINT DT_P PRIMARY KEY(MADT) drop trigger deletelop exec sp_helptext xoa_lop SELECT * FROM LOP SELECT * FROM SV create trigger deletelop on lop for delete as begin if(@@rowcount <=0) print 'khong co lop nao trong bang' else begin delete sv from SV as s, deleted as d where s.malop=d.malop end end go --delete from lop where malop='tk71' select * from lop select * from sv EXEC SP_HELPTEXT XOA_LOP --VD5: -- viet trigger tren bang lop: --chi xoa nhung lop chua co sv --create TRIGGER xoa_ttlop ON lop INSTEAD OF delete AS BEGIN If (Select count(*) from sv, Deleted d where sv.malop=d.malop)>0 BEGIN RAISERROR ('khong xoa duoc', 16, 1) ROLLBACK TRAN END ELSE BEGIN DELETE FROM lop WHERE malop IN(SELECT malop FROM DELETED) PRINT 'xoa duoc' END 13

END GO --select * from lop select * from sv

--thu xoa delete from LOP where MALOP='101121' delete from LOP where MALOP='101104' ---vd: thc hinvic cp nht im trn ct im l1 v im l2 create TRIGGER In_up_diem ON dbo.Diem FOR INSERT, UPDATe AS --Bang diem(Masv nchar(10),Mamon chAr(10), --DiemL1 float,DiemL2 floAT) Declare @msv nchar(10) Declare @mamh char(10) declare @dl1 float declare @dl2 float -- Lay gia tri cho 4 truong Set @msv=(Select Masv from inserted ) set @mamh=(select mamon from inserted) set @dl1=(select dieml1 from inserted) set @dl2=(select dieml2 from inserted) -- TH1. Neu masv ton tai roi, thi tien hanh Update if(exists(select masv from diem where masv=@msv)) begin -- Ktra diemlan1 if(@dl1<5) Update Diem set dieml2=@dl2 where masv=@msv and mamon=@mamh else begin set @dl2=null Update Diem set dieml2 =@dl2 where Masv=@msv and mamon=@mamh end end -- TH2. Neu masv chua ton tai, -- nhap moi Insert else Begin -- kiem tra diem lan 1 if (@dl1<5) Insert into Diem values(@msv,@mamh, @dl1,@dl2) 14

else begin set @dl2 =null Insert into Diem values (@msv,@mamh,@dl1,@dl2) End end ----insert into diem values ('sv04', 'mh4',1,0) insert into diem values ('sv04', 'mh2',8,6) -update diem set dieml2=9 where masv='sv03' and mamon='mh1' -update diem set dieml2=9 where masv='sv04' and mamon='mh1'

15

You might also like