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

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC NHA TRANG


KHOA CÔNG NGHỆ THÔNG TIN


BÁO CÁO NHÓM HỆ QUẢN TRỊ CƠ SỞ DƯ LIỆU


CHỦ ĐỀ: QUẢN LÝ TOUR DU LỊCH NHA TRANG.

Giảng viên hướng dẫn: TS. Phạm Thị Thu Thúy

Sinh viên thực hiện: 1. Phan Thế Bảo – 64130132

2. Lê Minh Phi – 64131786

3. Trần Nhật Huy 64130892

4. Nguyễn Hoàng Tuấn – 64132832

Khánh Hòa, tháng 5/2024


BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NHA TRANG
KHOA CÔNG NGHỆ THÔNG TIN


BÁO CÁO NHÓM HỆ QUẢN TRỊ CƠ SỞ DƯ LIỆU


CHỦ ĐỀ: QUẢN LÝ TOUR DU LỊCH NHA TRANG.

Giảng viên hướng dẫn: TS. Phạm Thị Thu Thúy

Sinh viên thực hiện: 1. Phan Thế Bảo – 64130132

2. Lê Minh Phi – 64131786

3. Trần Nhật Huy - 64130892

4. Huỳnh Quang Đức - 63133733

Khánh Hòa, tháng 5/2024


MỤC LỤC
MỤC LỤC .......................................................................................................................1
Chương I: XÂY DỰNG CƠ SỞ DỮ LIỆU.....................................................................2
1.1. THIẾT KẾ CƠ SỞ DỮ LIỆU...................................................................................2
1.1.1. Lược đồ cơ sở dữ liệu ............................................................................................2
1.1.2. Tạo bảng và kết nối bảng .......................................................................................2
1.1.3. Thêm dữ liệu ..........................................................................................................8
1.2. TRUY VẤN DỮ LIỆU ...........................................................................................15
1.2.1. Các câu truy vấn đơn giản ...................................................................................15
1.2.2. Câu lệnh truy vấn với Aggregate Functions ........................................................15
1.2.3. Câu lệnh truy vấn với mệnh đề Having ..............................................................15
1.2.4. Câu lệnh truy vấn lớn nhất/ nhỏ nhất ..................................................................17
1.2.5. Câu lệnh truy vấn Không/chưa có (Not In và Left/right join).............................17
1.2.6. Câu lệnh truy vấn Hợp, Giao, Trừ .......................................................................18
1.2.7. Câu lệnh truy vấn sử dụng phép Chia .................................................................18
1.2.8. Câu lệnh truy vấn Update, Delete........................................................................19
1.2.9. Thủ tục, hàm ........................................................................................................20
1.2.9.1. Thủ tục ..............................................................................................................20
1.2.9.2. Hàm ..................................................................................................................21
1.2.10. Trigger ...............................................................................................................22
1.2.11. Phân quyền.........................................................................................................23
Chương II: XÂY DỰNG GIAO DIỆN CHƯƠNG TRÌNH ..........................................24
2.1. KẾT NỐI DỮ LIỆU ...........................................................................................24
2.2. THIẾT KẾ GIAO DIỆN .....................................................................................26
TÀI LIỆU THAM KHẢO ............................................. Error! Bookmark not defined.

1
Chương I: XÂY DỰNG CƠ SỞ DỮ LIỆU

1.1. THIẾT KẾ CƠ SỞ DỮ LIỆU

1.1.1. Lược đồ cơ sở dữ liệu

1.1.2. Tạo bảng và kết nối bảng

-- Tạo cơ sở dữ liệu QLT_Nha Trang

CREATE DATABASE QLT_NHATRANG

USE QLT_NHATRANG;

2
-- Tạo bảng khách hàng --

CREATE TABLE KHACHHANG(

ID_KH INT NOT NULL,

TENKH NVARCHAR(100) NOT NULL,

EMAILKH NVARCHAR (45) NOT NULL,

SDTKH NVARCHAR (45) NOT NULL,

DIACHIKH NVARCHAR (200) NOT NULL,

CCCDKH NVARCHAR (40) NOT NULL,

CONSTRAINT [PK_KHACHHANG_ID_KH] PRIMARY KEY (ID_KH)

);

-- Tạo bảng đại lý--

CREATE TABLE DAILY

ID_DAILY INT NOT NULL,

TENDL NVARCHAR(100) NOT NULL,

DIACHI NVARCHAR (200 ) NOT NULL,

SDT NVARCHAR (45) NOT NULL,

CONSTRAINT [PK_DAILY_ID_DAILY] PRIMARY KEY (ID_DAILY)

);

-- Tạo bảng hướng dẫn viên --

