NH P MÔN CSDL QUAN H So n b i b môn Công ngh ph n m m
4. BµI TËP sql
M C TIÊU C A BÀI NÀY GIÚP NG I H C ƯỜ
Hi u và phân bi t 3 nhóm l nh c a ngôn ng SQL
Gi i m t s bài t p thao tác trên quan h có s d ng 3 nhóm l nh
trên.
V n d ng gi i quy t các bài toán t ng h p. ế
A/ NH C L I LÝ THUY T
I. CÁC NHÓM L NH C A NGÔN NG SQL
Phân bi t các nhóm câu l nh sau:
- Các l nh DDL: CREATE, ALTER, DROP.
a. L nh CREATE
L nh này dùng đ t o ra các quan h nh TABLE,VIEW,INDEX ư
CREATE TABLE
-B ng là m t c u trúc c bn đ c t gi trong h th ng quan h .Có khuôn d ng hai chi u g m
có các c t và hàng.Nó là y u t c b n cho các thao tác khác nhau.Có th nói vi c t o b ng ế ơ
là b c đ u tiên quan tr ng nh t đ thi t l p CSDL.ướ ế
-Cú pháp c a l nh này:
CREATE TABLE table-name(colom_name type(size)..)
Khi t o ra b ng chúng ta ph i ch ra ki u d li u c a c t m i c t ch th môt ki u
d li u duy nh t.Khi t o b ng ta có th đ a ra các ràng bu c ư
Các ràng bu c c a các tr ng có th là : primary key,foreign key ,unique,not null ... ườ
VD:T o b ng nhân viên
CREATE TABLE NHAN_VIEN (#NV varchar(4) constraint NV_Primary key,ho_tên
Varchar(25),Ng_sinh date,ch cv varchar(20),đia_ch varchar(30).l ng number(7)); ư
trong VD trên ta t o ra m t ràng bu c là #NV đ c đ nh nghĩa là primary key ượ
-Ta cũng có th t o ra b ng m i v i c u trúc và d li u t 1 b ng khác.
Cú pháp:
CREATE TABLE TABLE_name[(colum_name..)]AS
SELECT statement;
VD:T o ra 1 b ng m i có tên là NVN (#NV,h _tên) t b ng NHAN_VIEN
CREATE TABLE NVN AS SELECT #NV,h _tên FROM NHAN_VIEN;
b. L nh ALTER
-Dùng đ ho c là thêm m t hay nhi u tr ng vào bng ho c s a đ i m t c t hi n ườ
t i.SQL ANSI chu n không cho phép hu b các c t.
-Cú pháp:
ALTER TABLE TABLE_name ADD | MODIFY | DROP option (colum Datatype..)
+ADD:thêm c t m i
+MODIFY:s a đ i c t
+DROP option xoá b các ràng bu c
VD1:thêm tr ng gia đình ki u char(1) vào R1ườ
ALTER TABLE R1 ADD gia đình char(1);
VD2:Thay đ i tr ng Đ a_ch Varchar(30) trong R1 thành Đ a_Ch (20): ườ
ALTER TABLE R1 MODIFY Đ a_Ch varchar(20);
Trang 1
NH P MÔN CSDL QUAN H So n b i b môn Công ngh ph n m m
VD3:Hu b ràng bu c tr ng khoá #NV trong R1 ườ
ALTER TABLE R1 DROP constraint NV_prim
c. L nh DROP
-Dùng đ xoá b m t quan h ,khi ta xoá b m t bng c s thì t t c các VIEW,INDEX đ c ượ
đ nh nghĩa trên bng đó s b xoá b .
Cú phap:
DROP TABLE/VIEW/INDEX Name;
VD:Xoá b Nhân_viên_id;
DROP INDEX Nhân_viên_id;
- Các l nh DML: SELECT, UPDATE, INSERT, DELETE, …
a. L nh SELECT
M nh đ SELECT t ng ng v i toán t project(phép chi u p) c a đ i s quan h . Kh i ươ ế
l nh SELECT g m có ba m nh đ chính:
+SELECT:xác đ nh n i dung c a các c t c n đ a ra. ư
+FROM:danh sách các quan h đ c quét qua ượ
+WHERE: ng v i m t kh ng đ nh l a ch n c a đ i s quan h .
-L nh SELECT th ng có d ng: ườ
SELECT [distinct]*/A1..An FROM R1, R2 ...,Rm
[WHERE p];
Trong đó :
Ai là các thu c tính
Rj là các quan h (có th là các TABLEs,VIEWs..)Ta có th dùng các bí danh cho các Ai,rj.
p:là đi u ki n ràng bu c.
đây WHERE có th có ho c không.
Dùng *đ ch t t c các thu c tính c a các quan h đ c ch n ượ
-H i đáp này t ng đ ng v i bi u di n sau trong đ i s quan h : ươ ư
pA1..An[S p(r1..rm)]
lo i b các b giá tr (các hàng) trùng nhau ta thêm t khoá Distinct vào sau SELECT
(tr c đây SQL thêm t khoá unique).ướ
-Trong kh ng đ nh p:ta có th dùng các liên t logic and,or,not khi k t h p nhi u đi u ki n ế
VD1:Đ hi n các thông tin v m t nhân viên nào đó
g m(#,H _tên,N_sinh,Ch c_v a_ch ,l ng) ư
SELECT Distinc * FROM R1;
Đ a ra (h _tên,Nsinh,ch c_v a_ch ,l ng,tên_phòng) v i đi u ki n l ng. 500.000 ư ư ư
đia_ch không Hà n i
SELECT Ho_tên,Nsinhn,ch c_v a_ch ,l ng,tên_phòng ư
FROM Nhânviên R1,Liênkêt R2,Phong R3
WHERE (R1.l ng. 500.000) and (not R1.đ a_ch =’Hà n i’) andư
(R1.#NV=R2.#NV) and (R2.#MP=R3.#MP);
-Trong l nh trên ta đã dùng R1,R2,R3 làm bí danh cho Nhânviên, Liênkêt,Phong
Các bí danh đó ch có tác d ng trong m t câu l nh
b. Nhóm l nh INSERT,UPDATE,DELETE:
Thêm m t b vào quan h
Cu phap: INSERT INTO Tên_Bang(Danh sach tên c t)( ( ) (
VALUES(Danh sach cac tri) [câuu hoi con]( ( * )
VD:chèn 1 hàng (‘020’,’Nguy n tr ng Nghĩa’,B o v ’,’Hà n i’,’800.000’) vào R1
INSERT INTO R1 VALUES(‘020’,’Nguy n tr ng Nghĩa’,B o v ’,’Hà n i’,800.000);
Xóa các b ng
Dùng đ xoá b 1 ho c nhi u b trong quan h
DELETE FROM R[WHERE P]
Nh ng b nào tho mãn đk P thì m i b hu b kh i quan h R
VD: DELETE FROM R1 WHERE ng_sinh. ’01-01-1935’;
Trang 2
NH P MÔN CSDL QUAN H So n b i b môn Công ngh ph n m m
Xoá b t t c các nhân viên ta dùng l nh:
DELETE FROM R1;
S a d li u
Cu phap: UPDATE [Tên_bang]( ( )
SET [Tên_c t=Bi u th c,...] ư(
[FROM Tên_Bang])
[WHERE btđk]
- Các l nh DCL: GRANT, REVOKE.
GRANT Quy n truy c p ON Tên_b ng/view TO Tên_User [ with GRANT
option]
- Các quy n truy nh p CSDL g m:
+Read(đ c)
+ SELECT(ch n)
+ Write(ghi)
+ INSERT(b sung)
+ UPDATE(s a đ i)
+ DELETE,run.
- Tên ng i s d ng:Tên c a m t ng i ,m t nhóm ng i ho c danh sách ng iườ ườ ườ ườ
public:cho t t c m i ng i cùng đ c s d ng. ườ ượ
- T khoá :with grant OPTION:đm bo đ ng i s d ng th ti p t c trao quy n s d ng ườ ế
cho ng i khác.ườ
VD:Cho phép SELECT,INSERT,UPDATE trên b ng R1 cho Nghĩa,Khôi
GRANT SELECT,INSERT,UPDATE ON R1 TO Nghĩa,Khôi with grant option;
T c là Nghĩa,Khôi có th trao quy n trên cho ng i khác. ườ
hu b quy n truy nh p
REVOKE privileges ON object FROM user
VD: Đ hu b quy n UPDATE t Nghĩa:
REVOKE UPDATE ON R1 FROM Nghĩa;
II. CÁC VÍ D
Ví d 1:
Cho quan h SINHVIEN (#masv char(10), hoten char(25), ngaysinh datetime, d1
double, d2 double, d3 double). Trong đó, masv là thu c tính khóa c a quan h trên.
a) Hãy t o l p c u trúc trên.
b) Chèn m t c t gt boolean vào b ng trên.
L i gi i:
a) Create Table SINHVIEN (MaSV Char(10), Hoten Char(25) not null, Ngaysinh
Date, d1 double, d2 double, d3 double, CONSTRAINT [khoa] Primary Key ([MaSV]))
b) Alter table sinhvien add gt yesno;
Ví d 2:
Cho CSDL g m 2 quan h :
LOP (#Malop char (10), tenlop char(20))
SINHVIEN (malop char (10), #masv char(10), hoten char(20), ngaysinh datetime, d1 double,
d2 double, d3 double)
a) Hãy đ a ra các thông tin c a các sinh viên bao g m: tenlop, masv, hoten, dtb c aư
m i sinh viên.
b) Đ a ra t ng s sinh viên c a m i l p.ư
Trang 3
NH P MÔN CSDL QUAN H So n b i b môn Công ngh ph n m m
L i gi i:
a) SELECT lop.tenlop, sv.masv, ([d1]+[d2]+[d3])/3 AS dtb
FROM lop, sv WHERE lop.malop = sv.malop;
b) SELECT lop.tenlop, Count(sv.masv) AS CountOfmasv
FROM lop, sv WHERE lop.malop = sv.malop
GROUP BY lop.tenlop;
III. M T S L U Ý Ư
Các câu l nh này có th th nghi m trên m t s h qu n tr CSDL nh SQL, Access,.. ư
Phân bi t đi u ki n sau m nh đ Where và sau m nh đ Having.
B/ BÀI T P M U
Bài s 1:
Cho CSDL c a h th ng Qu n lý nhân s :
DONVI(MaDV C(3), TenDV C(20), Diachi C(20), MaNPT C(4))
NHANVIEN(MaNV C(4), Hoten C(20), NHVu C(20), Luong N(8), Phucap N(6), MaDV C(3))
Hãy đ a ra danh sách t t c các đ n v có trong t ch c này.ư ơ
H ng d n:ướ
Ta th y các thông tin l y trong b ng đ n v và câu l nh thu c nhóm khai thác d li u. ơ
L i gi i:
SELECT TenDV, Diachi FROM DONVI
Bài s 2:
Đ qu n lý kinh doanh dùng các b ng sau:
+ HH(hàng hoá): MaHH C(3), TenHH C(20), Qcach C(20), DVT C(5), DGIA N(10)
+ CH(c a hàng): MaCH C(3), TenCH C(20), DDiem C(20), PTrach C(4)
+ KH(khách hàng): MaKH C(4), TenKH C(20), Loai C(2), Diachi C(20)
+ CT(ch ng t ): Sohieu C(12), Ngay D, LoaiCT C(1), MaKH C(4), MaCH C(3), MaHH C(3),
SoLuong N(6).
a) Xem trong bng CT có nh ng lo i hàng hoá nào đ c xu t. ượ
H ng d n: ướ
Ta th y trong b ng CT, m i ch ng t th bao g m nhi u MaHH khác nhau, nh ư
v y trong b ng CT s nhi u MaHH gi ng nhau, v i yêu c u trên ta ch c n đ a ra các ư
MaHH khác nhau.
L i gi i:
SELECT DISTINCT MaHH FROM CT
SELECT DISTINCT CT.MaHH, TenHH FROM CT, HH WHERE CT.MaHH = HH.MaHH
b) Đ a ra danh sách các nhân viên có l ng >=200000ư ư
SELECT * FROM NHANVIEN WHERE Luong >= 200000
Trang 4
NH P MÔN CSDL QUAN H So n b i b môn Công ngh ph n m m
c) Cho xem danh sách g m 3 c t đ n v , h tên, nhi m v t b ng nhân viên đ c ơ ượ
s p x p theo mã đ n v , cùng đ n v theo nhi m v : ế ơ ơ
SELECT MaDV, Hoten, NHVu FROM NHANVIEN ORDER BY MaDV, NHVu
đ n v , h tên, l ng t b ng NHANVIEN đ c s p x p theo mã đ n v , cùng đ n vơ ươ ượ ế ơ ơ
theo l ng gim d n:ươ
SELECT MaDV, Hoten, Luong FROM NHANVIEN ORDER BY MaDV, Luong DESC
Chú ý:
1. Tên các c t trong <đi u ki n ràng bu c> sau WHERE không nh t thi t phi sau ế
SELECT, các c t này không nh t thi t ph i có trong b ng k t qu . ế ế
2. Tên các c t sau ORDER BY… b t bu c ph i có sau SELECT, t c là các c t này b t bu c
ph i có trong b ng k t qu . ế
*) GROUP BY <tên c t>: N u dùng đ nhóm các hàng cùng giá tr c a tên c t đ i v i ế
m i nhóm thì cùng th c hi n m t thao tác tính toán nào đó.
3. Cho xem mã hàng hoá, tên hàng hoá và t ng s ti n bán đ c c a t ng m t hàng: ượ
SELECT MaCT, MaHH, TenHH, SUM(Soluong*Dongia) FROm CT, HH WHERE CT.MaHH =
HH.MaHH And Loai = “X” GROUP BY CT.MaHH
Cho xem m• đn v , tên đn v , m c l ng bình quân và s nhân viên c a t ng đn v : ư
SELECT a.MaDV, TenDV, AGV(Luong), Cont (A.*) FROM NHANVIEN a, DONVI b WHERE
a.MaDV = b.MaDV GROUP BY a.MaDV
*) Ph n HAVING <đi u ki n ràng bu c> ch ph c v cho GROUP BY
Bài s 3:
R1=Nhân viên (#NV, Ho_tên, Nsinh, ngh nghi p, Đ a ch , l ng) ươ
R2=Liên k t (#NV, #MP)ế
R3=Phong (#Mp, Tên_phong, tel)
1. Đ hi n các thông tin v m t nhân viên nào đó g m(#NV , H _tên, N_sinh, Ch c_v ,
đ a_ch , l ng) ươ
SELECT Distinc * FROM R1;
2. Đ a ra (h _tên,Nsinh,ch c_v a_ch ,l ng,tên_phòng) v i đI u ki n l ng. 500.000 ư ư ươ
đia_ch không Hà n i.
SELECT Ho_tên,Nsinhn,ch c_v a_ch ,l ng,tên_phòng ư
FROM Nhânviên R1,Liênkêt R2,Phong R3
WHERE (R1.l ng. 500.000) and (not R1.đ a_ch =’Hà n i’) andư
(R1.#NV=R2.#NV) and (R2.#MP=R3.#MP);
- Trong l nh trên ta đã dùng R1,R2,R3 làm bí danh cho Nhânviên, Liênkêt, Phong
Các bí danh đó ch có tác d ng trong m t câu l nh
Các ví d sau này ta dùng R1,R2,R3 đ thay cho các b ng trên cho g n
Có 4 toán t hay đ c dùng v i các ki u d li u.Trong m nh đ WHERE là: ượ
In (not In)
Between..and..(not between..)
Like(not like)
Is null (not is Null).
+ Toán t In (not In):Dùng đ ki m tra giá tr trong (không n m trong) m t danh sách đ c ượ
ch ra.
3. Đ a ra nh ng ng i có đia_ch Hà n i và Hà tây.ư ư
SELECT * FROM R1 WHERE đia_ch in (‘Hà n i’,’Hà tây’);
Trang 5