Bài giảng Cơ sở dữ liệu - Bài 5: Ngôn ngữ CSDL - SQL - Vũ Văn Định
Có thể truy cập vào CSDL từ một ngôn ngữ lập
trình bậc cao nếu có SQL "nhúng" trong ngôn ngữ
này. Một ngôn ngữ trong đó các câu hỏi được SQL
được nhúng vào gọi là ngôn ngữ chủ, còn các cấu trúc
của SQL được phép trong ngôn ngữ này làm thành
SQL nhúng
- Sơ đồ xử lý các chương trình có nhúng câu lệnh SQL:
49 trang |
Chia sẻ: thucuc2301 | Lượt xem: 694 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Cơ sở dữ liệu - Bài 5: Ngôn ngữ CSDL - SQL - Vũ Văn Định, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài 5. Ngôn ngữ CSDL – SQL
Để người sử dụng có thể giao tiếp được
với CSDL phải có một hệ thống ngôn ngữ
giao tiếp bao gồm:
• Ngôn ngữ định nghĩa dữ liệu .
• Ngôn ngữ thao tác dữ liệu
• Ngôn ngữ truy vấn dữ liệu
• Ngôn ngữ quản lý dữ liệu
Mỗi hệ quản trị CSDL đều có cách
cài đặt các ngôn ngữ khác nhau
nhưng đều dựa trên chuẩn của ngôn
ngữ truy vấn có cấu trúc SQL (
Structured- Query Language)
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
I. Ngôn ngữ định nghĩa dữ liệu SQL
Là ngôn ngữ mô tả dữ liệu, cho phép
người dùng định nghĩa cấu trúc CSDL, sửa
đổi cấu trúc, liên kết các thành phần trong
CSDL
Ngoài ra , nó còn cung cấp các khả năng
khác như : định nghĩa khung nhìn, kiểm
soát tính toàn vẹn dữ liệu, cấp phát quyền
truy cập,
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Quy ước :
– Tên tên bảng, thuộc tính đối tượng không chứa dấu
cách, không trùng tên với nhau.
– Các phạm trù cú pháp bắt buộc phải điền được đặt
trong cặp dấu
– Các thành phần tuỳ chọn được viết trong cặp dấu [ ]
– Mỗi câu lệnh SQL có thể được viết trên nhiều dòng và
được kết thúc bằng dấu ;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Các kiểu dữ liệu đơn giản trong
SQL
Kiểu dữ liệu số: integer , float,
decimal(n,p)- số thực với độ dài tối đa là
n chữ số với p chữ số thập phân ,
number(n)- kiểu số có độ dài tối đa là n
Kiểu dữ liệu chuỗi :
-varchar (n) - chuỗi có độ dài biến đổi
từ 0 đến n
- Char (n): xâu kí tự có độ dài cố định n (
n<=255)
Kiểu dữ liệu ngày tháng: date, time
Kiểu luận lí : boolean
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
II. Các câu lệnh tạo cấu trúc
bảng
1. Lệnh tạo bảng tổng quát
CREATE TABLE
( <
kích thước 1>,
.
< kích
thước n>,
);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ :
Tạo bảng SINH_VIEN có các thuộc tính:
- mã sinh viên ( kiểu số có độ dài <5)
- họ tên ( kiểu xâu kí tự có độ dài <25)
- ngày sinh (kiểu date)
- giới tính ( kiểu xâu có độ dài <3)
- địa chỉ ( kiểu xâu có độ dài < 30 )
- điểm TB ( kiểu số thực có độ dài <4, trong đó có
2 chữ số sau phần thập phân)
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
CREATE TABLE SINH_VIEN
( ma_sv NUMBER(5) ,
ho_ten VARCHAR(25),
ng_sinh DATE,
gioi_tinh VARCHAR (3),
đia_chi VARCHAR (30),
diem_tb DECIMAL (4,2),
);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
2. Lệnh tạo bảng với một số điều kiện ràng
buộc
CREATE TABLE
( ,
.
,
[ CONSTRAINT ]| NULL|
NOT NULL|
Primary Key ( Khoá chính )
[ Unique ( khoá )]
[Foreign Key (Khoá _ ngoài) References Tên_bảng]
[ Check ]
);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Trong đó :
NOT NULL : chỉ rằng cột không nhận giá trị rỗng.
Ngầm định là Null. Thuộc tính khoá ngầm định là Not
Null.
COSNTRAINT :
khai báo các ràng buộc toàn vẹn của CSDL.
Primary Key ( Khoá chính): Khai báo khoá chính
của mảng
Unique ( Khoá ) : Khai báo các khoá khác nếu có
Foreign Key Khoá_ ngoài References Tên_
bảng : Khai báo các khoá ngoài của bảng
Check Điều_kiện_ràng_buộc : Khai báo các ràng
buộc dữ liệu .
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ :
Tạo bảng SINH_VIEN có:
- khoá chính là thuộc tính mã sinh viên ( kiểu
số)
- họ tên ( kiểu xâu kí tự có độ dài <=25) không
được để trống,
- ngày sinh (kiểu date)
- giới tính ( kiểu xâu có độ dài <=3, mặc định là
'Nam')
- mã lớp là một khoá ngoài, mã lớp thuộc bảng
LOP.
- điểm TB ( kiểu số thực có độ dài <=4)
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Câu lệnh :
CREATE TABLE SINH_VIEN
( ma_sv NUMBER(5) PRIMARY KEY,
ho_ten VARCHAR(25) NOT NULL,
ng_sinh DATE,
gioi_tinh VARCHAR (3) DEFAULT ' Nam',
ma_lop CHAR (3) ,
diem_tb DECIMAL (4,2),
FOREIGN KEY ma_lop REFERENCES LOP
);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Hoặc :
CREATE TABLE SINH_VIEN
( ma_sv NUMBER(5) ,
ho_ten VARCHAR(25) NOT NULL,
ng_sinh DATE,
gioi_tinh VARCHAR (3) DEFAULT ' Nam',
ma_lop CHAR (3) ,
diem_tb DECIMAL (4,2),
PRIMARY KEY ( ma_sv),
FOREIGN KEY ma_lop REFERENCES LOP
);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
3. Bổ sung -xoá một cột trong bảng
a. Bổ sung một cột :
ALTER TABLE
ADD <
kích thước>;
VD : Thêm cột số điện thoại vào bảng
SINH_VIEN ở trên.
ALTER TABLE SINH_VIEN
ADD dien_thoai NUMBER(10);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
a.Xoá một cột :
ALTER TABLE DROP <tên
cột> ;
VD : Xoá cột điểm TB trong bảng SINH_VIEN
ở trên.
ALTER TABLE SINH_VIEN DROP
diem_tb;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
4. Xoá một bảng khỏi CSDL
DROP TABLE ;
VD : Xoá bảng SINH_VIEN trong CSDL
DROP TABLE SINH_VIEN;
Khi đó toàn bộ thông tin về bảng SINH_VIEN(
gồm cả lược đồ và các bản ghi ) đều bị xoá, khác
với lệnh
DELETE FROM SINH_VIEN ;
chỉ xoá các bản ghi trong bảng, vẫn giữ lại cấu
trúc (lược đồ ) của bảng
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
III. Các câu lệnh truy vấn
1. Truy vấn theo câu hỏi đơn giản
Cấu trúc cơ sở của một biểu thức hỏi ( còn gọi là
biểu thức truy vấn) SQL gồm :
SELECT [ DISTINCT | ALL] {* | AS [<tên
mới>],..}
FROM [ ],...
[WHERE ]
[GROUP BY ] [HAVING ]
[ORDER BY ];
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Trong đó :
- Từ khoá DISTINCT : để loại bỏ sự trùng lặp ( các bộ trùng
lặp chỉ giữ lại một bộ)
- : là tên của một cột hoặc của biểu thức
- : là tên của một bảng trong CSDL hay một khung
nhìn mà ta có thể truy cập vào
- GROUP BY : dùng để gộp nhóm các bộ cùng giá trị tương ứng
ở các cột xuất hiện trong ds tên cột.
- HAVING: dùng để lọc các nhóm thoả điều kiện
- ORDER BY : quy định thứ tự trong các cột trả ra gồm : ASC
( tăng dần) và DESC ( giảm dần). Mặc định là ASC
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 1:
Tìm tên các dự án và mã các phòng
quản lý dự án tương ứng
SELECT ten_da, ma_p
FROM DU_AN;
Kết quả tra ra :
P1Giáo trình điện tử
P3Mạng B
P2Phần mềm A
Ma_pTen_da
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Chú ý :
a . Muốn hiển thị tất cả các cột trong bảng, ta có
thể dùng dấu * để thay thế
Ví dụ 2. Cho biết thông tin về nhân viên trong
công ty .
C1 : SELECT ma_nv, ho_ten, ng_sinh, gioi_tinh,
ma_p, luong
FROM NHAN_VIEN;
C2: SELECT *
FROM NHAN_VIEN ;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
b. Trong bảng kết quả, nếu muốn ta
có thể đặt tên mới cho cột sau từ khoá As
Ví dụ3 : Cho biết tên và lương mới của mỗi nhân
viên biết họ được tăng 10% .
Câu lệnh :
C1:
SELECT ho_ten, luong + luong*0.1
FROM NHAN_VIEN;
C2:
SELECT ho_ten, luong+luong*0.1 AS
luong_moi
FROM NHAN_VIEN;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
c. SQL dùng các phép so sánh :
<= ( nhỏ hơn hoặc bằng) ,
>=( lớn hơn hoặc bằng) ,
( khác)
- Có thể kết hợp nhiều biểu thức logic
bằng các phép AND, OR, NOT.
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 4:Tìm các nhân viên thuộc phòng có mã
phòng là P2 và có lương >=2tr.
SELECT ma_nv, ho_ten, ma_p, luong
FROM NHAN_VIEN
WHERE ma_p= 'P2' AND
luong>=2000000;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 5:
Lập danh sách ( gồm mã sinh viên,họ
tên, ngày sinh, giới tính) của các sinh viên
nữ có học lực từ khá trở lên và các sinh
viên nam học lực giỏi.
SELECT SV#, HT, NS, GT
FROM SV
WHERE (GT= 'Nữ' AND HL>=6.5)
OR ( GT= 'Nam' AND HL
>=8.0 );
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
d. Tìm kiếm có xử lý xâu kí tự
SQL dùng toán tử LIKE để so sánh
xâu.
SQL sử dụng kí tự ' %' để thay thế cho
một xâu con, dấu phân cách '_' để thay
thế cho một kí tự.
VD:
- A%B : xâu kí tự bất kì bắt dầu bằng
chữ A và kết thúc bằng chữ B
- A_B : xâu gồm 3 kí tự, có kí tự thứ
hai bất kì
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 6: Cho biết mã và tên các dự án mà
địa điểm có chứa từ UBND:
SELECT ma_da, ten_da
FROM DU_AN
WHERE dia_diem_da LIKE
'%UBND%';
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
e. SQL cho phép sử dụng các giá trị NULL để
chỉ sự thiếu vắng thông tin về giá trị của một bộ
tại một thuộc tính. Với từ khoá IS NULL, SQL
cho phép kiểm tra xem một giá trị có là NULL
hay không ?
Ví dụ 7: Cho biết tên và mã số dự án mà
cột địa điểm có giá trị là NULL.
SELECT ma_da, ten_da
FROM DU_AN
WHERE dia_diem_da IS NULL;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
f. Truy vấn có sắp xếp thứ tự
Kết quả của câu truy vấn SQL có thể
được sắp theo thứ tự tăng dần (ASC )
hoặc giảm dần (DESC) bởi khoá
ORDER BY. Mặc định là tăng dần.
Ví dụ 8 :
Liệt kê các nhân viên nữ theo thứ tự
tăng dần của lương:
SELECT *
FROM NHAN_VIEN
WHERE GT = ' Nữ'
ORDER BY luong;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Việc sắp thứ tự có thể được thực
hiện trên nhiều thuộc tính
Ví dụ 9: Hiển thị các thông tin chấm
công của các dự án có mã thuộc tập
D1, D2, D8 theo thứ tự tăng dần của
số giờ và giảm dần của mã dự án:
SELECT *
FROM CHAM_CONG
WHERE ma_da IN ('D1', 'D2', 'D8')
ORDER BY so_gio ASC, ma_da
DESC;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
g. Tìm kiếm nhờ sử dụng IN và
BETWEEN
Ví dụ 10:
Tìm những nhân viên có lương từ 2000000
đến 3000000 , sắp xếp tên theo thứ tự tăng
dần.
SELECT *
FROM NHAN_VIEN
WHERE luong BETWEEN 2000000 AND
3000000
ORDER BY ho_ten ASC;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
2. Các hàm thư viện
SQL có 5 hàm kết tập được cài sẵn :
- COUNT :đếm số giá trị
- SUM : tính tổng các giá trị trong một cột
- MAX : tính giá trị lớn nhất trong một cột
- MIN : tính giá trị nhỏ nhất trong một cột
- AVG : tính giá trị trung bình của một cột
Chú ý : Các hàm sum và avg chỉ áp dụng cho
các cột có kiểu số
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 1: Tìm lương cao nhất, lương thấp
nhất, và trung bình cộng lương toàn cơ
quan
SELECT MAX (luong) AS max, MIN
(luong) AS min, AVG (luong) AS tb
FROM NHAN_VIEN;
Kết quả câu truy vấn này trả ra như sau :
235000012000003000000
tbminmax
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 2: Cho biết số nhân viên thực hiện dự
án có mã là D8
SELECT COUNT (*)
FROM CHAM_CONG
WHERE ma_da = 'D8';
Chú ý :
- Hàm Count khi có đối số (*) có
nghĩa là đếm số bản ghi thoả mãn
yêu cầu mà không cần quan tâm đến
bất kì cột nào .
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
- Dùng từ khoá DISTINCT ngay
trước tên cột được áp dụng hàm,
khi cần loại bỏ các bộ trùng nhau.
Ví dụ 3: Đếm số tỉnh có sinh viên
theo học
SELECT COUNT (DISTINCT Que)
FROM SINHVIEN;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
3.Tìm kiếm nhờ mệnh đề GROUP BY
Ví dụ 1: In ra danh sách sinh viên theo
từng quê của sinh viên?
SELECT SV#, HT, NS
FROM SV
GROUP BY Que;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
4. Tìm kiếm có sử dụng mệnh đề HAVING
Mệnh đề HAVING thường sử dụng cùng mệnh
đề GROUP BY. Sau HAVING là biểu thức điều kiện.
Biểu thức này không tác động vào toàn bảng mà chỉ tác
động vào từng nhóm các bản ghi đã chỉ ra tại mệnh đề
GROUP BY
VÍ DỤ : Tìm mã số những sinh viên thực hiện ít nhất 2
đề tài:
SELECT SV#
FROM SD
GROUP BY SV#
HAVING COUNT (DT# ) >=2;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
5. Tìm kiếm với câu hỏi phức tạp
Tìm kiếm với nhiều bảng qua việc sử dụng ánh xạ
lồng nhau hoặc qua phép kết nối.
Phép kết nối :
ĐK: Các miền tham gia kết nối phải có miền trị là
sánh được với nhau. Tên của các cột khác nhau có thể
được viết tường minh qua tên bảng theo cú pháp :
Tên_ bảng. Tên_ cột
Ví dụ : Với mỗi đề tài có sinh viên tham gia thực tập.
Hãy cho biết tên đề tài, tên chủ nhiệm đề tài và kinh phí
thực hiện đề tài đó.
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Câu lệnh :
SELECT TDT, CN, KP
FROM DT, SD
WHERE SD.DT# = DT.DT#;
Chú ý : Trong câu truy vấn có hơn một
bảng, nếu tên cột là không duy nhất thì bắt buộc
phải viết tên cột dạng tường minh.
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ánh xạ lồng
Ví dụ 1:
Tìm tên những sinh viên thực tập tại Hà Nội .
SELECT HT
FROM SV
WHERE SV# IN (SELECT SV#
FROM SD
WHERE NTT= ‘Hà Nội ‘);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 2:
Tìm những sinh viên thực hiện ít nhất một đề tài nào
đó:
SELECT *
FROM SV
WHERE EXISTS ( SELECT *
FROM SD
WHERE
SV.SV# = SD.SV#);
SQL còn có thể tìm kiếm trên nhiều bảng
nhờ mênh đề EXISTS ( tồn tại )
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Tìm kiếm có sử dụng lường từ ANY và
ALL
Ví dụ 3 : Tìm tên những đề tài mà sinh viên có mã số 5
đã thực hiện:
SELECT TDT
FROM DT
WHERE DT# = ANY ( SELECT DT#
FROM SD
WHERE SV# = 5);
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ 4 :
Tìm tên sinh viên có điểm học lực
cao hơn tất cả các sinh viên
SELECT HT
FROM SV
WHERE HL >= ALL ( SELECT HL
FROM SV );
Mệnh đề trên tương đương với :
SELECT HT
FROM SV
WHERE HL = ( SELECT MAX (HL)
FROM SV );
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
IV. CÁC MỆNH ĐỀ CẬP NHẬT DỮ LIỆU
1. Thêm một bộ :
Dạng tổng quát :
INSERT INTO Tên _ bảng ( ds_tên _cột)
VALUES (các_ giá_trị )
[ câu hỏi con]
Có thể bổ sung vào một tập các bản ghi là kết quả xử lý của
một câu hỏi nào đó.
VD: Chèn vào bảng SVG các sinh viên giỏi trong bảng SV.
INSERT INTO SVG
SELECT *
FROM SV
WHERE HL >= 8.0;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
2. Xoá bản ghi
Có thể xoá một hay nhiều bản ghi thoả mãn một điều kiện
nào đó.
Dạng tổng quát:
DELETE [tên_bảng]
[FROM { Tên_bảng / Tên_ view}]
[WHERE Biểu_ thức _điều _kiện]
Ví dụ : Xoá những sinh viên có điểm HL kém (HL<=3.5):
DELETE
FROM SV
WHERE HL<=3.5;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
3. Sửa đổi dữ liệu
Sửa đổi các giá trị của các bản ghi theo một điều kiện nào
đó:
Dạng tổng quát :
UPDATE [ tên_bảng]
SET [ tên_cột = biểu_thức,...]
FROM tên _ bảng
WHERE Biểu _ thức _điều _kiện
Ví dụ : Sửa điểm học lực của bạn Phan Ngọc Hà thành 8.5
UPDATE SV
SET HL = 8.5
WHERE HT=‘ Phan Ngọc Hà’;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
4. Tạo chỉ mục.
Việc tạo chỉ mục là tạo ra một bảng lưu trữ vị trí các
bản ghi dựa trên giá trị tăng dần của một ( hay một số)
cột nào đó. Việc này có tác dụng làm tăng tốc độ tìm
kiếm thông tin trong CSDL.
Dạng tổng quát :
CREATE INDEX tên_bảng_chỉ_mục
ON Tên_bảng ( tên _cột [ASC | DESC]);
Bỏ chỉ mục thì sử dụng mệnh đề :
DROP INDEX tên_chỉ_mục;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ví dụ :
Tạo chỉ mục CMHT trên cột Ho_ten của bảng
sinh viên:
CREATE INDEX CMHT
ON SV ( HT ASC);
Ví dụ: Xoá chỉ mục CMHT ra khỏi bảng SV
DROP INDEX CMHT;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
5. Tạo View của người sử dụng
Tạo ra một khung nhìn của người sử dụng :
Dạng tổng quát :
CREATE VIEW Tên_View (Danh_ sách_ tên _cột)
AS mệnh_đề_Select ;
Ví dụ : Tạo View DSSVG gồm những sinh viên giỏi bao
gồm thông tin về họ tên, ngày sinh, giới tính của các sinh
viên từ bảng SV.
CREATE VIEW DSSVG ( Hoten, NS, GT)
AS SELECT HT , NS, GT
FROM SV
WHERE HL >= 8.0;
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
6. SQL nhúng
Có thể truy cập vào CSDL từ một ngôn ngữ lập
trình bậc cao nếu có SQL "nhúng" trong ngôn ngữ
này. Một ngôn ngữ trong đó các câu hỏi được SQL
được nhúng vào gọi là ngôn ngữ chủ, còn các cấu trúc
của SQL được phép trong ngôn ngữ này làm thành
SQL nhúng
- Sơ đồ xử lý các chương trình có nhúng câu lệnh SQL:
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Ngôn ngữ chủ
+
SQL nhúng
Tiền xử lý
Ngôn ngữ chủ
Các lời gọi hàm
Biên dịch
ngôn ngữ chủ Thư viện SQL
Chương trình ngôn ngữ chủ
+
TopTaiLieu.Com | Chia Sẻ Tài Liệu Miễn Phí
Các file đính kèm theo tài liệu này:
- gia_vu_van_dinh_5_98_2004655.pdf