CREATE TABLE HDV (

ID_HDV INT NOT NULL,

TENHDV NVARCHAR(100) NOT NULL,

DAICHI NVARCHAR(200) NOT NULL,

SDT NVARCHAR(45) NOT NULL,

EMAIL NVARCHAR(45) NOT NULL,

3
ID_DAILY INT NOT NULL,

CONSTRAINT [PK_HDV_ID_HDV] PRIMARY KEY (ID_HDV),

CONSTRAINT [HDV_DAILY_FK1] FOREIGN KEY (ID_DAILY)


REFERENCES DAILY(ID_DAILY)

);

-- Tạo bảng phương tiện --

CREATE TABLE PHUONGTIEN

ID_PHUONGTIEN INT NOT NULL,

TENPT NVARCHAR (45) NOT NULL,

SOCHO NVARCHAR (45) NOT NULL,

CONSTRAINT [PK_PHUONGTIEN_ID_PHUONGTIEN] PRIMARY KEY


(ID_PHUONGTIEN),

);

-- Tạo bảng tour phương tiện --

CREATE TABLE TOUR_PHUONGTIEN

ID_TOUR INT NOT NULL,

ID_PHUONGTIEN INT NOT NULL

CONSTRAINT [TOUR_PHUONGTIEN_PT_FK] FOREIGN KEY


(ID_PHUONGTIEN) REFERENCES PHUONGTIEN (ID_PHUONGTIEN),

CONSTRAINT [TOUR_PHUONGTIEN_TOUR_FK3] FOREIGN KEY


(ID_TOUR) REFERENCES TOUR(ID_TOUR)

);

4
-- Tạo bảng khách sạn --

CREATE TABLE KHACHSAN

ID_KHACHSAN INT NOT NULL,

TENKS NVARCHAR (100) NOT NULL,

DIACHI NVARCHAR(200) NOT NULL,

CONSTRAINT [PK_KHACHSAN_ID_KHACHSAN] PRIMARY KEY


(ID_KHACHSAN)

);

-- Tạo bảng điểm tham quan --

CREATE TABLE DTQ (

ID_DTQ INT NOT NULL,

TENDIADANH NVARCHAR(100) NOT NULL,

DIACHI NVARCHAR(200) NOT NULL,

ID_KS INT NOT NULL,

CONSTRAINT [PK_DTQ_ID_DTQ] PRIMARY KEY (ID_DTQ),

CONSTRAINT [DTQ_KHACHSAN_FK] FOREIGN KEY (ID_KS)


REFERENCES KHACHSAN(ID_KHACHSAN)

);

-- Tạo bảng tour --

CREATE TABLE TOUR

ID_TOUR INT NOT NULL,

TENTOUR NVARCHAR (100) NOT NULL,

NGAY_BD DATETIME NOT NULL DEFAULT GETDATE (),

5
NGAY_KT DATETIME NOT NULL DEFAULT GETDATE (),

GIA INT NOT NULL,

ID_HDV INT NOT NULL,

ID_DTQ INT NOT NULL,

CONSTRAINT [PK_TOUR_ID_TOUR] PRIMARY KEY (ID_TOUR),

CONSTRAINT [TOUR_HDV_FK] FOREIGN KEY (ID_HDV)


REFERENCES HDV (ID_HDV),

CONSTRAINT [TOUR_DTQ_FK1] FOREIGN KEY (ID_DTQ)


REFERENCES DTQ(ID_DTQ)

);

-- Tạo bảng vé --

CREATE TABLE VE

ID_VE VARCHAR(10) NOT NULL,

TENVE NVARCHAR (100) NOT NULL,

ID_TOUR INT NOT NULL,

ID_DAILY INT NOT NULL,

CONSTRAINT [PK_VE_ID_VE] PRIMARY KEY (ID_VE),

CONSTRAINT [VE_DAILY_FK] FOREIGN key (ID_DAILY)


REFERENCES DAILY(ID_DAILY),

CONSTRAINT [VE_TOUR_FK1] FOREIGN key (ID_TOUR)


REFERENCES TOUR(ID_TOUR)

);

6
-- Tạo bảng đặt vé --

create table DATVE

ID_VE VARCHAR(10) NOT NULL,

ID_KH INT NOT NULL,

CONSTRAINT [DATVE$VE_FK] FOREIGN KEY (ID_VE) REFERENCES


VE (ID_VE),

CONSTRAINT [DATVE$KH_FK1] FOREIGN KEY (ID_KH)


REFERENCES KHACHHANG (ID_KH)

);

-- Tạo bảng đăng ký --

CREATE TABLE DANGKY

ID_DANGKY VARCHAR(10) NOT NULL,

ID_KH INT NOT NULL,

ID_TOUR INT NOT NULL,

SOLUONGVE INT NOT NULL,

CONSTRAINT [PK_DANGKY_ID_DK] PRIMARY KEY (ID_DANGKY),

CONSTRAINT [DANGKY_KH_FK] FOREIGN KEY (ID_KH)


REFERENCES KHACHHANG (ID_KH),

CONSTRAINT [DANGKY_TOUR_FK2] FOREIGN KEY (ID_TOUR)


