Trong quá trình thực hiện bài báo cáo, do lượng kiến thức và kinh nghiệm thực tiễn còn hạn chế nên kết quả còn nhiều thiếu sót, em kính mong nhận được ý kiến đóng góp của thầy đề từ đó b
Trang 1BÁO CÁO CUỐI KỲ MÔN HỆ CƠ SỞ DỮ LIỆU
[]
Người hướng dẫn: GV Trần Thanh Phước
Người thực hiện: Quách Thịnh - 51800814
Lớp : 18050203
Khoá : 22
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2021
Trang 2BÁO CÁO CUỐI KỲ
MÔN HỆ CƠ SỞ DỮ LIỆU
[]
Người hướng dẫn: GV Trần Thanh Phước
Người thực hiện: Quách Thịnh - 51800814
Lớp : 18050203
Khoá : 22
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2021
Trang 3LỜI CẢM ƠN
Em xin gửi lời cảm ơn chân thành cùng sự tri ân sâu sắc tới toàn thể quý thầy
cô, giảng viên, viên chức đang giảng dạy và làm việc tại trường Đại học Tôn Đức Thắng, đặc biệt là quý thầy cô ở Khoa Công nghệ thông tin đã tạo điều kiện và thời gian tận tình giúp đỡ em trong quá trình thực hiện bài báo cáo này cũng như quá trình học tập tại trường.
Trên hết, em xin được tỏ lòng biết ơn sâu sắc đến thầy Nguyễn Văn Phước – Giảng viên Khoa Công nghệ thông tin vì đã hết lòng giảng dạy, truyền đạt kiến thức quý báu đến tất cả sinh viên nói chung và bản thân em nói riêng một cách tận tình và nghiêm túc Nhờ lượng kiến thức của thầy truyền đạt mà đã giúp em hoàn thành thuận lợi bài báo cáo này nói riêng và vững vàng hơn trong lượng kiến thức khổng lồ của môn học.
Trong quá trình thực hiện bài báo cáo, do lượng kiến thức và kinh nghiệm thực tiễn còn hạn chế nên kết quả còn nhiều thiếu sót, em kính mong nhận được ý kiến đóng góp của thầy đề từ đó bản thân em có thể cải thiện kỹ năng trình bài báo một cách tinh
tế và chuẩn mực hơn trong các bài báo cáo sắp tới.
Kinh chúc thầy có nhiều sức khỏe và thành công trong công việc.
Em xin chân thành cảm ơn!
Trang 4ĐỒ ÁN ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi và được sự hướng dẫn của
TS Nguyễn Văn A; Các nội dung nghiên cứu, kết quả trong đề tài này là trung thực và chưa công bố dưới bất kỳ hình thức nào trước đây Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo.
Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số liệu của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc.
Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệm
về nội dung đồ án của mình Trường đại học Tôn Đức Thắng không liên quan đến
những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có).
TP Hồ Chí Minh, ngày 18 tháng 7 năm 2021
Tác giả (ký tên và ghi rõ họ tên)
Quách Thịnh
Trang 5Phần đánh giá của GV chấm bài
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)
Trang 6MỤC LỤC
LỜI CẢM ƠN i
Phần đánh giá của GV chấm bàị iii
MỤC LỤC 1
PHẦN 1 – Tạo bảng và thực hiện các câu lệnh SQL 3
Câu 1: Viết các câu lệnh SQL để thực hiện các thao tác sau: 3
ạ Tạo Cơ sở dữ liệu, tạo bảng có ràng buộc khó chính khóa ngoạị 3
b Thêm dữ liệu cho bảng theo đúng trình tự bên 1 trước bên nhiều saụ Mỗi bảng ít nhất 5 dòng dữ liệụ 4
Câu 2: Viết câu lệnh SQL thực hiện các yêu cầu: 5
ạ Cho biết những dữ án có nhiều nhận viên tham gia nhất 5
ORDER BY COUNT(MADA) DESC 5
b Liệt kê tất cả nhân viên và mã dữ án mà nhân viên đó tham gia, nếu nhân viên đó chưa tham giá dự án nào thì cột Mã dữ án để trống (null) 5
ORDER BY NHANVIEN.MANV 6
Câu 3: Viết các hàm : 6
ạ Viết hàm trả về số lượng dự án mà một nhân viên đã tham giạ Cho biết: Hàm có 1 tham số đầu vào là Mã nhân viên 6
SELECT * FROM CAU3ẮNV03') 6
b Viết hàm trả về danh sách gồm: Mã nhân viên, tên nhân viên, tên thân nhân của nhân viên, tổng số dự án đã tham gia, tổng số thời gian đã tham giạ Danh sách giảm dần theo tổng số dự án, nếu tổng số dự án bằng nhau thì tăng dần theo tổng số thời gian đã tham giạ 6
Câu 4 : Viết các thủ tục : 6
ạ Thêm vào một nhân viên, có kiểm tra khóa chính, khóa ngoạị 6
EXEC CAU4A 'NV12', N'Đ ườ ng Đ i Hi p', '6/3/1989', N'Ngũ ạ ệ Hành S n', N'Nam', '12000000', 'XAYDUNG' ơ 6
Trang 7b Tăng lương cho những nhân viên có từ 3 thân nhân trở lên thêm 20.000.000 đồng Tăng 10.000.000 đồng cho nhân viên có từ 1 đến 2 thân nhân 6
EXEC CAU4B 7
Câu 5 : Viết các trigger : 7
a Xoá một nhân viên nào đó, nhưng nếu nhân viên đó có thân nhân thì không được xoá 7
b Thêm dữ liệu vào bảng Phân công theo ràng buộc sau: chỉ những nhân viên >= 30 tuổi mới được tham gia dự án từ 100 ngày trở lên 7
PHẦN 2 – Thực hiện các yêu cầu của lược đồ quan hệ 9
Câu 1 : Tìm tất cả các khóa (khóa dự tuyển) của lược đồ quan hệ 9
Câu 2 : Tìm phủ tối thiểu của tập phụ thuộc hàm 9
Câu 3 : Xác định dạng chuẩn cao nhất của lược đồ quan hệ 10
Câu 4 : Nếu lược đồ quan hệ chưa đạt dạng chuẩn BC, đưa lược đồ về dạng chuẩn BC 10
PHẦN 3 – Thực hiện vẽ mô hình ERD, chuyển mô hình ERD sang mô hình quan hệ.13 Câu 1: Viết đặc tả 13
Câu 2: Vẽ ERD 13
Câu 3: Chuyển ERD sang mô hình quan hệ 13
Trang 8PHẦN 1 – Tạo bảng và thực hiện các câu lệnh SQL Cho lược đồ CSDL như sau:
NHANVIEN (MANV, HOTEN, NGAYSINH, DCHI, PHAI, LUONG, MAPB)
Tân từ: Mỗi nhân viên có mã số nhân viên, họ tên, ngày sinh, địa chỉ, giới tính (PHAI),
có mức lương (LUONG) và thuộc vào một phòng ban (MAPB).
THANNHAN (MANV, TENTN, PHAI, NGAYSINH, QUANHE)
Tân từ: Bảng THANNHAN lưu trữ thông tin về người thân của một nhân viên bao gồm
mã nhân viên, tên nhân nhân (TENTN), giới tính, ngày sinh và quan hệ (QUANHE) với nhân viên.
PHONGBAN (MAPB, DIADIEM) DUAN (MADA, TENDA, DIADIEM, MAPB)
Tân từ: Mỗi dự án có một mã dự án (MADA) duy nhất, tên dự án, địa điểm thực hiện
dự án, và do một phòng ban (MAPB) phụ trách.
PHANCONG (MANV, MADA, THOIGIAN)
Tân từ: Mỗi nhân viên sẽ được phân công tham gia một hoặc nhiều dự án, và thời gian tham gia các dự án của nhân viên (đơn vị tính là Ngày)
Câu 1: Viết các câu lệnh SQL để thực hiện các thao tác sau:
a Tạo Cơ sở dữ liệu, tạo bảng có ràng buộc khó chính khóa ngoại.
CREATE DATABASE BAOCAOCUOIKI
USE BAOCAOCUOIKI
CREATE TABLE PHONGBAN (
MAPB VARCHAR (10) PRIMARY KEY , DIADIEMPB NVARCHAR (100) )
CREATE TABLE DUAN (
MADA VARCHAR (10) PRIMARY KEY , TENDA NVARCHAR (50),
DIADIEMAD NVARCHAR (100), MAPB VARCHAR (10) FOREIGN KEY REFERENCES PHONGBAN (MAPB) )
CREATE TABLE NHANVIEN (
MANV VARCHAR (10) PRIMARY KEY , HOTEN NVARCHAR ( 50 ),
NGAYSINH DATE , DCHI NVARCHAR (100), PHAI NVARCHAR (10), LUONG INT ,
Trang 9MAPB VARCHAR (10) FOREIGN KEY REFERENCES PHONGBAN (MAPB) )
CREATE TABLE THANNHAN (
MANV VARCHAR (10) FOREIGN KEY REFERENCES NHANVIEN (MANV), TENTN NVARCHAR ( 50 ),
PHAITN NVARCHAR ( 10 ), NGAYSINHTN DATE , QUANHE NVARCHAR ( 20 ),
PRIMARY KEY (MANV, TENTN ) )
CREATE TABLE PHANCONG (
MANV VARCHAR (10) FOREIGN KEY REFERENCES NHANVIEN (MANV), MADA VARCHAR (10) FOREIGN KEY REFERENCES DUAN (MADA), THOIGIAN INT ,
PRIMARY KEY (MANV, MADA ) )
b Thêm dữ liệu cho bảng theo đúng trình tự bên 1 trước bên nhiều sau Mỗi bảng ít nhất 5 dòng dữ liệu.
INSERT INTO PHONGBAN VALUES
( 'KITHUAT' , N'Qu n 3, TP HCM' ậ ), ( 'KETOAN' , N'Qu n 7, TP HCM' ậ ), ( 'KINHDOANH' , N'Qu n 7, TP HCM' ậ ), ( 'THIETKE' , N'Qu n 4, TP HCM' ậ ), ( 'XAYDUNG' , N'Qu n 2, TP HCM' ậ ), ( 'VATLIEU' , N'Qu n 2, TP HCM' ậ )
INSERT INTO DUAN VALUES
( 'DA01' , N'Shop th i trang' ờ , N'Qu n 5, TP HCM' ậ , 'THIETKE' ), ( 'DA02' , N'Th ươ ng m i đi n t ' ạ ệ ử N'Qu n 3, TP HCM' ậ , 'KETOAN' ), ( 'DA03' , N'Quay s may m n' ố ắ , N'Qu n 6, TP HCM' ậ , 'KINHDOANH' ), ( 'DA04' , N'Năng l ượ ng m t tr i' ặ ờ , N'T nh Bình D ỉ ươ ng' , 'XAYDUNG' ), ( 'DA05' , N'Trang tr i' ạ , N'T nh Thái Nguyên' ỉ , 'KINHDOANH' )
SET DATEFORMAT DMY
INSERT INTO NHANVIEN VALUES
( 'NV01' , N'Nguy n Văn A' ễ , '17/4/1997' , N'Qu n 4, TP HCM' ậ , N'Nam' , 14000000 ,
'KINHDOANH' ), ( 'NV02' , N'Nguy n Văn B' ễ , '21/4/1995' , N'T nh Long Xuyên' ỉ , N'Nam' , 10000000,
'XAYDUNG' ), ( 'NV03' , N'Lê Đ c Trí' ứ , '1/6/1988' , N'Qu n 6, TP HCM' ậ , N'Nam' , 25000000 ,
'KITHUAT' ), ( 'NV04' , N'Hoàng Văn Th ng' ố , '25/11/1992' , N'Biên Hòa, Đ ng Nai' ồ , N'Nam' , 8000000 ,
'VATLIEU' ), ( 'NV05' , N'Lý Th Ki t' ế ệ , '13/9/1990' , N'Qu n 3, TP HCM' ậ , N'Nam' , 22000000,
'THIETKE' ), ( 'NV06' , N'Vũ Hoàng Y n' ế , '2/4/1996' , N'Qu n 4, TP HCM' ậ , N'N ' ữ , 12000000 ,
'KETOAN' ),
Trang 10( 'NV07' , N'Nguy n B o Nh ' ễ ả ư , '22/12/1993' , N'T nh Bình D ỉ ươ ng' , N'N ' ữ , 15000000 ,
'THIETKE' ), ( 'NV08' , N'Đinh Tu n Tú' ấ , '30/3/1989' , N'Qu n 10, TP HCM' ậ , N'Nam' , 19000000,
'THIETKE' ), ( 'NV09' , N'Lê Đ c Anh' ứ , '6/7/1986' , N'T nh Thái Nguyên' ỉ , N'Nam' , 17000000,
'XAYDUNG' ), ( 'NV10' , N'Hoàng Th C m Tú' ị ẩ , '21/12/1994' , N'T nh Thái Nguyên' ỉ , N'N ' ữ , 14000000 ,
'KETOAN' ), ( 'NV11' , N'D ươ ng C m Ly' ẩ , '10/9/1995' , N'Qu n 5, TP HCM' ậ , N'N ' ữ , 12000000 ,
'KINHDOANH' )
INSERT INTO THANNHAN VALUES
( 'NV01' , N'Lê Chí Tài' , N'Nam' , '14/3/1982' , N'Chú' ), ( 'NV02' , N'Nguy n Lô Tô' ễ , N'Nam' , '3/7/1981' , N'D ượ ng' ), ( 'NV03' , N'Nguy n Thanh Mai' ễ , N'N ' ữ , '21/9/1991' , N'V ' ợ ), ( 'NV04' , N'Hoàng Chí Tôn' , N'Nam' , '27/11/1963' , N'B ' ố ), ( 'NV05' , N'D ươ ng C m Th ch' ẩ ạ , N'N ' ữ , '6/1/1994' , N'V ' ợ ), ( 'NV06' , N'Hoàng B o Long' ả , N'Nam' , '27/12/1992' , N'Ch ng' ồ ), ( 'NV07' , N'Tr n Th Tuy t Nhung' ầ ị ế , N'N ' ữ , '5/9/1964' , N'M ' ẹ ), ( 'NV08' , N'Đinh Th B o' ế ả , N'Nam' , '17/6/1986' , N'Anh' ), ( 'NV09' , N'Nguy n Xuân Thanh' ễ , N'N ' ữ , '4/8/1991' , N'V ' ợ ), ( 'NV10' , N'Quách Gia Lâm' , N'Nam' , '21/10/1992' , N'Ch ng' ồ ), ( 'NV11' , N'Tô Chí Thanh' , N'Nam' , '24/2/1982' , N'Chú' )
INSERT INTO PHANCONG VALUES
( 'NV01' , 'DA03' , 14 ), ( 'NV02' , 'DA04' , 180 ), ( 'NV03' , 'DA04' , 180 ), ( 'NV04' , 'DA02' , 7 ), ( 'NV05' , 'DA01' , 14 ), ( 'NV06' , 'DA05' , 7 ), ( 'NV07' , 'DA01' , 14 ), ( 'NV08' , 'DA04' , 14 ), ( 'NV09' , 'DA05' , 180 ), ( 'NV10' , 'DA05' , 30 ), ( 'NV11' , 'DA04' , 30 )
Câu 2: Viết câu lệnh SQL thực hiện các yêu cầu:
a Cho biết những dữ án có nhiều nhận viên tham gia nhất.
SELECT TOP 1 MADA, COUNT(MADA ) AS 'S NV' ố FROM PHANCONG
GROUP BY ( MADA )
ORDER BY COUNT ( MADA ) DESC
b Liệt kê tất cả nhân viên và mã dữ án mà nhân viên đó tham gia, nếu nhân viên đó chưa tham giá dự án nào thì cột Mã dữ án để trống (null).
Trang 11SELECT NHANVIEN.MANV, PHANCONG.MADA
FROM NHANVIEN
FULL OUTER JOIN PHANCONG ON NHANVIEN MANV PHANCONG MANV =
ORDER BY NHANVIEN MANV
Câu 3: Viết các hàm :
a Viết hàm trả về số lượng dự án mà một nhân viên đã tham gia Cho biết: Hàm có 1 tham số đầu vào là Mã nhân viên.
CREATE FUNCTION CAU3A @MANV VARCHAR ( 10 ))
RETURNS TABLE AS
RETURN SELECT MANV, COUNT(MADA ) AS N'D án tham gia' ự FROM PHANCONG WHERE MANV =
@MANV GROUP BY MANV
Th c thi ự
SELECT FROM CAU3A ('NV03')
b Viết hàm trả về danh sách gồm: Mã nhân viên, tên nhân viên, tên thân nhân của nhân viên, tổng số dự án đã tham gia, tổng số thời gian
đã tham gia Danh sách giảm dần theo tổng số dự án, nếu tổng số dự
án bằng nhau thì tăng dần theo tổng số thời gian đã tham gia.
CREATE FUNCTION CAU3B()
RETURNS TABLE AS
RETURN SELECT PHANCONG MANV, NHANVIEN.HOTEN, COUNT ( THANNHAN.MANV ) AS N'S THÂN Ố NHÂN' , COUNT PHANCONG MANV ) AS N'T ng s d án' ổ ố ự , SUM ( PHANCONG THOIGIAN ) AS N'T ng ổ
th i gian' ờ
FROM NHANVIEN THANNHAN PHANCONG , ,
WHERE NHANVIEN MANV THANNHAN MANV = AND NHANVIEN.MANV = PHANCONG MANV
GROUP BY PHANCONG.MANV, NHANVIEN.HOTEN
ORDER BY COUNT(PHANCONG MANV ) DESC , SUM(PHANCONG THOIGIAN )
Th c thi ự
SELECT FROM CAU3B () Câu 4 : Viết các thủ tục :
a Thêm vào một nhân viên, có kiểm tra khóa chính, khóa ngoại.
CREATE PROC CAU4A @MANV VARCHAR ( 10 ), @HOTEN NVARCHAR (50), @NGAYSINH DATE , @DCHI
NVARCHAR ( 100 ), @PHAI NVARCHAR ( 10 ), @LUONG INT , @MAPB VARCHAR ( 10 ))
AS BEGIN
IF NOT EXISTS SELECT FROM NHANVIEN WHERE MANV @MANV = ) AND EXISTS ( SELECT FROM PHONGBAN WHERE MAPB @MAPB = )
INSERT INTO NHANVIEN VALUES (@MANV, @HOTEN , @NGAYSINH @DCHI @PHAI , , ,
@LUONG, @MAPB)
Trang 12Th c thi ự
EXEC CAU4A 'NV12', N'Đ ườ ng Đ i Hi p' ạ ệ , '6/3/1989', N'Ngũ Hành S n' ơ , N'Nam', '12000000' , 'XAYDUNG'
b Tăng lương cho những nhân viên có từ 3 thân nhân trở lên thêm 20.000.000 đồng Tăng 10.000.000 đồng cho nhân viên có từ 1 đến 2 thân nhân.
CREATE PROC CAU4B
AS BEGIN
UPDATE NHANVIEN
SET LUONG = LUONG + 20000000
WHERE MANV IN SELECT MANV FROM THANNHAN GROUP BY MANV HAVING COUNT(MANV)
>= 3 ) UPDATE NHANVIEN
SET LUONG = LUONG + 10000000
WHERE MANV IN SELECT MANV FROM THANNHAN GROUP BY MANV HAVING COUNT(MANV)
>= 1 AND COUNT(MANV ) <= ) 2
END
Th c thi ự
EXEC CAU4B
Câu 5 : Viết các trigger :
a Xoá một nhân viên nào đó, nhưng nếu nhân viên đó có thân nhân thì không được xoá.
CREATE TRIGGER CAU5A
ON NHANVIEN
FOR DELETE AS
DECLARE @MANV_DLT VARCHAR ( 10 )
SELECT @MANV_DLT MANV = FROM DELETED
IF EXISTS SELECT * FROM THANNHAN WHERE MANV= @MANV_DLT )
BEGIN PRINT N'Nhân viên này có nhân thân, không đ ượ c xóa' ROLLBACK TRAN
END ELSE DELETE FROM NHANVIEN WHERE MANV @MANV_DLT =
PRINT N'Xóa thành công'
b Thêm dữ liệu vào bảng Phân công theo ràng buộc sau: chỉ những nhân viên >= 30 tuổi mới được tham gia dự án từ 100 ngày trở lên.
CREATE TRIGGER CAU5B
Trang 13ON PHANCONG
FOR INSERT AS
DECLARE @MANV_INS VARCHAR ( 10 )
DECLARE @MADA_INS VARCHAR ( 10 )
DECLARE @THOIGIAN_INS INT SELECT @MANV_INS MANV = FROM inserted
SELECT @MADA_INS MADA = FROM inserted
SELECT @THOIGIAN_INS THOIGIAN = FROM inserted
IF EXISTS SELECT MANV FROM NHANVIEN WHERE MANV = @MANV_INS AND ( YEAR(GETDATE ())- YEAR ( NGAYSINH )) 30 )
AND EXISTS SELECT * FROM PHANCONG WHERE MANV=@MANV_INS AND MADA =@MADA_INS AND THOIGIAN @THOIGIAN_INS = AND @THOIGIAN_INS >= 100 )
BEGIN PRINT N'Nhân viên ch a đ 30 tu i nên không th tham gia d án trên 100 ư ủ ổ ể ự ngày'
ROLLBACK TRAN END
ELSE BEGIN INSERT INTO PHANCONG VALUES (@MANV_INS, @MADA_INS @THOIGIAN_INS , )
PRINT N'Thêm thành công' END
Trang 14PHẦN 2 – Thực hiện các yêu cầu của lược đồ quan hệ
Cho lược đồ quan hệ R(U, F), U = MNOPQRS
Câu 1 : Tìm tất cả các khóa (khóa dự tuyển) của lược đồ quan hệ.
Ta có phủ tối thiểu của lược đồ quan hệ G’’ = { S M(1); S R(2); NS Q(3); PQ S(4); MO N(5); N R(6)}
U = MNOPQRS
UR = MRQSN
UL = SNPQMO
N = U – UR = OP + ¿
N ¿ = OP, lược đồ có nhiều khóa
D = UR – UL = R
L = U – (N D) = MNQS ˅
+ Xét L i gồm 1 thuộc tính + ¿
MOP ¿ = MOPNR + ¿
NOP ¿ = NROP + ¿
QOP ¿ = QPOSMRN = U, K 1 = OPQ là một khóa + ¿
SOP ¿ = SOPMRNQ = U, K 2 = OPS là một khóa + Xét L i gồm 2 thuộc tính
+ ¿
MNOP ¿ = MNOPR Vậy có 2 khóa : OPQ, OPS
Câu 2 : Tìm phủ tối thiểu của tập phụ thuộc hàm.
B1: Phân rã vế phải còn một thuộc tính
F = {S MR; NS QM; PQ RS; MO NR; N R}
G = {S M(1); S R(2); NS Q(3); NS M(4); PQ R(5); PQ S(6); MO N(7);
MO R(8); N R(9)}
B2: Loại bỏ phụ thuộc hàm dư thừa
Bỏ (1), không được, do + S ¿ ¿ = SR
Bỏ (2), không được, do + S ¿ ¿ = SM
Bỏ (3), không được, do NS + ¿ ¿ = NSM