Tài liệu ôn thi, mẫu các bài tập môn cơ sở dữ liệu
Trang 1Tao cac bang trong sv
Bang lop
create table lop
( malop char(10) primary key,
tenlop nvarchar(50))
-xem cau truc
exec sp_help lop
xoa bang lop
drop table lop
tu dinh nghia ten RBTV
create table lop
( malop char(10) constraint p_lop primarykey(malop),
tenlop nvarchar(50))
create table sinhvien(
masv char(10) constraint p_sinhvien primarykey(masv),
malop char(10) foreign key (malop)
Trang 2madt char(10) constraint p_detai1 primarykey(madt),
tendt nvarchar(30),
kp float
check (kp between 5000000 and 10000000),
GVhd nvarchar(30), namtk int)
tao tt
create table tt(
madt char(10) not null,
masv char(10) not null,
ntt nvarchar(50),
kqtt float check(kqtt >=0 and kqtt<=10),
constraint p_tt primary key(madt, masv),
constraint f1_tt foreign key(madt)
sua doi cau truc bang
1 tao them cot gt, kqht vao bang sinhvien
alter table sinhvien add gt bit check(gt in (1,0))
alter table sinhvien add kqht float
2 doi kieu du lieu cua gr thanh nvarchar(3)
alter table sinhvien
drop constraint CK sinhvien gt 1DE57479 alter table sinhvien
Trang 3alter column gt nvarchar(3)
3 xoa cot
alter table sinhvien
drop column gt
4 them rang buoc tren cot kqht
alter table sinhvien
add constraint c_kqht
check (kqht between 0 and 10)
exec sp_helpconstraint sinhvien
5 Xoa rang buoc tren cot kqht
alter table sinhvien
drop constraint c_kqht
bai 22 truy van va cap nhat
22.1 Cap nhat
22.1.1 nhap du lieu, (bo sung du lieu)
select * from detai
exec sp_helpconstraint detai
chen 1 ban ghi
insert into detai1(MAdt, tendt,gvhd, kp, namtk)
values ('dt05', 'Thiết kế ccc', 'M', 5000000,2000 )insert into detai1(MAdt, tendt,gvhd, kp, namtk)
values ('dt06', 'Thiết kế mmm', 'T', 6000000, 2003)insert into detai1(MAdt, tendt,gvhd, kp, namtk)
values ('dt07', 'Thiết kế ttt', 'G', 9000000, 2004) chen nhieu ban ghi từ bảng khác sang
bang dt1 co cau truc gan giong dt
(số cột của bang dt1>= số cột của dt)
insert into detai(madt, tendt, GVhd, kp)
Trang 4select madt, tendt, gvhd, kp
from detai1
select * from detai
22.1.2.sua du lieu
select * from detai
sua kp cua dt01 thành 10 triệu
lay 2 cot trong sv:
hien thi thong tin cua sv gom: masv, ht
Select masv, ht into svtam
from SV
Trang 5
select * from svtam
hien thi thong tin cua sv: masv, ht, tuoi
select masv, ht, 'tuoi'=(year(GETDATE()) namsinh)
-from sv
sap xep tuoi tang dan
select masv, ht, 'tuoi'=(year(GETDATE()) namsinh)
-from sv
order by (year(GETDATE()) - namsinh) desc
-Hien thi sv: masv, ht, 'tuoi' co tuoi >=24
select masv, ht, 'tuoi'=(year(GETDATE()) namsinh)
-from sv
where (year(GETDATE()) - namsinh) >=24
order by (year(GETDATE()) - namsinh) desc
muon luu kq truy van vao 1 bang moi
select * from svmoi
select masv, ht into svtam
from SV
Trang 6-select * from svtam
truy van co cot moi
Thong tin cua sv: masv, ht, tuoi ( là côt mới)
select masv, ht, namsinh)
Trang 7Hien thi thong tin cua cac de tai co kp tu 6t den7t
in (not in)
hien thi thong tin cua sv co nam sinh
la mot trong cac nam: 1980,1986, 1989
select * from sv
where namsinh in (1980,1986, 1989)
select * from sv
where namsinh not in (1980,1986, 1989)
where namsinh = 1980 or namsinh=1986 ornamsinh= 1989
select 8*9
-truy van tren nhieu bang
c1: hien thi thong tin gom: masv, ht, kqht, kqtt
Trang 8from SV inner join tt on SV.MASV=tt.masv
-vd23: hien thi thong tin cua sv co kqht>kqtt,
thong tin gom: sv.masv, ht, kqht, kqtt
desc asc hien thi thong tin gom: masv, ht, namsinh
cua cac sv thuoc nhung lop dai hoc
select masv, ht, namsinh, lop.malop
Trang 9select masv, ht from svmoi
25.2 truy van long
Hien thi thong tin gom:
Masv, ht, namsinh cua cac sv thuoc lop: 'DAIHOC K1'
Trang 10select Masv, ht, namsinh
Phu định của exists là not exists
vd2 : hien thi thong tin cua cac sv tre tuoi nhat
Trang 11- vd3: hien thi thong tin cua cac sv TUOI CAO NHAT
-vi du truy van con co toan tu : any, some, all
hien thi thong tin: masv, ht cua cac sv co kqht cao nhat
Trang 12where lop.malop=sv.malop and
sv.masv =tt.masv and kqtt=
( select MAX(kqtt)
from tt
)
Toan tu some
select madt, tendt, kp from dt
where kp>=any (select kp from dt wherekp=7000000)
-distinct
select madt, tendt, kp from dt
Trang 13where kp ! < some (select kp from dt wherekp=7000000)
-tuong duong
select madt, tendt, kp from dt
where kp <> (select distinct kp from dt wherekp=7000000)
-BAI 28
VD1:dem so luong sv trong csdl
select count(masv) from sv
select count(QQ) from sv
DEM XEM Co bao nhieu tinh khácn nhau có trong cột qq
select count(distinct QQ) from sv
SELECT * FROM SV
SELECT COUNT (distinct NAMSINH) FROM SVselect distinct malop from sv
vd2:ket qua ht cao nhat
select MAX(kqht) from sv
select MAX(kqht) as kqmax, min(kqht) as kqmin, 'kqtb'=avg(kqht), 'tongkq'=sum(kqht) from sv
tuoi trung binh cua tat ca cac sv
select AVG(YEAR(getdate())-namsinh) from sv
select MIN(hiredate), MAX(hiredate)
from humanresources.Employee
select * from humanresources.Employee
-v4 : cho biet tong kinh phi cap cho tat ca cac dt
select SUM(kp) from dt
Trang 146700000+6700000+7700000+8700000+7000000+6+7000000+6000000+6000000
28.2 gom nhom
vd1: dem so luong sv cua moi lop
: malop, TENLOP, slsv (đây là tt tự đặt)
1
select LOP.MALOP,TENLOP,count(masv) as slsvfrom SV, LOP
group by LOP.MALOP,TENLOP
3
select LOP.MALOP,TENLOP, count(masv) as slsvfrom LOP LEFT JOIN sv ONLOP.MALOP=SV.MALOP
group by LOP.MALOP,TENLOP
-4 hien thi malop, slsv
select LOP.malop, count(masv) as slsv
from LOP LEFT JOIN sv ONLOP.MALOP=SV.MALOP
group by LOP.malop
Trang 15vd2: dem so lương sv tham gia moi de tai: madt, tendt, slsvtg
select dt.madt, tendt, 'slsvtg'=COUNT(masv)
from dt left join tt on dt.MAdt=tt.madt
group by dt.madt, tendt
-Hien thi thong tin cua cac dt chưa co sv nao tg C1:
from dt left join tt on dt.MAdt=tt.madt
group by dt.madt, tendt, gvhd, kp
having COUNT(masv)=0
vd3:DEM slsv cua lop co ma 'tk1', 'tk4'
th1: malop, slsv
select LOP.malop, count(masv) as slsv
from LOP LEFT JOIN sv ONLOP.MALOP=SV.MALOP
where lop.malop in('tk1', 'tk4')
Trang 16from LOP LEFT JOIN sv ONLOP.MALOP=SV.MALOP
where lop.malop in('tk1', 'tk4')
group by tenlop
th3: malop, tenlop, slsv
select LOP.malop,tenlop, count(masv) as slsv
from LOP LEFT JOIN sv ONLOP.MALOP=SV.MALOP
where lop.malop in('tk1', 'tk4')
group by LOP.malop, tenlop
having lop.malop in('tk1', 'tk4')
vd4: hien thi thong tin ve cac dt co slsv thsm
gia>=2
thong tin gom: madt, tendt, slsvtg
select dt.madt, tendt, 'slsvtg'=COUNT(masv)
from dt left join tt on dt.MAdt=tt.madt
group by dt.madt, tendt
having COUNT(masv)>=2
vd5: dt co svtg dong nhat
select dt.madt, tendt, 'slsvtg'=COUNT(masv)
from dt left join tt on dt.MAdt=tt.madt
group by dt.madt, tendt
Trang 17-vd4 dem so luong sv cua moi lop, sv co que ohy
select LOP.malop, Tenlop, count(masv) as slsv
from LOP LEFT JOIN sv ONLOP.MALOP=SV.MALOP
select sv.MASV, ht, round(avg(kqtt),1)as kqtttb
from sv left join tt on sv.MASV=tt.masv
select sv.MASV, ht, sum(kqtt) as tongkqtt
from sv left join tt on sv.MASV=tt.masv
where malop in('tk1','tk4')
group by sv.MASV, ht
vd7:hien thi thông tin cua cac lớp có sl sv>=2
select LOP.malop, Tenlop, count(masv) as slsv
Trang 18from LOP LEFT JOIN sv ONLOP.MALOP=SV.MALOP
group by LOP.malop, Tenlop
-28.3.truy van con o mênh đề from
hien thi thong tin cua lop có
sinh vien tên là 'Nguyen Mai Anh'
Trang 19-select * from svtam2
where upper(gt)='NU' and lower(qq)='hy'
Thong tin lay tu >=2 bang
c1
sinhvien.masv,hoten,year(ngaysinh) as namsinhfrom lop inner join sinhvien onlop.malop=sinhvien.malop
select s.masv, s.ht, m.tenmon, d.diem
from sv s, monhoc m, bdiem d
where s.masv=d.masv and d.mamon=m.mamon and year(s.ns) between 1987 and 1990
Trang 20masv='sv02' or masv='sv08'
cach2
where masv not in ('sv02','sv04','sv08')
order by masv desc
Dem so luong sv cua moi lop: malop, slsv:tt
select lop.malop, tenlop, 'slsv'=count(masv)
from lop left join sinhvien onlop.malop=sinhvien.malop
group by lop.malop, tenlop
Dem so luong sv cua moi lop: malop, tenlop, slsv:tt tu dat
cac lop co so luong sv>3
select lop.malop, tenlop, 'slsv'=count(masv)
from lop left join sinhvien onlop.malop=sinhvien.malop
group by lop.malop, tenlop
having count(masv) >3
lop nhieu scv nhat
select lop.malop, tenlop, 'slsv'=count(masv)
from lop left join sinhvien onlop.malop=sinhvien.malop
group by lop.malop, tenlop
having count(masv) >=all
Trang 21(select COUNT(masv) from sinhvien group bymalop)
-dem xem lop tk38 co bai nhieu sv
select lop.malop, tenlop, 'slsv'=count(masv)
from lop left join sinhvien onlop.malop=sinhvien.malop
group by all lop.lopid
Dua ra thong tin cua cac lop co slsv>=4:malop,tenlop, slsv
select lop.lopid,lop.tenlop, slsv=count(sv.masv) from sv, lop
where lop.lopid=sv.lopid
group by all lop.lopid,lop.tenlop
having count(sv.masv)>=4
thong tin sv co tuoi cao nhat
select masv, hoten, noisinh,
'tuoi' =DATEDIFF(yy, ngaysinh, GETDATE())
from sinhvien
where DATEDIFF(yy, ngaysinh, GETDATE())>=all(select DATEDIFF(yy, ngaysinh, GETDATE())
Trang 22from sinhvien where noisinh is not null)
thong tin sv chua tham gia mon hoc nao
select * from sinhvien
where masv not in (select masv from diemthi)
c2
select * from sinhvien
where not exists (select * from diemthi
where sinhvien.masv=diemthi.masv)
dem so luong mon hoc
select count(mamon)as slmh
from monhoc
-tinh diem trung binh lan 1 cho cac sv
'dtb'=round(SUM(diemthi.diemlan1*monhoc.sotc)/SUM(monhoc.sotc),2)
from sinhvien s, diemthi, monhoc
diemthi.mamon=monhoc.mamon
group by s.masv, hoten
-dua ra mon hoc co sotc dung thu 2
select mamon, tenmon, sotc
- tao ra bang moi
select masv, ht, ns, qq into svtam
Trang 23from sv
drop table svtam
exec sp_helpconstraint svtam
select * from svtam
delete from svtam
declare @tam table
exec sp_help svtam
DECLARE @moi table (
ma nchar(20),
ht nvarchar(100), ngaysinh datetime,
que nvarchar(80))
delete from svtam
output deleted.* into @moi
-Hien thi thong tin gom: lopid, tenlop
cua cac sinh vien co que o 'Hy' va diem>= 8
c1
select distinct lop.lopid,lop.tenlop
from lop, sv, bdiem
where (lop.lopid=sv.lopid) and
(sv.masv=bdiem.masv) and (bdiem.diem>=8)
and (sv.qq='Hy')
Trang 24c2:select lopid,tenlop
from lop
where lopid in (select lopid
from sv where
(qq='Hy' )and masv in
(select masv from bdiem
where diem>=8))
sinh vien co tuoi cao nhat
select masv, ht, tuoi =2008- year(ns)
select * from lop
where not exists (select *
from sv
where lop.lopid=sv.lopid)
Tinh diem trung binh cho moi sv
select sv.masv, sv.ht, sv.ns,
Trang 25insert into sv2 values('sv13','Nguyen thanh')
insert into sv2 values('sv16','Nguyen Lan')
constraint pk_SachMuon primary key(masach,madocgia),
constraint fk_Sach_SachMuon foreignkey(masach)
references Sach(masach),constraint fk_Docgia_sachmuon foreignkey(madocgia)
Trang 26references Docgia(madocgia)) Sach cua tac gia “nguyen van a”
select *from Sach where tacgia='nguyen van A'
create table Sach(masach varchar(15)primarykey not null,tensach nvarchar(100),tacgianvarchar(100))
ngay muon
drop proc sp_Ngaymuon
end else
print 'Khong ton tai doc gia nay' return -1
exec sp_Ngaymuon 'dg01','s01'
Tao view
drop View Vsachmuon
create View Vsachmuon as
(select
Docgia.madocgia,docgia.tendocgia,sach.tensach,sachmuon.ngaymuon
From docgia,sach,sachmuon
Trang 27where (docgia.madocgia=sachmuon.madocgiaand sach.masach=sachmuon.masach and
tendocgia='nguyen thi bac'))
select * from Vsachmuon
Để tìm một khóa của lược đồ chúng ta có thể làm như sau:
Bước 2: Lần lượt xét các thuộc tính của siêu khóa K,
giả sử xét thuộc tính A thuộc K, ta sẽ tính bao đóng của tập (K\A), nếu (K\A) + = U thì ta sẽ gán K =K\A Và khi xét đến thuộc tính cuối cùng trong K, giá trị K cuối cùng nhận được chính là một khóa của lược đồ.
Minh họa cụ thể như sau:
Trang 28+ Xét A, tính bao đóng của (K\A), (K\A) + = (CDGH) + =
A.
+ Xét C, tính bao đóng của (K\C), (K\C) + = (ADGH) + =
vậy loại C ra khỏi K, tức là K = ADGH.
+ Xét D, tính bao đóng của (K\D), (K\D) + = (AGH) + =
K.
+ Xét G, tính bao đóng của (K\G), (K\G) + = (ADH) + =
loại G ra khỏi K K= ADH
+ Xét H, tính bao đóng của (K\H), (K\H) + = (AD) + = AD
≠ U , do vậy không loại H ra khỏi K
Kết luận: khóa của lược đồ là ADH.
b) Cho lược đồ quan hệ: =(U,F) với U=ABCDEGH
}, hãy tìm một khóa của lược đồ.
c) Cho lược đồ quan hệ =(U,F) với U=ABCDEGH
F={AG CBE, AC BCG, GDBA, ACHHE, CG BDE } hãy tìm một khóa của lược đồ.
một khóa của lược đồ.
Bài 1.6:Bài tập về tìm tất cả các khóa của lược đồ
Yêu cầu chung: Với một lượt đồ quan hệ đã biết, hãy
áp dụng thuật toán để tìm ra tất cả các khóa của lược đồ.
Trang 29Cho lược đồ quan hệ = (U, F) để tìm tất cả các khoá
B1) Xác định I
nhất là I và kết thúc thuật toán Ngược lại I+ U thì chuyển sang bước tiếp theo.
B3) Xác định N={ ( R i -L i ) sao cho L i I }
- đặt N’=(I N) + \ I ( N’ N )
- đặt B=U \N’ \ I
B4) Nếu | B |=2 (tập B chỉ gồm có hai thuộc tính), giả
sử B=B 1 B 2 khi đó lược đồ chỉ có hai khoá là IB 1 và
IB 2 , kết thúc thuật toán Ngược lại nếu | B |>2 thì chuyển sang bước tiếp theo.
B5) Tìm tất cả các tập con khác rỗng của B, ký hiệu các tập con đó là {B 1 , B 2 , B n } Tính (B i I ) + (i=1 n), nếu (B i I ) + = U thì đặt M i =B i I
B6) Khi đó M= {M 1 , M 2 , …, M h } là họ tất cả các siêu khoá của lược đồ
B7) Loại bỏ các siêu khoá không tối tiểu ra khỏi M, tức
là nếu M i M j (*) ( ij, i, j=) thì loại M j ra khỏi M Tập M thu được sau khi loại bỏ tất các phần tử thoả mãn biểu thức (*) chính là họ tất cả các khoá của lược đồ .
Nhận xét:
Trang 30- Từ một tập B gồm n phần tử ta có thể lập lên 2 n -1 tập con khác rỗng của B Cho nên dù n là một số không
bài toán tìm tất cả các khoá của lược đồ quan hệ có thể coi là một bài toán khó (vì có độ phức tạp thuật toán là hàm mũ).
- Nếu I+ U và tập B chỉ gồm hai phần tử (giả sử B=B 1 B 2 ) thì suy ra lược đồ chỉ có hai khoá là I B 1 và
I B 2
Bài tập
a) Cho lược đồ quan hệ = (U, F) với U=ABCDEGH,
cả các khoá của lược đồ
N’=(I N) + \ I =(ABCDH) + \ ABC = DH N
B=U \ N \ I = ABCDEGH \ ABC \ DH =EG
B4) Do B có hai thuộc tính, mặt khác (I ) + U nên lược
đồ đã cho có nhiều khoá, do vậy lược đồ này có hai khoá là I E =ABCE và I G= ABCG.
Trang 31b) Cho lược đồ quan hệ = (U, F) với
U=ABCDEGHQ,
F={ ABC ADH, ABGQEH, AEDG, CQEH} Hãy
tìm tất cả các khoá của lược đồ
N’=(I N) + \ I =(ABCDH) + \ ABC = DH N
B4) Do |B| >2 do vậy chúng ta sẽ chuyển sang bước 5 B5) Tập các tập con khác rỗng của B là {E, G, Q, EG,
Tương tự cho tập, ABCEG, ABCEQ, ABCGQ cũng
được thêm vào M.
B6) tập các siêu khóa của lược đồ là M = {ABCE,
ABCG, ABCQ, ABCEG, ABCEQ, ABCGQ}