REFERENCES TOUR (ID_TOUR)

);

7
-- Tạo bảng tour điểm tham quan--

CREATE TABLE TOUR_DTQ

ID_TOUR INT NOT NULL,

ID_DTQ INT NOT NULL,

CONSTRAINT [TOUR_DTQ$TOUR_FK4] FOREIGN KEY (ID_TOUR)


REFERENCES TOUR (ID_TOUR),

CONSTRAINT [TOUR_DTQ$_FK1] FOREIGN KEY (ID_DTQ)


REFERENCES DTQ (ID_DTQ)

);

-- Tạo bảng tour khách sạn--

CREATE TABLE TOUR_KHACHSAN

ID_TOUR INT NOT NULL,

ID_KHACHSAN INT NOT NULL,

CONSTRAINT [TOUR_KHACHSAN$KS_FK1] FOREIGN KEY


(ID_KHACHSAN) REFERENCES KHACHSAN(ID_KHACHSAN),

CONSTRAINT [TOUR_KHACHSAN$TOUR_FK1] FOREIGN KEY


(ID_TOUR) REFERENCES

TOUR (ID_TOUR)

);

1.1.3. Thêm dữ liệu

-- Thêm dữ liệu cho bảng khách hàng --

INSERT INTO
KHACHHANG(ID_KH,TENKH,EMAILKH,SDTKH,DIACHIKH,CCCDKH)

VALUES

8
('201',N'Nguyễn Văn An','annguyen315@gmail.com','0925634576',N'Hà
Nội','175864'),

('202',N'Trần Thị Vân','vantranthi126@gmail.com','0532461789',N'Nam


Định','124593'),

('203',N'Ngô Văn Cần','cannguyen1998@gmail.com','0965375648',N'Quảng


Nam','233953'),

('204',N'Dương Văn Công','vancong727@gmail.com','0863547678',N'Đà


Nẵng','327456'),

('205',N'Đinh Trọng Kiên','kiennguyen2k3@gmail.com','0967286123',N'Phú


Yên','486173'),

('206',N'Phạm Văn Thành','thanh186@gmal.com','0976020145',N'Bình


Thuận','359671'),

('207',N'Nguyễn Văn Kiên','nguyenkien369@gmail.com','0326475981',N'Hồ Chí


Minh','561234'),

('208',N'Lê Văn Trường','truongvan@gmail.com','0369125513',N'Đồng Nai','125369'),

('209',N'Trần Thái Văn Thanh','thanhtran569@gmail.com','0362975613',N'Lâm


Đồng','458671'),

('210',N'Bùi Ánh Ngọc','anhngoc102@gmail.com','08659423176',N'Cà Mau','586794');

-- Thêm dữ liệu cho bảng đại lý --

INSERT INTO DAILY

VALUES

('101',N'Hoàng Long','Nha Trang','0568945267'),

('102',N'Vietravel','Nha Trang','0965287459'),

('103',N'An Nam,','Nha Trang','0758965249'),

('104',N'Today Travel','Nha Trang','0356249861'),

('105',N'Việt Asian','Nha Trang','0853624991');

9
-- Thêm dữ liệu cho bảng hướng dẫn viên--

INSERT INTO HDV

VALUES

('501',N'Nguyễn Thu Thủy',N'06 Nguyễn Văn Trỗi, Nha


Trang','0365894678','thuthuy698@gmail.com','102'),

('502',N'Trần Minh Công',N'192 Hùng Vương, Nha


Trang','0965289047','congtran965@gmail.com','103'),

('503',N'Hoàng Văn Danh',N'146 Nguyễn Huệ, Diên


Khánh','0357621498','vandanhhoang@gmai.com','105'),

('504',N'Đào Văn Bằng',N'278 Hai Bà Trưng, Cam


Ranh','0248659713','banbang713@gmail.com','102'),

('505',N'Phan Thị Hiền',N'12 Thái Nguyên, Nha


Trang','0956278143','hienphan259@gmail.com','101'),

('506',N'Đinh Thị Diễm',N'126 Đoàn Trần Nghiệp, Nha


Trang','0652304529','diemdinh529@gmail.com','103'),

('507',N'Bùi Văn Huấn',N'257 Mai Xuân Thưởng, Ninh


Hòa','0786592348','huanbui278@gmail.com','104'),

('508',N'Ngô Thị Huyền',N'569 Lê Thánh Tông, Nha


Trang','0986572346','huyenngothi@gmail.com','101'),

('509',N'Lê Thúy Hằng',N'12 Trần Quý Cáp, Diên


Khánh','0475896548','thuyhangle48@gmail.com','102'),

('510',N'Lê Thị Thu Vân',N'86 Trần Phú, Diên


Khánh','0956243578','thuvan243@gmail.com','105');

-- Thêm dữ liệu cho bảng phương tiện --

INSERT INTO PHUONGTIEN

VALUES

('301','Ôtô','4'),

('302','Ôtô 7','7'),

10
('303','Xe 16 ','16'),

('304','Xe 30','30'),

('305','Xe Khách','45'),

('306','Xe máy','2');

-- Thêm dữ liệu cho bảng tour phương tiện --

INSERT INTO TOUR_PHUONGTIEN(ID_TOUR,ID_PHUONGTIEN)

VALUES

('601','301'),

('608','301'),

('604','303'),

('602','304'),

('604','305'),

('609','301'),

('607','302'),

('607','306'),

('603','304'),

('610','301');

-- Thêm dữ liệu cho bảng khách sạn --

INSERT INTO KHACHSAN

VALUES

('401','Shoho Hotel',N'21/7 Đặng Tất, Vĩnh Hải, Nha Trang'),

('402','Venue Hotel',N'24 Tôn Đản, Lộc Thọ, Nha Trang'),

('403','Alana Beach Hotel',N'7 Trần Quang Khải, Lộc Thọ, Nha Trang'),

('404','Ibis Styles',N'86 Hùng Vương, Nha Trang'),

('405','The Swan',N'5a Tuệ Tĩnh, Nha Trang');

11
-- Thêm dữ liệu cho bảng vé --

INSERT INTO VE (ID_VE,TENVE,ID_TOUR,ID_DAILY)

VALUES

('001',N'Vé thườnng','602','102'),

('002',N'Vé VIP','604','105'),

('003',N'Vé Trẻ em','610','103'),

('004',N'Vé người lớn','609','102'),

('005',N'Vé khuyến mãi','605','101'),

('006',N'Vé thường','601','104'),

('007',N'Vé VIP','603','103'),

('008',N'Vé trẻ em','605','103'),

('009',N'Vé người lớn','610','104'),

('010',N'Vé khuyến mãi','603','101');

-- Thêm dữ liệu cho bảng đặt vé --

INSERT INTO DATVE

VALUES

('001','201'),

('006','206'),

('007','207'),

('009','203'),

('008','205'),

('002','209'),

('004','203');

12
-- Thêm dữ liệu cho bảng đăng ký --

INSERT INTO DANGKY

VALUES

('DK01','201','602','4'),

('DK02','203','603','16'),

('DK03','209','601','45'),

('DK04','203','609','1'),

('DK05','207','610','30'),

('DK06','206','607','10'),

('DK07','201','605','5');

-- Thêm dữ liệu cho bảng điểm tham quan --

INSERT INTO DTQ

VALUES

('701',N'Tháp Bà Ponagar',N'61 Hai Tháng Tư, Vĩnh Phước','401'),

('702',N'Chùa Long Sơn',N'22Đ, 23 Tháng 10, Phương Sài ','403'),

('703',N'Viện Hải Dương Học',N'1 Cầu Đá, Nha Trang','405'),

('704',N'Nhà Thờ Núi',N'1 Thái Nguyên, Phước Tân','405'),

('705',N'VinWonders Nha Trang',N'Hòn Tre, Nha Trang','403'),

('706',N'I-resort Nha Trang',N'Xuân Ngọc, Vĩnh Ngọc','402'),

('707',N'Nhà Hát Đó',N'Phạm Văn Đồng, Vĩnh Hải','401'),

('708',N'Tháp Trầm Hương',N'Quảng Trường 2/4, Nha Trang','404');

-- Thêm dữ liệu cho bảng tour--

INSERT INTO TOUR

VALUES

('601',N'Vui chơi','2023-01-10 07:00:00','2023-01-15 21:00:00','1000000','502','702'),

('602',N'Đi thôi','2023-02-15 08:00:00','2023-02-18 22:00:00','700000','503','701'),

13
('603',N'Đi để trở về','2023-03-08 07:30:00','2023-03-10 10:00:00','500000','506','703'),

('604',N'Tham quan','2023-04-21 07:00:00','2023-04-30


07:00:00','1700000','507','704'),

('605',N'Tuổi trẻ','2023-05-01 07:00:00','2023-05-05 21:00:00','1000000','510','702'),

('606',N'Thư giãn','2023-06-17 09:00:00','2023-06-24 10:00:00','1600000','509','705'),

('607',N'Thiên nhiên','2023-07-10 06:00:00','2023-07-17


23:00:00','1500000','508','708'),

('608',N'Bạn bè','2023-08-13 07:00:00','2023-08-16 12:00:00','700000','501','703'),

('609',N'Khám phá','2023-09-12 10:00:00','2023-09-20 07:00:00','1700000','506','707'),

('610',N'Hạnh phúc','2023-10-10 07:00:00','2023-10-15


12:00:00','1000000','507','706');

-- Thêm dữ liệu cho bảng tour điểm tham quan--

INSERT INTO TOUR_DTQ

VALUES

('602','701'),

('608','703'),

('603','707'),

('610','704'),

('602','702'),

('610','708'),

('603','706');

-- Thêm dữ liệu cho bảng khách sạn--

INSERT INTO TOUR_KHACHSAN

VALUES

('601','402'),

('602','401'),

14
('603','403'),

('604','404'),

('605','405'),

('606','401'),

('607','402'),

('608','405'),

('609','404'),

('610','401');

1.2. TRUY VẤN DỮ LIỆU

1.2.1. Các câu truy vấn đơn giản


--1. Truy vấn danh sách khách hàng đã đặt vé, bao gồm tên khách hàng và tên vé
SELECT KH.TENKH, VE.TENVE
FROM DATVE DV
JOIN KHACHHANG KH ON DV.ID_KH = KH.ID_KH
JOIN VE ON DV.ID_VE = VE.ID_VE;

--2. Truy vấn danh sách tour cùng thông tin hướng dẫn viên và địa điểm tham quan
SELECT T.TENTOUR, HDV.TENHDV, DTQ.TENDIADANH
FROM TOUR T
JOIN HDV ON T.ID_HDV = HDV.ID_HDV
JOIN DTQ ON T.ID_DTQ = DTQ.ID_DTQ;

--3. Truy vấn danh sách tour cùng thông tin hướng dẫn viên và địa điểm tham quan
SELECT T.TENTOUR, PT.TENPT
FROM TOUR_PHUONGTIEN TP
JOIN TOUR T ON TP.ID_TOUR = T.ID_TOUR
JOIN PHUONGTIEN PT ON TP.ID_PHUONGTIEN = PT.ID_PHUONGTIEN
WHERE PT.TENPT = N'Ôtô';

1.2.2. Câu lệnh truy vấn với Aggregate Functions


--1. Tổng số khách hàng
SELECT COUNT(*) AS TotalCustomers
FROM KHACHHANG;

--2. Truy vấn tổng số khách hàng đăng ký tham gia mỗi tour
SELECT T.TENTOUR, COUNT(DK.ID_KH) AS SoLuongKhachHang

15
FROM DANGKY DK
JOIN TOUR T ON DK.ID_TOUR = T.ID_TOUR
GROUP BY T.TENTOUR;

--3. Truy vấn tổng số khách sạn được sử dụng trong các tour và số lượng tour tương
ứng
SELECT KS.TENKS, COUNT(TK.ID_TOUR) AS SoLuongTour
FROM TOUR_KHACHSAN TK
JOIN KHACHSAN KS ON TK.ID_KHACHSAN = KS.ID_KHACHSAN
GROUP BY KS.TENKS;

--4. Giá vé trung bình của các tour


SELECT AVG(GIA) AS AverageTourPrice
FROM TOUR;

--5. Số lượng vé bán được cho từng đại lý


SELECT ID_DAILY, COUNT(*) AS TicketsSold
FROM VE GROUP BY ID_DAILY;

--6. Truy vấn tổng số khách hàng và số lượng vé họ đã đặt, nhóm theo đại lý
SELECT DL.TENDL, COUNT(DISTINCT DV.ID_KH) AS SoLuongKhachHang,
COUNT(DV.ID_VE) AS SoLuongVe
FROM DATVE DV
JOIN VE V ON DV.ID_VE = V.ID_VE
JOIN DAILY DL ON V.ID_DAILY = DL.ID_DAILY
GROUP BY DL.TENDL;

--7. Truy vấn đại lý bán được nhiều vé nhất


SELECT DL.TENDL, COUNT(V.ID_VE) AS SoLuongVeBanDuoc
FROM VE V
JOIN DAILY DL ON V.ID_DAILY = DL.ID_DAILY
GROUP BY DL.TENDL
ORDER BY SoLuongVeBanDuoc DESC
LIMIT 1;

1.2.3. Câu lệnh truy vấn với mệnh đề Having


--1. Đại lý bán được nhiều hơn 2 vé
SELECT ID_DAILY, COUNT(*) AS TicketsSold
FROM VE
GROUP BY ID_DAILY
HAVING COUNT(*) > 2;

--2. Khách hàng đăng ký hơn 1 tour


SELECT ID_KH, COUNT(*) AS ToursRegistered
FROM DANGKY
GROUP BY ID_KH
HAVING COUNT(*) > 1;

16
--3. Hướng dẫn viên hướng dẫn hơn 1 tour
SELECT ID_HDV, COUNT(*) AS ToursGuided
FROM TOUR
GROUP BY ID_HDV
HAVING COUNT(*) > 1;

--4. Các tour có tổng giá trị vé bán được trên 1 triệu
SELECT ID_TOUR, SUM(GIA) AS TotalRevenue
FROM TOUR
GROUP BY ID_TOUR
HAVING SUM(GIA) > 1000000;

--5. Khách sạn phục vụ cho hơn 1 tour


SELECT ID_KHACHSAN, COUNT(*) AS ToursHosted
FROM TOUR_KHACHSAN
GROUP BY ID_KHACHSAN
HAVING COUNT(*) > 1;

1.2.4. Câu lệnh truy vấn lớn nhất/ nhỏ nhất


--1. Tour có giá cao nhất
SELECT *
FROM TOUR
WHERE GIA = (SELECT MAX(GIA) FROM TOUR);

--2. Tour có giá thấp nhất


SELECT *
FROM TOUR
WHERE GIA = (SELECT MIN(GIA) FROM TOUR);

--3. Khách hàng mua vé sớm nhất


SELECT *
FROM KHACHHANG
WHERE ID_KH = (SELECT MIN(ID_KH) FROM DATVE);

1.2.5. Câu lệnh truy vấn Không/chưa có (Not In và Left/right join)


--1. Các khách hàng chưa mua vé
SELECT *
FROM KHACHHANG
WHERE ID_KH NOT IN (SELECT ID_KH FROM DATVE);

--2. Các tour chưa được đăng ký


SELECT *

17
FROM TOUR
WHERE ID_TOUR NOT IN (SELECT ID_TOUR FROM DANGKY);

--3. Các đại lý chưa bán vé


SELECT d.*
FROM DAILY d
LEFT JOIN VE v ON d.ID_DAILY = v.ID_DAILY
WHERE v.ID_DAILY IS NULL;

--4. Các hướng dẫn viên chưa có tour nào


SELECT h.*
FROM HDV h
LEFT JOIN TOUR t ON h.ID_HDV = t.ID_HDV
WHERE t.ID_HDV IS NULL;

--5. Các khách sạn chưa phục vụ tour nào


SELECT k.*
FROM KHACHSAN k
LEFT JOIN TOUR_KHACHSAN tk ON k.ID_KHACHSAN = tk.ID_KHACHSAN
WHERE tk.ID_KHACHSAN IS NULL;

1.2.6. Câu lệnh truy vấn Hợp, Giao, Trừ


--1. Hợp danh sách tất cả khách hàng và hướng dẫn viên (chỉ chọn tên và email)
SELECT TENKH AS Name, EMAILKH AS Email
FROM KHACHHANG
UNION
SELECT TENHDV AS Name, EMAIL AS Email
FROM HDV;

--2. Giao của các khách hàng và đại lý có cùng số điện thoại
SELECT TENKH AS Name, SDTKH AS Phone
FROM KHACHHANG
INTERSECT
SELECT TENDL AS Name, SDT AS Phone
FROM DAILY;

--3. Khách hàng không phải là hướng dẫn viên (dựa trên tên và email)
SELECT TENKH AS Name, EMAILKH AS Email
FROM KHACHHANG
EXCEPT
SELECT TENHDV AS Name, EMAIL AS Email
FROM HDV;

1.2.7. Câu lệnh truy vấn sử dụng phép Chia


--1. Các khách hàng đã đặt vé cho tất cả các tour

18
SELECT ID_KH
FROM KHACHHANG k
WHERE NOT EXISTS (
SELECT ID_TOUR
FROM TOUR t
WHERE NOT EXISTS (
SELECT ID_VE
FROM DATVE d
WHERE d.ID_KH = k.ID_KH
AND d.ID_VE IN (SELECT ID_VE FROM VE v WHERE v.ID_TOUR =
t.ID_TOUR)
)
);

--2. Các tour có tất cả các khách hàng đã đăng ký ít nhất một vé
SELECT ID_TOUR
FROM TOUR t
WHERE NOT EXISTS (
SELECT ID_KH
FROM KHACHHANG k
WHERE NOT EXISTS (
SELECT ID_VE
FROM DATVE d
WHERE d.ID_KH = k.ID_KH
AND d.ID_VE IN (SELECT ID_VE FROM VE v WHERE v.ID_TOUR =
t.ID_TOUR)
)
);

1.2.8. Câu lệnh truy vấn Update, Delete


--1. Cập nhật email của khách hàng
UPDATE KHACHHANG
SET EMAILKH = 'newemail@example.com'
WHERE ID_KH = 201;

--2. Xóa một khách hàng


DELETE FROM KHACHHANG
WHERE ID_KH = 210;

--3. Cập nhật giá tour


UPDATE TOUR
SET GIA = GIA * 1.1
WHERE ID_TOUR = 601;

--4. Xóa một vé


DELETE FROM VE
WHERE ID_VE = 'HD09';

19
--5. Cập nhật số điện thoại của hướng dẫn viên
UPDATE HDV
SET SDT = '0912345678'
WHERE ID_HDV = 503;

--6. Xóa một đại lý


DELETE FROM DAILY
WHERE ID_DAILY = 105;

--7. Cập nhật địa chỉ khách sạn


UPDATE KHACHSAN
SET DIACHI = 'New Address'
WHERE ID_KHACHSAN = 404;

1.2.9. Thủ tục, hàm

1.2.9.1. Thủ tục


-- Thủ tục 1: Lấy thông tin khách hàng theo ID
CREATE PROCEDURE sp_GetCustomerByID
@ID_KH INT
AS
BEGIN
SELECT * FROM KHACHHANG WHERE ID_KH = @ID_KH;
END;
GO
-- Thủ tục này dùng để truy vấn thông tin khách hàng dựa trên ID của họ.

-- Thủ tục 2: Cập nhật địa chỉ khách hàng


CREATE PROCEDURE sp_UpdateCustomerAddress
@ID_KH INT,
@DIACHIKH NVARCHAR(200)
AS
BEGIN
UPDATE KHACHHANG SET DIACHIKH = @DIACHIKH WHERE ID_KH =
@ID_KH;
END;
GO
-- Thủ tục này cho phép cập nhật địa chỉ cho một khách hàng cụ thể.

-- Thủ tục 3: Xóa hướng dẫn viên


CREATE PROCEDURE sp_DeleteGuide
@ID_HDV INT
AS
BEGIN
DELETE FROM HDV WHERE ID_HDV = @ID_HDV;
END;
GO

20
-- Thủ tục này dùng để xóa thông tin của một hướng dẫn viên.

-- Thủ tục 4: Thêm mới tour


CREATE PROCEDURE sp_AddNewTour
@TENTOUR NVARCHAR(100),
@NGAY_BD DATETIME,
@NGAY_KT DATETIME,
@GIA INT,
@ID_HDV INT,
@ID_DTQ INT
AS
BEGIN
INSERT INTO TOUR (TENTOUR, NGAY_BD, NGAY_KT, GIA, ID_HDV,
ID_DTQ)
VALUES (@TENTOUR, @NGAY_BD, @NGAY_KT, @GIA, @ID_HDV,
@ID_DTQ);
END;
GO
-- Thủ tục này dùng để thêm một tour mới vào cơ sở dữ liệu.

-- Thủ tục 5: Lấy danh sách các tour và hướng dẫn viên
CREATE PROCEDURE sp_GetToursAndGuides
AS
BEGIN
SELECT T.ID_TOUR, T.TENTOUR, H.TENHDV
FROM TOUR T
INNER JOIN HDV H ON T.ID_HDV = H.ID_HDV;
END;
GO
-- Thủ tục này truy vấn danh sách các tour cùng với tên của hướng dẫn viên đi
kèm.

1.2.9.2. Hàm
-- Hàm 1: Liệt kê tên của khách hàng đã đặt vé cho các tour do một hướng dẫn 502
dẫn dắt
SELECT KHACHHANG.TENKH
FROM KHACHHANG
JOIN DANGKY ON KHACHHANG.ID_KH = DANGKY.ID_KH
JOIN TOUR ON DANGKY.ID_TOUR = TOUR.ID_TOUR
WHERE TOUR.ID_HDV = '502';
--Hàm 2: Tìm tour có số lượng điểm đến khác nhau cao nhất
SELECT TOP 1 TENTOUR, COUNT(DISTINCT ID_DTQ) AS DestinationCount
FROM TOUR
JOIN TOUR_DTQ ON TOUR.ID_TOUR = TOUR_DTQ.ID_TOUR
GROUP BY TENTOUR
ORDER BY DestinationCount DESC;
--Hàm 3: Tính tổng doanh thu từ việc bán vé của mỗi đại lý du lịch

21
SELECT DAILY.TENDL, SUM(TOUR.GIA * DANGKY.SOLUONGVE) AS
TotalRevenue
FROM DAILY
JOIN VE ON DAILY.ID_DAILY = VE.ID_DAILY
JOIN TOUR ON VE.ID_TOUR = TOUR.ID_TOUR
JOIN DANGKY ON TOUR.ID_TOUR = DANGKY.ID_TOUR AND VE.ID_TOUR
= DANGKY.ID_TOUR
GROUP BY DAILY.TENDL;
--Hàm 4: Tìm chi tiết các tour (bao gồm tên tour, ngày bắt đầu, ngày kết thúc, và tên
hướng dẫn viên) có ít nhất một phương tiện có trên 30 chỗ ngồi
SELECT TOUR.TENTOUR, TOUR.NGAY_BD, TOUR.NGAY_KT,
HDV.TENHDV
FROM TOUR
JOIN TOUR_PHUONGTIEN ON TOUR.ID_TOUR =
TOUR_PHUONGTIEN.ID_TOUR
JOIN PHUONGTIEN ON TOUR_PHUONGTIEN.ID_PHUONGTIEN =
PHUONGTIEN.ID_PHUONGTIEN
JOIN HDV ON TOUR.ID_HDV = HDV.ID_HDV
WHERE CAST(PHUONGTIEN.SOCHO AS INT) > 30;
--Hàm 5: Liệt kê tên của các khách hàng đã đặt tất cả các loại vé
SELECT KHACHHANG.TENKH
FROM KHACHHANG
WHERE NOT EXISTS (
SELECT TENVE
FROM VE
EXCEPT
SELECT VE.TENVE
FROM VE
JOIN DATVE ON VE.ID_VE = DATVE.ID_VE
WHERE DATVE.ID_KH = KHACHHANG.ID_KH
);

1.2.10. Trigger
-- Trigger 1: Kiểm tra ngày kết thúc tour phải sau ngày bắt đầu
CREATE TRIGGER trg_CheckTourDates
ON TOUR
AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS(SELECT * FROM inserted WHERE NGAY_KT <= NGAY_BD)
BEGIN
RAISERROR ('Ngày kết thúc tour phải sau ngày bắt đầu.', 16, 1);
ROLLBACK TRANSACTION;
END
END;
GO
-- Trigger này đảm bảo rằng ngày kết thúc của tour không thể trước ngày bắt đầu.

22
-- Trigger 2: Cập nhật số lượng vé còn lại khi có người đăng ký tour
CREATE TRIGGER trg_UpdateRemainingTickets
ON DANGKY
AFTER INSERT
AS
BEGIN
UPDATE TOUR
SET SOLUONGVE = SOLUONGVE - (SELECT SOLUONGVE FROM inserted)
WHERE ID_TOUR = (SELECT ID_TOUR FROM inserted);
END;
GO
-- Trigger này tự động cập nhật số lượng vé còn lại của tour khi có đăng ký mới.

-- Trigger 3: Kiểm tra email khách hàng có hợp lệ khi thêm mới
CREATE TRIGGER trg_ValidateCustomerEmail
ON KHACHHANG
BEFORE INSERT
AS
BEGIN
IF EXISTS(SELECT * FROM inserted WHERE NOT EMAILKH LIKE '%@%')
BEGIN
RAISERROR ('Email không hợp lệ.', 16, 1);
ROLLBACK TRANSACTION;
END
END;
GO
-- Trigger này kiểm tra xem email của khách hàng có chứa ký tự '@' khi thêm
mới vào cơ sở dữ liệu.

1.2.11. Phân quyền


-- Tạo người dùng và cấp quyền
CREATE USER UserTourManager WITHOUT LOGIN;
GRANT SELECT, INSERT, UPDATE, DELETE ON TOUR TO UserTourManager;
-- Tạo người dùng quản lý tour với quyền thêm, sửa, xóa và truy vấn dữ liệu trên bảng
TOUR.

CREATE USER UserGuideManager WITHOUT LOGIN;


GRANT SELECT, INSERT, UPDATE ON HDV TO UserGuideManager;
-- Tạo người dùng quản lý hướng dẫn viên với quyền thêm, sửa và truy vấn dữ liệu
trên bảng HDV.

CREATE USER UserCustomerService WITHOUT LOGIN;


GRANT SELECT, UPDATE ON KHACHHANG TO UserCustomerService;
-- Tạo người dùng dịch vụ khách hàng với quyền sửa và truy vấn dữ liệu trên bảng
KHACHHANG.

23
Chương II: XÂY DỰNG GIAO DIỆN CHƯƠNG TRÌNH

2.1. KẾT NỐI DỮ LIỆU


Nhóm sử dụng Winform (Window Forms) với ngôn ngữ lập trình C# trên
Visual Studio 2022 để xây dựng giao diện và kết nối cơ sở dữ liệu.
Bước 1: Mở SQL Server Management Studio để lấy Server Name

Bước 2: Tại Visual Studio, mở giao diện chương trình đã được xây dựng → chọn Tool
→ Connect to Database → Microsoft SQL Server

24
Bước 3: Tại Add Connection, dán Server Name đã có được từ bước 1 → chọn tên cơ
sở dữ liệu (database name) mà người dùng muốn kết nối với giao diện chương trình

Bước 4: Chọn Advanced và sao chép phần Data Source (string str = @"Data
Source=LAPTOP-09F30CN6\SQLEXPRESS;Initial Catalog=NT;Integrated
Security=True;TrustServerCertificate=True";)
Bước 5: Thoát ra, tại phần code của giao diện chương trình, khai báo SqlConnection
từ “using System.Data.SqlClient;” theo cách của bạn, ví dụ đơn giản như sau
string str = @"Data Source=LAPTOP-09F30CN6\SQLEXPRESS;Initial
Catalog=NT;Integrated Security=True;TrustServerCertificate=True";
SqlConnection connection = new SqlConnection(connectionSTR);
Bước 6: Quay lại bước 3, bấm Test Connection để kiểm tra kết nối và OK để hoàn
thành việc kết nối dữ liệu. Tại những lần kết nối sau này chỉ cần làm từ bước 1 đến
bước 3 trong trường hợp file cơ sở dữ liệu muốn kết nối không thay đổi.

25
2.2. THIẾT KẾ GIAO DIỆN
Giao diện bao đầu khi vào quản lý cơ sở dữ liệu

Giao diện khi chọn vào Hướng dẫn viên

26

You might also like