Chương 1: TỔNG QUAN VỀ HỆ QUẢN TRỊ CSDL1.1.Ðịnh nghĩa:- Hệ quản trị cơ sở dữ liệu Database Management System - DBMS: Là một hệ thống phần mềm cho phép tạo lập cơ sở dữ liệu và điều khiển
TỔNG QUAN VỀ HỆ QUẢN TRỊ CSDL
Ðịnh nghĩa: 8 1.2 Các khả năng của hệ quản trị CSDL 8 1.3 Đặc điểm của một hệ quản trị CSDL 9 1.3.1 Sự trừu tượng hoá dữ liệu: 9 1.3.2 Ngôn ngữ cơ sở dữ liệu 10 1.3.3 Xử lý câu hỏi 11 1.3.4 Quản trị giao dịch 11 1.3.5 Quản lý lưu trữ 12 1.4 Kiến trúc của một hệ quản trị CSDL 12 1.5 Các chức năng của hệ quản trị CSDL quan hệ 14 1.5.1 Các khái niệm trong mô hình dữ liệu quan hệ 14 1.5.2 Các chức năng của hệ quản trị CSDL quan hệ 16 Chương 2: HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU SQL SERVER
- Hệ quản trị cơ sở dữ liệu (Database Management System - DBMS): Là một hệ thống phần mềm cho phép tạo lập cơ sở dữ liệu và điều khiển mọi truy nhập đối với cơ sở dữ liệu đó.
Trên thị trường phần mềm hiện nay ở Việt Nam đã xuất hiện khá nhiều phần mềm hệ quản trị cơ sở dữ liệu như: Microsoft Access, Foxpro, DB2, SQL Server, Oracle,.v.v…
- Hệ quản trị cơ sở dữ liệu quan hệ (Relation Database Management System - RDBMS) là một hệ quản trị cơ sở dữ liệu theo mô hình quan hệ.
1.2 Các khả năng của hệ quản trị CSDL
Có hai khả năng chính cho phép phân biệt các hệ quản trị cơ sở dữ liệu với các kiểu hệ thống lập trình khác: i Khả năng quản lý dữ liệu tồn tại lâu dài: đặc điểm này chỉ ra rằng có một cơ sở dữ liệu tồn tại trong một thời gian dài, nội dung của cơ sở dữ liệu này là các dữ liệu mà hệ quản trị CSDL truy nhập và quản lý. ii Khả năng truy nhập các khối lượng dữ liệu lớn một cách hiệu quả.
Ngoài hai khả năng cơ bản trên, hệ quản trị CSDL còn có các khả năng khác mà có thể thấy trong hầu hết các hệ quản trị CSDL đó là: iii Hỗ trợ ít nhất một mô hình dữ liệu hay một sự trừu tượng toán học mà qua đó người sử dụng có thể quan sát dữ liệu. iv Ðảm bảo tính độc lập dữ liệu hay sự bất biến của chương trình ứng dụng đối với các thay đổi về cấu trúc trong mô hình dữ liệu. v Hỗ trợ các ngôn ngữ cao cấp nhất định cho phép người sử dụng định nghĩa cấu trúc dữ liệu, truy nhập dữ liệu và thao tác dữ liệu. vi Quản lý giao dịch, có nghĩa là khả năng cung cấp các truy nhập đồng thời, đúng đắn đối với CSDL từ nhiều người sử dụng tại cùng một thời điểm. vii Ðiều khiển truy nhập, có nghĩa là khả năng hạn chế truy nhập đến các dữ liệu bởi những người sử dụng không được cấp phép và khả năng kiểm tra tính đúng đắn của CSDL. viii Phục hồi dữ liệu, có nghĩa là có khả năng phục hồi dữ liệu, không làm mất mát dữ liệu với các lỗi hệ thống.
1.3 Đặc điểm của một hệ quản trị CSDL
1.3.1 Sự trừu tượng hoá dữ liệu: Ðể cho hệ thống có thể sử dụng được, hệ quản trị CSDL phải tra cứu hay tìm kiếm dữ liệu một cách có hiệu quả Ðiều này dẫn đến việc thiết kế các cấu trúc dữ liệu phức tạp để biểu diễn dữ liệu trong CSDL này Người phát triển che dấu tính phức tạp này thông qua một số mức trừu tượng để đơn giản hoá các tương tác của người sử dụng đối với hệ thống.
Hình 1.1 Ba mức trừu tượng dữ liệu
- Mức vật lý: Mức thấp nhất của sự trừu tượng mô tả dữ liệu được lưu trữ một cách thực sự như thế nào Tại mức vật lý, các cấu trúc dữ liệu mức thấp phức tạp được mô tả chi tiết.
- Mức logic: Mức cao tiếp theo của sự trừu tượng hoá mô tả những dữ liệu nào được lưu trữ và các mối quan hệ nào tồn tại giữa các dữ liệu này Mức logic của sự trừu tượng được xác định người quản trị CSDL, cụ thể phải quyết định những thông tin gì được lưu trữ trong CSDL.
Downloaded by MON MON (monmon2@gmail.com)
- Mức khung nhìn: Mức cao nhất của sự trừu tượng mô tả chỉ một phần của toàn bộ CSDL Mặc dù sử dụng các cấu trúc đơn giản mức logic, một số phức tập vẫn còn tồn tại do kích thước lớn của CSDL Thực chất những người sử dụng chỉ cần truy nhập đến một phần CSDL, do vậy sự tương tác của họ với hệ thống này là đơn giản hoá và mức khung nhìn của sự trừu tượng được xác định Hệ thống có thể được cung cấp nhiều khung nhìn đối với cùng một cơ sở dữ liệu.
1.3.2 Ngôn ngữ cơ sở dữ liệu
Một hệ quản trị cơ sở dữ liệu thường cung cấp hai kiểu ngôn ngữ khác nhau đó là: ngôn ngữ mô tả sơ đồ cơ sở dữ liệu và ngôn ngữ biểu diễn các truy vấn và các cập nhật cơ sở dữ liệu.
- Ngôn ngữ định nghĩa dữ liệu (Data Definition Language - DDL)
+ Một sơ đồ CSDL đặc tả bởi một tập các định nghĩa được biểu diễn bởi một ngôn ngữ đặc biệt được gọi là ngôn ngữ định nghĩa dữ liệu Kết quả của việc dịch các ngôn ngữ này là một tập các bảng được lưu trữ trong một tệp đặc biệt được gọi là từ điển dữ liệu hay thư mục dữ liệu.
+ Một từ điển dữ liệu là một tệp chứa các siêu dữ liệu có nghĩa là các dữ liệu về dữ liệu Tệp này được tra cứu trước khi dữ liệu thực sự được đọc hay được sửa đổi trong hệ CSDL.
+ Cấu trúc và các phương pháp truy nhập được sử dụng bởi hệ CSDL được đặc tả bởi một tập các định nghĩa trong một kiểu đặc biệt của DDL là ngôn ngữ định nghĩa và lưu trữ dữ liệu.
- Ngôn ngữ thao tác dữ liệu (Data Manipulation Language - DML):
+ Các yêu cầu về thao tác dữ liệu bao gồm:
● Tìm kiếm thông tin được lưu trữ trong CSDL.
Downloaded by MON MON (monmon2@gmail.com)
● Thêm thông tin mới vào CSDL.
● Xoá thông tin từ CSDL.
● Thay đổi thông tin được lưu trữ trong CSDL.
+ Một ngôn ngữ thao tác dữ liệu (DML) là một ngôn ngữ cho phép người sử dụng truy nhập hay thao tác dữ liệu được tổ chức bởi mô hình dữ liệu thích hợp Có hai kiểu ngôn ngữ thao tác dữ liệu cơ bản:
● Các DML thủ tục đòi hỏi người sử dụng phải đặc tả dữ liệu nào cần tìm kiếm và tìm kiếm những dữ liệu này như thế nào.
● Các DML phi thủ tục đòi hỏi người sử dụng đặc tả dữ liệu nào cần tìm kiếm mà không phải đặc tả tìm kiếm những dữ liệu này như thế nào.
Công việc của bộ xử lý câu hỏi là biến đổi một truy vấn hay một thao tác CSDL có thể được biểu diễn ở các mức cao thành một dãy các yêu cầu đối với các dữ liệu lưu trữ trong CSDL.
TỔNG QUAN VỀ HỆ QUẢN TRỊ SQL SERVER 20 1Các thành phần của SQL Server 20 1.1Các thành phần của SQL Server 2000 20 a) Các thành phần server
Microsoft SQL Server là một hệ quản trị cơ sở dữ liệu quan hệ (Relation Database Management System - RDBMS), cung cấp cách tổ chức dữ liệu bằng cách lưu chúng vào các bảng Dữ liệu quan hệ được lưu trữ trong các bảng và các quan hệ đó được định nghĩa giữa các bảng với nhau.
Người dùng truy cập dữ liệu trên Server thông qua ứng dụng Người quản trị CSDL truy cập Server trực tiếp để thực hiện các chức năng cấu hình, quản trị và thực hiện các thao tác bảo trì CSDL.
Ngoài ra, SQL Server là một CSDL có khả năng mở rộng, nghĩa là chúng có thể lưu một lượng lớn dữ liệu và hỗ trợ tính năng cho phép nhiều người dùng truy cập dữ liệu đồng thời.
Các phiên bản của SQL Server phổ biến hiện này trên thị trường là SQL Server 7.0, SQL Server 2000, SQL Server 2005, SQL Server 2008 Trong giáo trình này, tác giả giới thiệu với các bạn trên hai phiên bản SQL Server 2000, SQL Server 2005.
2.1.1Các thành phần của SQL Server 2.1.1.1Các thành phần của SQL Server 2000
SQL Server cung cấp một số loại thành phần khác nhau:
- Nhân của nó là các thành phần server, các thành phần này được thực hiện như windows 32 bit.
- Các công cụ đồ họa dựa trên client và các dòng tiện ích phục vụ cho công tác quản trị Các công cụ và tiện ích này sử dụng sử dụng các thành phần giao tiếp client do SQL Server 2000 cung cấp Các thành phần giao tiếp cung cấp các cách khác nhau mà trong đó ứng dụng client có thể truy cập dữ liệu thông qua các thành phần server. a) Các thành phần server
Các thành phần server của SQL Server 2000 thường được thực hiện như các dịch vụ Windows 32 bit Do đó các dịch vụ của SQL Server và SQL Server Agent có thể chạy như các ứng dụng độc lập trên bất kỳ nền tảng nào được hỗ trợ hệ điều hành Windows Các thành phần Server được mô tả trong bảng 3.1:
Bảng 3.1 Các thành phần server của SQL Server 2000
Dịch vụ MSSQLServer thực thi cỗ máy CSDL SQL Server 2000 Có một dịch vụ này cho mỗi thể hiện của SQL Server 2000.
Dịch vụ về các dịch vụ phân tích của SQL Server 2000
MSSQLServerOLAPService thực thi các dịch vụ phân tích của SQL Server 2000 Chỉ có một dịch vụ không liên quan đến số thể hiện của SQL Server 2000.
Dịch vụ SQL Server Agent
Dịch vụ SQLServerAgent thực thi các tác nhân chạy các tác vụ quản trị đã được định thời gian biểu của SQL Server 2000.
Dịch vụ tìm kiếm Dịch vụ tìm kiếm Microsoft thực thi cỗ máy tìm kiếm toàn văn bản Chỉ có một dịch vụ, không liên quan đến số thể hiện của SQL Server 2000.
Dịch vụ MS DTC - Distributed
Thành phần điều phối giao dịch phân tán, quản lý các giao dịch phân tán giữa các thể hiện của SQL Server 2000 Chỉ có một dịch vụ, không liên quan đến số thể hiện của SQL Server 2000.
Downloaded by MON MON (monmon2@gmail.com)
SQL Server 2000 cung cấp các giao diện đồ họa giúp cho người sử dụng sử dụng các dịch vụ của SQL Server 2000 (Hình 3.1 và Bảng 3.2).
Hình 3.1 Các giao diện đồ họa của SQL Server 2000.
Bảng 3.2 Các công cụ giao diện đồ họa của SQL Server 2000.
SQL Server Enterprise Manager Đây là công cụ quản trị CSDL server chính, nó cung cấp một giao tiếp với người dùng Microsoft Management Console (MMC).
Dùng để tạo và quản lý các đối tượng CSDL và kiểm tra các phát biểu Transact-SQL, các bó lệnh và các script một cách tương tác.
SQL Profiler Giám sát và ghi nhận các sự kiện SQL Server 2000 đã chọn để phân tích và xem lại.
SQL Server Service Manager Ứng dụng nằm trên thanh task bar của Windows được dùng để chạy, tạm dừng hoặc thay đổi các dịch vụ SQL Server 2000.
Client Network Được dùng để quản lý Net-Libraries của client và
Downloaded by MON MON (monmon2@gmail.com)
Utility định nghĩa các bí danh server.
Dùng để quản lý Net-Libraries của server bao gồm thiết lập mã hóa SSL. b) Các thành phần giao tiếp Client.
Người dùng truy cập SQL Server 2000 thông qua các ứng dụng client, SQL Server 2000 cung cấp hai kiểu ứng dụng client chính:
- Các ứng dụng CSDL quan hệ, là kiểu ứng dụng truyền thống dùng môi trường client/server 2 lớp Các ứng dụng này gửi các phát biểu T-SQL đến cỗ máy CSDL quan hệ và nhận kết quả trả về như tập kết quả quan hệ.
- Các ứng dụng Internet, chúng là thành phần của nền tảng
Microsoft.NET Chúng gửi các phát biểu T-SQL hoặc các truy vấn Xpath tới cỗ máy CSDL quan hệ và nhận về kết quả dạng XML
2.1.1.2 Các thành phần của SQL Server 2005
SQL Server 2005 nâng cao hiệu năng, độ tin cậy, khả năng lập trình đơn giản và giao diện dễ sử dụng hơn so với SQL Server 2000 SQL Server 2005 tập trung vào khả năng xử lý giao dịch trực tuyến (online transaction processing - OLTP), ứng dụng thương mại điện tử (e- ecommerce) và kho dữ liệu (data warehousing) Ngoài ra những cải tiến quan trọng trong SQL Server 2005 là thêm các dịch vụ mới như: dịch vụ báo cáo (reporting service), service broker và sự thay đổi đáng kể trong cỗ máy cơ sở dữ liệu. a) Các phiên bản của SQL Server 2005:
Trước khi đi vào các thành phần của SQL Server 2005, ta xét các phiên bản của SQL Server 2005 SQL Server 2005 được sử dụng rộng rãi cho nhiều đối tượng khác nhau nên Microsoft cung cấp nhiều phiên bản khác nhau cho phù hợp với các yêu cầu về chi phí, thời gian thực hiện, của các tổ chức, cá nhân Năm phiên bản của SQL Server 2005 là:
+ Microsoft SQL Server 2005 Enterprise Edition+ Microsoft SQL Server 2005 Standard Edition
+ Microsoft SQL Server 2005 Workgroup Edition + Microsoft SQL Server 2005 Developer Edition
+ Microsoft SQL Server 2005 Express Edition
Hầu hết các tổ chức đều chọn trong ba phiên bản SQL Server 2005 Enterprise Edition, SQL Server 2005 Standard Edition, và SQL Server 2005 Workgroup Edition Các tổ chức chọn một trong ba phiên bản này với lý do là chỉ có các phiên bản Enterprise, Standard, và Workgroup được cài đặt và sử dụng trong môi trường server phục vụ cho hoạt động thực tế.
+ SQL Server 2005 Enterprise Edition (32-bit và 64-bit)
Enterprise Edition được sử dụng trong các doanh nghiệp, tổ chức có các mức yêu cầu xử lý giao dịch trực tuyến trên diện rộng (online transaction processing - OLTP), khả năng phân tích dữ liệu phức tạp cao, hệ thống kho dữ liệu (data warehousing systems) và web sites Enterprise Edition phù hợp cho các tổ chức lớn và các yêu cầu phức tạp.
+ SQL Server 2005 Standard Edition (32-bit và 64-bit)
Standard Edition là phiên bản phục vụ cho việc quản trị và phân tích dữ liệu phù hợp cho các doanh nghiệp, tổ chức vừa và nhỏ Nó bao gồm các giải pháp cần thiết cho thương mại điện tử (e- commerce), kho dữ liệu (data warehousing) và dòng doanh nghiệp (line-of-business).
+ SQL Server 2005 Workgroup Edition (32-bit only)
Workgroup Edition là giải pháp quản trị dữ liệu phù hợp cho các doanh nghiệp, tổ chức nhỏ chỉ cần một cơ sở dữ liệu không giới hạn kích thước hoặc số người sử dụng Workgroup Edition là lý tưởng cho các mức cơ sở dữ liệu tin cậy, mạnh mẽ và dễ quản trị.
+ SQL Server 2005 Developer Edition (32-bit và 64-bit) Developer Edition có tất cả các tính năng của phiên bản SQL Server 2005
Downloaded by MON MON (monmon2@gmail.com)
Ứng dụng Quản lý đơn đặt hàng 29 Các quy định hoạt động của hệ thống: 29
DATABASE (CƠ SỞ DỮ LIỆU)
IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'QLDDH') BEGIN
END b.Thêm ràng buộc duy nhất (UNIQUE) cho trường TenHH trong bảng HangHoa, thử nhập dữ liệu để kiểm tra ràng buộc.
ALTER TABLE HangHoa ADD CONSTRAINT UQ_HangHoa_TenHH UNIQUE (TenHH); c.Thêm ràng buộc kiểm tra (CHECK) cho trường SLCon, yêu cầu là trường này chỉ nhận giá trị ≥ 0, thử nhập dữ liệu để kiểm tra ràng buộc.
ALTER TABLE HangHoa ADD CONSTRAINT CK_HangHoa_SLCon CHECK (SLCon >= 0); d.Thêm ràng buộc mặc định (DEFAULT) cho cột NgayDat trong DonDatHang với giá trị mặc định là ngày hiện tại, thử nhập dữ liệu để kiểm tra ràng buộc.
ALTER TABLE DonDatHang ALTER COLUMN NgayDat DATE;
ALTER TABLE DonDatHang ADD CONSTRAINT DF_DonDatHang_NgayDat DEFAULT GETDATE() FOR NgayDat; e.Xóa bảng KHACHHANG? Nếu không xóa được thì nêu lý do? Muốn xóa được thì phải làm sao?
DROP TABLE KhachHang; f.Xóa cột DiaChi trong bảng KhachHang, sau đó tạo lại cột này với ràng buộc mặc định là ”HCM”.
ALTER TABLE KhachHang DROP COLUMN DiaChi;
ALTER TABLE KhachHang ADD DiaChi NVARCHAR(100) DEFAULT 'HCM'; g.Xóa khóa ngoại MaDat trong PHIEUGIAHANG tham chiếu tới MaDat trong DonDatHang, sau đó tạo lại khóa ngoại này.
ALTER TABLE PhieuGiaoHang DROP CONSTRAINT FK_PhieuGiaoHang_DonDatHang;
ALTER TABLE PhieuGiaoHangADD CONSTRAINT FK_PhieuGiaoHang_DonDatHang FOREIGN KEY (MaDat) REFERENCES
INSERT INTO KhachHang (MaKH, TenKH, DiaChi, DienThoai) VALUES
('KH01', 'Cửa hàng Lộc Phú', 'HCM', '0398451950'), ('KH02', 'Cửa hàng Hoàng Gia', 'Long An', '0938776266'), ('KH03', 'Nguyễn Lan Anh', 'Cần Thơ', '0896317388'), ('KH04', 'Cty TNHH An Phước', 'Long An', '0993810503'), ('KH05', 'Huỳnh Ngọc Trung', 'HCM', '0916783565'), ('KH06', 'Cửa hành Trung Tín', 'Tây Ninh', '0938435706');
INSERT INTO HangHoa (MaHH, TenHH, DVT, SLCon, DonGiaHH) VALUES
('BU', 'Bàn ủi Phillip', 'Cái', 60, 350000), ('CD', 'Nồi cơm điện Sharp', 'Cái', 100, 700000), ('DM', 'Đầu máy Sharp', 'Cái', 75, 1200000), ('MG', 'Máy giặt Sanyo', 'Cái', 10, 4700000), ('MQ', 'Máy quạt Senko', 'Cái', 40, 400000), ('TL', 'Tủ lạnh Hitachi', 'Cái', 50, 5500000), ('TV', 'Tivi Samsung', 'Cái', 33, 7800000);
INSERT INTO LichSuGia (MaHH, NgayHL, DonGia) VALUES
('BU', '2022-01-01', 300000), ('BU', '2023-01-01', 350000), ('CD', '2022-06-01', 650000), ('CD', '2023-01-01', 700000), ('DM', '2022-01-01', 1000000), ('DM', '2023-01-01', 1200000), ('MG', '2022-06-01', 4700000), ('MQ', '2023-01-01', 400000), ('TL', '2022-01-01', 5000000), ('TL', '2023-01-01', 5500000), ('TV', '2023-01-01', 7800000);
INSERT INTO DonDatHang (MaDat, NgayDat, MaKH, TinhTrang) VALUES
('HD01', '2022-02-02', 'KH01', 1), ('HD02', '2022-02-12', 'KH03', 1), ('HD03', '2023-02-23', 'KH03', 1), ('HD04', '2023-04-01', 'KH02', 0), ('HD05', '2023-05-09', 'KH05', 1), ('HD06', '2023-05-16', 'KH03', 1), ('HD07', '2023-06-19', 'KH05', 0),
Downloaded by MON MON (monmon2@gmail.com)
INSERT INTO PhieuGiaoHang (MaGiao, NgayGiao, MaDat) VALUES
('GH01', '2022-02-02', 'HD01'), ('GH02', '2022-02-15', 'HD02'), ('GH03', '2023-02-24', 'HD03'), ('GH05', '2023-05-10', 'HD05'), ('GH06', '2023-06-18', 'HD06');
INSERT INTO ChiTietGiaoHang (MaGiao, MaHH, SLGiao, DonGiaGiao) VALUES
('GH01', 'BU', 15, 300000), ('GH01', 'DM', 10, 1000000), ('GH01', 'TL', 4, 5000000), ('GH02', 'BU', 10, 300000), ('GH03', 'MG', 8, 4700000), ('GH05', 'BU', 12, 350000), ('GH05', 'DM', 15, 1200000), ('GH05', 'MG', 5, 4700000), ('GH05', 'TL', 5, 5500000), ('GH06', 'BU', 20, 350000), ('GH06', 'MG', 7, 4700000);
INSERT INTO ChiTietDatHang (MaDat, MaHH, SLDat) VALUES
('HD01', 'BU', 15), ('HD01', 'DM', 10), ('HD01', 'TL', 4), ('HD02', 'BU', 20), ('HD02', 'TL', 3), ('HD03', 'MG', 8), ('HD04', 'TL', 5), ('HD04', 'TV', 5), ('HD05', 'BU', 12), ('HD05', 'DM', 15), ('HD05', 'MG', 6), ('HD05', 'TL', 5), ('HD06', 'BU', 30), ('HD06', 'MG', 7), a.Cho biết chi tiết giao hàng của đơn đặt hàng DH01 (tên hàng hóa, số lượng giao và đơn giá giao).
SELECT CTHH.MaHH, HH.TenHH, CTHH.SLGiao, CTHH.DonGiaGiao FROM ChiTietGiaoHang CTHH
JOIN HangHoa HH ON CTHH.MaHH = HH.MaHH JOIN PhieuGiaoHang PGH ON CTHH.MaGiao = PGH.MaGiao JOIN DonDatHang DDH ON PGH.MaDat = DDH.MaDat WHERE DDH.MaDat = 'HD01'; b.Cho biết thông tin các đơn hàng không được giao, hiển thị: mã đặt, ngày đặt, tên khách hàng.
SELECT DDH.MaDat, DDH.NgayDat, KH.TenKH FROM DonDatHang DDH
LEFT JOIN KhachHang KH ON DDH.MaKH = KH.MaKH WHERE DDH.TinhTrang = 0; c.Cho biết hàng hóa nào có đơn giá hiện hành cao nhất, hiển thị: tên hàng hóa, đơn giá hiện hành.
SELECT HH.TenHH, HH.DonGiaHH FROM HangHoa HH
WHERE HH.DonGiaHH = (SELECT MAX(DonGiaHH) FROM HangHoa); d.Cho biết số lần đặt hàng của từng khách hàng, những khách hàng không đặt hàng thì phải hiển thị số lần đặt hàng bằng 0 Hiển thị: Mã khách hàng, tên khách hàng, số lần đặt.
SELECT KH.MaKH, KH.TenKH, COUNT(DDH.MaDat) AS SoLanDatHang FROM KhachHang KH
LEFT JOIN DonDatHang DDH ON KH.MaKH = DDH.MaKH GROUP BY KH.MaKH, KH.TenKH; e.Cho biết tổng tiền của từng phiếu giao hàng trong năm 2023, hiển thị: mã giao, ngày giao, tổng tiền, với tổng tiền = SUM(SLGiao * DonGiaGiao)
SELECT PGH.MaGiao, PGH.NgayGiao, SUM(CTGH.SLGiao * CTGH.DonGiaGiao) AS TongTien FROM PhieuGiaoHang PGH
JOIN ChiTietGiaoHang CTGH ON PGH.MaGiao = CTGH.MaGiao WHERE YEAR(PGH.NgayGiao) = 2023
GROUP BY PGH.MaGiao, PGH.NgayGiao; f.Cho biết khách hàng nào có 2 lần đặt hàng trở lên, hiển thị: mã khách hàng, tên khách hàng, số lần đặt.
SELECT KH.MaKH, KH.TenKH, COUNT(DDH.MaDat) AS SoLanDatHang FROM KhachHang KH
JOIN DonDatHang DDH ON KH.MaKH = DDH.MaKH GROUP BY KH.MaKH, KH.TenKH
HAVING COUNT(DDH.MaDat) >= 2; g.Cho biết mặt hàng nào đã được giao với tổng số lượng giao nhiều nhất, hiển thị: mã hàng, tên hàng hóa, tổng số lượng đã giao.
SELECT TOP 1 CTGH.MaHH, HH.TenHH, SUM(CTGH.SLGiao) AS TongSoLuongGiao FROM ChiTietGiaoHang CTGH
JOIN HangHoa HH ON CTGH.MaHH = HH.MaHH GROUP BY CTGH.MaHH, HH.TenHH
ORDER BY SUM(CTGH.SLGiao) DESC;
Downloaded by MON MON (monmon2@gmail.com) h.Tăng số lượng còn của mặt hàng có mã bắt đầu bằng ký tự 'M' lên 10.
UPDATE HangHoa SET SLCon = SLCon + 10 WHERE MaHH LIKE 'M%'; i.Copy dữ liệu bảng HangHoa sang một bảng HangHoaCopy, sau đó xóa những mặt hàng chưa được đặt trong bảng HangHoa Chèn lại vào bảng HangHoa những dòng bị xóa từ bảng
SELECT * INTO HangHoaCopy FROM HangHoa;
FROM HangHoa WHERE MaHH NOT IN (SELECT DISTINCT MaHH FROM ChiTietDatHang);
ALTER TABLE LichSuGia DROP CONSTRAINT FK LichSuGia MaHH 45F365D3;
DELETE FROM HangHoa WHERE MaHH NOT IN (SELECT DISTINCT MaHH FROM ChiTietDatHang);
SELECT *FROM HangHoa ALTER TABLE LichSuGia ADD CONSTRAINT FK LichSuGia MaHH 45F365D3 FOREIGN KEY (MaHH) REFERENCES HangHoa(MaHH);
INSERT INTO HangHoa (MaHH, TenHH, DVT, SLCon, DonGiaHH) SELECT HH.MaHH, HH.TenHH, HH.DVT, HH.SLCon, HH.DonGiaHH FROM HangHoaCopy AS HH
FROM HangHoa AS H WHERE H.MaHH = HH.MaHH );
SELECT *FROM HangHoa j.Cập nhật số điện thoại cho khách hàng có mã KH06
UPDATE KhachHang SET DienThoai = '0393830742' WHERE MaKH = 'KH06';
k.Sửa giá trị TinhTrang=NULL cho tất cả các đơn đặt hàng UPDATE DonDatHang
l.Thêm cột ThanhTien cho bảng ChiTietGiaoHang, sau đó cập nhật giá trị cho cột này với ThanhTien SLGiao*DonGiaGiao
ALTER TABLE ChiTietGiaoHang ADD ThanhTien DECIMAL(18, 2);
Cập nhật giá trị cho cột "ThanhTien" dựa trên công thức ThanhTien = SLGiao * DonGiaGiao:
3.3: VIEW (KHUNG NHÌN) a.Tạo view thống kê doanh số giao hàng của từng mặt hàng trong 6 tháng đầu năm 2023
CREATE VIEW DoanhSoGiaoHang AS SELECT CG.MaHH, H.TenHH, SUM(CG.SLGiao * CG.DonGiaGiao) AS DoanhSo FROM ChiTietGiaoHang CG
JOIN HangHoa H ON CG.MaHH = H.MaHH JOIN PhieuGiaoHang P ON CG.MaGiao = P.MaGiao WHERE YEAR(P.NgayGiao) = 2023 AND MONTH(P.NgayGiao) 35000000 AND @CoMuaMayGiat = 1 THEN @ThamSo2 WHEN @CoMuaNam2022 = 1 AND @CoMuaNam2023 = 1 THEN @ThamSo3 ELSE 0
FETCH NEXT FROM KhachHangCursor INTO @MaKH;
Downloaded by MON MON (monmon2@gmail.com)
SELECT *FROM KhachHang c.Vào ngày 1/1/2024, cần tăng giá của tất cả các mặt hàng lên 10% so với đơn giá hiện hành Song song với việc tăng giá tất cả các mặt hàng là việc chèn 1 dòng dữ liệu vào LichSuGia ứng với mỗi hàng hóa, có nghĩa là có bao nhiêu hàng hóa sẽ có bấy nhiêu dòng dữ liệu được chèn vào bảng LichSuGia với các giá trị tương ứng Dùng con trỏ để thực hiện công việc này
Khai báo con trỏ cho bảng HangHoa DECLARE HangHoaCursor CURSOR FOR SELECT MaHH, DonGiaHH
Mở con trỏ OPEN HangHoaCursor;
Fetch dòng dữ liệu đầu tiên FETCH NEXT FROM HangHoaCursor INTO @MaHH, @DonGiaHH;
Lặp qua từng dòng dữ liệu trong con trỏ WHILE @@FETCH_STATUS = 0 BEGIN
Tính toán giá mới DECLARE @GiaMoi DECIMAL(18, 2) = @DonGiaHH * 1.1;
Tăng giá của hàng hóa lên 10%
UPDATE HangHoa SET DonGiaHH = @GiaMoi WHERE MaHH = @MaHH;
Chèn dòng dữ liệu vào bảng LichSuGia INSERT INTO LichSuGia (MaHH, NgayHL, DonGia) VALUES (@MaHH, @NgayHL, @GiaMoi);
FETCH NEXT FROM HangHoaCursor INTO @MaHH, @DonGiaHH;
STORE PROCEDURE+TRANSACTION (Thủ tục nội tại + giao dịch)
AS BEGIN SET NOCOUNT ON;
SELECT @quantity = SLDat FROM ChiTietDatHang WHERE MaDat = @maddh AND MaHH = @mahh;
EXEC GetQuantityOrdered 'HD01', 'BU', @quantity OUTPUT;
SELECT @quantity AS QuantityOrdered; b Tạo thủ tục truyền vào mã phiếu giao hàng, xuất ra tổng tiền của phiếu giao hàng đó.
CREATE PROCEDURE GetTotalAmount @magh NVARCHAR(255),
SELECT @total = SUM(SLGiao * DonGiaGiao) FROM ChiTietGiaoHang
EXEC GetTotalAmount 'GH01', @total OUTPUT;
SELECT @total AS TotalAmount; c Tạo thủ tục truyền vào mã khách hàng, hiển thị các đơn đặt hàng của khách hàng đó, gồm các thông tin: Mã đặt, ngày đặt, mã giao, ngày giao.
CREATE PROCEDURE GetCustomerOrders @makh NVARCHAR(255)
AS BEGIN SET NOCOUNT ON;
SELECT DDH.MaDat, DDH.NgayDat, PGH.MaGiao, PGH.NgayGiao FROM DonDatHang DDH
LEFT JOIN PhieuGiaoHang PGH ON DDH.MaDat = PGH.MaDat WHERE DDH.MaKH = @makh;
Downloaded by MON MON (monmon2@gmail.com)
EXEC GetCustomerOrders 'KH01'; d Tạo thủ tục truyền vào ngày1 và ngày2, đếm xem có bao nhiêu phiếu giao hàng được giao trong khoảng thời gian từ ngày1 đến ngày2.
CREATE PROCEDURE CountDeliveredOrders @ngay1 DATE,
SELECT COUNT(*) AS SoPhieuGiao FROM PhieuGiaoHang
WHERE NgayGiao BETWEEN @ngay1 AND @ngay2;
EXEC CountDeliveredOrders '2023-01-01', '2023-02-28'; e.Viết lại câu 4a, 4b, 4c bằng cách dùng thủ tục.
4 a Thủ tục để thêm cột "TongTien" vào bảng "PhieuGiaoHang" và cập nhật giá trị cho cột này dựa trên công thức "TongTien = SUM(SLGiao * DonGiaGiao)":
CREATE PROCEDURE UpdateTongTien @MaGiao INT
AS BEGIN SET NOCOUNT ON;
Thêm cột TongTien vào bảng PhieuGiaoHang (nếu chưa tồn tại) IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'TongTien' AND Object_ID Object_ID(N'PhieuGiaoHang'))
BEGIN ALTER TABLE PhieuGiaoHang ADD TongTien DECIMAL(18, 2) NULL;
Cập nhật giá trị cho cột TongTien UPDATE PhieuGiaoHang
SET TongTien = ( SELECT SUM(ThanhTien) FROM ChiTietPhieuGiao WHERE MaGiao = @MaGiao )
Thêm cột THUONG2023 vào bảng KhachHang (nếu chưa tồn tại) IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'THUONG2023' AND Object_ID = Object_ID(N'KhachHang'))
BEGIN ALTER TABLE KhachHang ADD THUONG2023 DECIMAL(18, 2) NULL;
Cập nhật giá trị cho cột THUONG2023 UPDATE KhachHang
SET THUONG2023 = CASE WHEN (SELECT SUM(TongTien) FROM DonDatHang WHERE MaKH = KhachHang.MaKH AND YEAR(NgayDat) = 2023) > 50000000 THEN 3000000
WHEN (SELECT SUM(TongTien) FROM DonDatHang WHERE MaKH = KhachHang.MaKH AND YEAR(NgayDat) = 2023) > 35000000 AND EXISTS (SELECT * FROM ChiTietDonHang WHERE MaDonDat = DonDatHang.MaDonDat AND MaHangHoa = 'MH001') THEN 2000000 WHEN EXISTS (SELECT * FROM DonDatHang WHERE MaKH = KhachHang.MaKH AND YEAR(NgayDat) = 2023) AND EXISTS (SELECT * FROM DonDatHang WHERE MaKH KhachHang.MaKH AND YEAR(NgayDat) = 2022) THEN 1000000
4 c DROP PROCEDURE IF EXISTS TangGiaHangHoa;
Khai báo con trỏ DECLARE curHangHoa CURSOR FOR SELECT MaHH, DonGiaHH
Downloaded by MON MON (monmon2@gmail.com)
Lấy hàng hóa đầu tiên FETCH NEXT FROM curHangHoa INTO @MaHH, @DonGiaHH;
Duyệt qua các hàng hóa WHILE @@FETCH_STATUS = 0 BEGIN
Tính toán giá mới DECLARE @DonGiaMoi DECIMAL(18, 2) = @DonGiaHH * @TiLeTangGia;
Cập nhật đơn giá hàng hóa UPDATE HangHoa
SET DonGiaHH = @DonGiaMoi WHERE MaHH = @MaHH;
Cập nhật hoặc chèn dữ liệu vào bảng LichSuGia MERGE INTO LichSuGia AS target
USING (SELECT @MaHH AS MaHH, @NgayHL AS NgayHL, @DonGiaMoi AS DonGia) AS source
ON (target.MaHH = source.MaHH AND target.NgayHL = source.NgayHL) WHEN MATCHED THEN
UPDATE SET target.DonGia = source.DonGia WHEN NOT MATCHED THEN
INSERT (MaHH, NgayHL, DonGia) VALUES (source.MaHH, source.NgayHL, source.DonGia);
Lấy hàng hóa tiếp theo FETCH NEXT FROM curHangHoa INTO @MaHH, @DonGiaHH;
Đóng con trỏ CLOSE curHangHoa;
5f Tạo thủ tục thêm mới một hàng hóa với tham số đầu vào là: mã hàng, tên hàng, đơn vị tính, số lượng, đơn giá Yêu cầu:
Kiểm tra khóa chính, nếu vi phạm thì báo lỗi và chấm dứt thủ tục.
Kiểm tra tên hàng phải là duy nhất (có nghĩa tên hàng nếu khác null phải khác với tất cả các tên hàng đã tồn tại trong bảng HangHoa), nếu không duy nhất thì báo lỗi và chấm dứt thủ tục.
Kiểm tra số lượng nếu khác null thì phải ≥0, ngược lại thì báo lỗi và chấm dư&t thủ tục.
Kiểm tra đơn giá nếu khác null thì phải ≥0, ngược lại thì báo lỗi và chấm dứt thủ tục.
Nếu các điều kiện trên thỏa thì cho thêm mới hàng hóa.
@MaGiao NVARCHAR(50), @MaHangHoa NVARCHAR(50), @SoLuongGiao INT
AS BEGIN BEGIN TRANSACTION Bắt đầu giao dịch
Kiểm tra xem mã hàng hóa có tồn tại trong ChiTietDatHang không IF NOT EXISTS (SELECT 1 FROM ChiTietDatHang WHERE MaHH = @MaHangHoa) BEGIN
ROLLBACK TRANSACTION Hủy giao dịch nếu không tồn tại RAISERROR ('Hàng hóa không tồn tại trong đơn đặt hàng.', 16, 1) RETURN
Kiểm tra số lượng giao có nhỏ hơn số lượng đặt ứng với hàng hóa này không IF @SoLuongGiao > (SELECT SLDat FROM ChiTietDatHang WHERE MaHH = @MaHangHoa) BEGIN
ROLLBACK TRANSACTION Hủy giao dịch nếu số lượng giao lớn hơn số lượng đặt RAISERROR ('Số lượng giao lớn hơn số lượng đặt.', 16, 1)
Kiểm tra số lượng giao có nhỏ hơn số lượng còn của hàng hóa này không IF @SoLuongGiao > (SELECT SLCon FROM HangHoa WHERE MaHH = @MaHangHoa) BEGIN
ROLLBACK TRANSACTION Hủy giao dịch nếu số lượng giao lớn hơn số lượng còn RAISERROR ('Số lượng giao lớn hơn số lượng còn của hàng hóa.', 16, 1)
Thêm mới chi tiết giao hàng INSERT INTO ChiTietGiaoHang (MaGiao, MaHH, SLGiao, DonGiaGiao) VALUES (@MaGiao, @MaHangHoa, @SoLuongGiao, (SELECT DonGiaHH FROM HangHoa WHERE MaHH = @MaHangHoa))
Cập nhật lại số lượng còn của hàng hóa UPDATE HangHoa
SET SLCon = SLCon - @SoLuongGiao WHERE MaHH = @MaHangHoa
COMMIT TRANSACTION Hoàn thành giao dịch END
SELECT * FROM ChiTietGiaoHangEXEC ThemMoiChiTietGiaoHang 'GH001', 'HH001', 5EXEC ThemMoiChiTietGiaoHang 'GH02', 'BU', 8
FUNCTION (HÀM DO NGƯỜI DÙNG ĐỊNH NGHĨA)
Downloaded by MON MON (monmon2@gmail.com)
Viết lại các yêu cầu trong câu 5 bằng cách dùng Function. a Function để lấy số lượng hàng hóa được đặt trong đơn đặt hàng:
SELECT @quantity = SLDat FROM ChiTietDatHang WHERE MaDat = @maddh AND MaHH = @mahh;
END; b Function để lấy tổng tiền của phiếu giao hàng:
SELECT @total = SUM(SLGiao * DonGiaGiao) FROM ChiTietGiaoHang
END; c Function để hiển thị các đơn đặt hàng của một khách hàng:
WHERE DDH.MaKH = @makh ); d Function để đếm số phiếu giao hàng được giao trong khoảng thời gian từ ngày1 đến ngày2:
SELECT @SoLuongPhieuGiao = COUNT(*) FROM PhieuGiaoHang
WHERE NgayGiao BETWEEN @ngay1 AND @ngay2;
END; e Viết lại các yêu cầu câu 4a, 4b, 4c bằng cách sử dụng Function:
Câu 4a Tạo Function để cập nhật giá trị cho cột "TongTien" trong bảng "PhieuGiaoHang":
BEGIN Thêm cột TongTien vào bảng PhieuGiaoHang (nếu chưa tồn tại) IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'TongTien' AND Object_ID Object_ID(N'PhieuGiaoHang'))
BEGIN ALTER TABLE PhieuGiaoHang ADD TongTien DECIMAL(18, 2) NULL;
Cập nhật giá trị cho cột TongTien UPDATE PhieuGiaoHang
SET TongTien = ( SELECT SUM(ThanhTien) FROM ChiTietPhieuGiao WHERE MaGiao = @MaGiao )
Câu 4b Tạo Function để cập nhật giá trị cho cột "THUONG2023" trong bảng "KhachHang":
Downloaded by MON MON (monmon2@gmail.com)
CREATE FUNCTION dbo.UpdateTHUONG2023Function RETURNS VOID
AS BEGIN Thêm cột THUONG2023 vào bảng KhachHang (nếu chưa tồn tại) IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'THUONG2023' AND Object_ID = Object_ID(N'KhachHang'))
BEGIN ALTER TABLE KhachHang ADD THUONG2023 DECIMAL(18, 2) NULL;
Cập nhật giá trị cho cột THUONG2023 UPDATE KhachHang
SET THUONG2023 = CASE WHEN (SELECT SUM(TongTien) FROM DonDatHang WHERE MaKH = KhachHang.MaKH AND YEAR(NgayDat) = 2023) > 50000000 THEN 3000000
WHEN (SELECT SUM(TongTien) FROM DonDatHang WHERE MaKH = KhachHang.MaKH AND YEAR(NgayDat) = 2023) > 35000000 AND EXISTS (SELECT * FROM ChiTietDonHang WHERE MaDonDat = DonDatHang.MaDonDat AND MaHangHoa = 'MH001') THEN 2000000 WHEN EXISTS (SELECT * FROM DonDatHang WHERE MaKH = KhachHang.MaKH AND YEAR(NgayDat) = 2023) AND EXISTS (SELECT * FROM DonDatHang WHERE MaKH KhachHang.MaKH AND YEAR(NgayDat) = 2022) THEN 1000000
Câu 4c Tạo Function để thực hiện việc tăng giá hàng hóa:
CREATE FUNCTION dbo.TangGiaHangHoaFunction RETURNS VOID
AS BEGIN DECLARE @NgayHL DATE = '2024-01-01';
Khai báo con trỏ DECLARE curHangHoa CURSOR FOR SELECT MaHH, DonGiaHH
Mở con trỏ OPEN curHangHoa;
Duyệt qua các hàng hóa WHILE @@FETCH_STATUS = 0 BEGIN
Tính toán giá mới DECLARE @DonGiaMoi DECIMAL(18, 2) = @DonGiaHH * @TiLeTangGia;
Cập nhật đơn giá hàng hóa UPDATE HangHoa
SET DonGiaHH = @DonGiaMoi WHERE MaHH = @MaHH;
Cập nhật hoặc chèn dữ liệu vào
bảng LichSuGia MERGE INTO LichSuGia AS target USING (SELECT @MaHH AS MaHH, @NgayHL AS NgayHL, @DonGiaMoi AS DonGia) AS source
ON (target.MaHH = source.MaHH AND target.NgayHL = source.NgayHL) WHEN MATCHED THEN
UPDATE SET target.DonGia = source.DonGia WHEN NOT MATCHED THEN
INSERT (MaHH, NgayHL, DonGia) VALUES (source.MaHH, source.NgayHL, source.DonGia);
Lấy hàng hóa tiếp theo FETCH NEXT FROM curHangHoa INTO @MaHH, @DonGiaHH;
Đóng con trỏ CLOSE curHangHoa;
END; e Viết Function để thêm mới một hàng hóa với các điều kiện kiểm tra:
@MaGiao NVARCHAR(50), @MaHangHoa NVARCHAR(50), @SoLuongGiao INT
BEGIN BEGIN TRANSACTION Bắt đầu giao dịch
Kiểm tra xem mã hàng hóa có tồn tại trong ChiTietDatHang không IF NOT EXISTS (SELECT 1 FROM ChiTietDatHang WHERE MaHH = @MaHangHoa)
Downloaded by MON MON (monmon2@gmail.com)
BEGIN ROLLBACK TRANSACTION Hủy giao dịch nếu không tồn tại RAISERROR ('Hàng hóa không tồn tại trong đơn đặt hàng.', 16, 1) RETURN
Kiểm tra số lượng giao có nhỏ hơn số lượng đặt ứng với hàng hóa này không IF @SoLuongGiao > (SELECT SLDat FROM ChiTietDatHang WHERE MaHH = @MaHangHoa) BEGIN
ROLLBACK TRANSACTION Hủy giao dịch nếu số lượng giao lớn hơn số lượng đặt RAISERROR ('Số lượng giao lớn hơn số lượng đặt.', 16, 1)
Kiểm tra số lượng giao có nhỏ hơn số lượng còn của hàng hóa này không IF @SoLuongGiao > (SELECT SLCon FROM HangHoa WHERE MaHH = @MaHangHoa) BEGIN
ROLLBACK TRANSACTION Hủy giao dịch nếu số lượng giao lớn hơn số lượng còn RAISERROR ('Số lượng giao lớn hơn số lượng còn của hàng hóa.', 16, 1)
Thêm mới chi tiết giao hàng INSERT INTO ChiTietGiaoHang (MaGiao, MaHH, SLGiao, DonGiaGiao) VALUES (@MaGiao, @MaHangHoa, @SoLuongGiao, (SELECT DonGiaHH FROM HangHoa WHERE MaHH = @MaHangHoa))
Cập nhật lại số lượng còn của hàng hóa UPDATE HangHoa
SET SLCon = SLCon - @SoLuongGiao WHERE MaHH = @MaHangHoa
COMMIT TRANSACTION Hoàn thành giao dịchEND;
TRIGGER (RÀNG BUỘC TOÀN VẸN)
Sử dụng ràng buộc CONSTRAINT ALTER TABLE HangHoa
ADD CONSTRAINT CK_HangHoa_SoLuongCon CHECK (SLCon > 0);
Sử dụng trigger CREATE TRIGGER trg_HangHoa_SoLuongCon ON HangHoa
RAISERROR ('Số lượng còn của hàng hóa phải lớn hơn 0', 16, 1);
END END; b Cài đặt ràng buộc: "Đơn vị tính của hàng hóa chỉ nhận một trong các giá trị: Cái, Thùng, Chiếc, Chai, Lon".
Sử dụng ràng buộc CONSTRAINT ALTER TABLE HangHoa
ADD CONSTRAINT CK_HangHoa_DonViTinh CHECK (DVT IN ('Cái', 'Thùng', 'Chiếc', 'Chai', 'Lon'));
Sử dụng trigger CREATE TRIGGER trg_HangHoa_DonViTinh ON HangHoa
BEGIN IF EXISTS (SELECT 1 FROM inserted WHERE DVT NOT IN ('Cái', 'Thùng', 'Chiếc', 'Chai', 'Lon')) BEGIN
RAISERROR ('Đơn vị tính của hàng hóa chỉ nhận một trong các giá trị: Cái, Thùng, Chiếc, Chai, Lon', 16, 1);
END END; c Cài đặt ràng buộc: "Mỗi đơn đặt hàng chỉ có tối đa 1 phiếu giao hàng".
CREATE TRIGGER TR_DonDatHang_MaxPhieuGiao ON DonDatHang
BEGIN IF EXISTS ( SELECT DDH.MaDat FROM DonDatHang DDH INNER JOIN PhieuGiaoHang PGH ON DDH.MaDat = PGH.MaDat GROUP BY DDH.MaDat
RAISERROR('Mỗi đơn đặt hàng chỉ có tối đa 1 phiếu giao hàng', 16, 1);
END END; d Cài đặt ràng buộc: "Ngày giao hàng phải bằng hoặc sau ngày đặt hàng nhưng không được quá 30 ngày".
CREATE TRIGGER TR_PhieuGiaoHang_NgayGiao ON PhieuGiaoHang
Downloaded by MON MON (monmon2@gmail.com)
BEGIN IF EXISTS (SELECT 1 FROM inserted WHERE NgayGiao < NgayDat OR DATEDIFF(DAY, NgayDat, NgayGiao) > 30)
BEGIN RAISERROR('Ngày giao hàng không hợp lệ.', 16, 1);
END END; e Tạo trigger sau khi chèn 1 dòng mới vào bảng LichSuGia (gồm: mã hàng hóa, ngày hiệu lực mới, đơn giá mới),
nếu ngày có hiệu lực mới lớn hơn tất cả các ngày hiệu lực trong lịch sử giá của hàng hóa tương ứng thì cập nhật lại DonGiaHH bằng đơn giá mới cho hàng hóa này, ngược lại thì rollback.
CREATE TRIGGER TR_UpdateDonGiaHH ON LichSuGia
BEGIN DECLARE @MaHH NVARCHAR(255) DECLARE @NgayHL DATE
SELECT @MaHH = MaHH, @NgayHL = NgayHL, @DonGia = DonGia FROM inserted
IF @NgayHL = (SELECT MAX(NgayHL) FROM LichSuGia WHERE MaHH = @MaHH) BEGIN
UPDATE HangHoa SET DonGiaHH = @DonGia WHERE MaHH = @MaHH END
ELSE BEGIN RAISERROR('Ngày hiệu lực không hợp lệ.', 16, 1);
END END; f Cài đặt ràng buộc: "Số lượng hàng hóa được giao không được lớn hơn số lượng hàng hóa được đặt tương ứng".
CREATE TRIGGER TR_ChiTietGiaoHang_SoLuongGiaoON ChiTietGiaoHang
IF EXISTS ( SELECT 1 FROM inserted I INNER JOIN ChiTietDatHang CTDH ON I.MaDat = CTDH.MaDat AND I.MaHH = CTDH.MaHH WHERE I.SLGiao > CTDH.SLDat
) BEGIN RAISERROR('Số lượng hàng hóa được giao không được lớn hơn số lượng hàng hóa được đặt tương ứng', 16, 1);
AN TOÀN + BẢO MẬT DỮ LIỆU
SELECT * INTO OUTFILE 'C:/path/to/tblKhachHang.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
FROM KhachHang; b.Xóa hết dữ liệu trong bảng KhachHang, sau đó Import lại dữ liệu từ file tblKhachHang.txt
Xóa hết dữ liệu trong bảng KhachHang DELETE FROM KhachHang;
Import lại dữ liệu từ file tblKhachHang.txt LOAD DATA INFILE 'C:/path/to/tblKhachHang.txt' INTO TABLE KhachHang
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; c.Thực hiện Export toàn bộ các bảng của CSDL sang Access
Để export toàn bộ các bảng của CSDL sang Access, bạn có thể sử dụng công cụ Import/Export Data Wizard. d.Sao lưu (Backup) toàn bộ CSDL thành file QLDDH.bak, sau đó xóa và sửa một vài dòng bất kỳ trong CSDL rồi thực hiện phục hồi (restore) lại CSDL từ file QLDDH.bak, có nhận xét gì?
Sao lưu (backup) toàn bộ CSDL thành file QLDDH.bak mysqldump -u username -p password dbname > "C:/path/to/QLDDH.bak"
Xóa và sửa một vài dòng bất kỳ trong CSDL (Vui lòng chỉnh sửa một cách cẩn thận) Phục hồi (restore) lại CSDL từ file QLDDH.bak mysql -u username -p password dbname < "C:/path/to/QLDDH.bak" e Giả sử cơ sở dữ liệu về Quản lý nhập xuất tồn có các nhóm, người sử dụng như sau:
Các account: Admin, Director có quyền quản trị.
Các user: user1, user2, user3 có quyền xem tất cả các bảng nhưng không có quyền thêm, xóa sửa bất kỳ bảng nào.
Các user: user4, user5, user6 có quyền xem tất cả các bảng và quyền thêm, xóa, sửa bảng DonDatHang+ChiTietDatHang và PhieuGiaoHang+ChiTietGiaoHang.
Hãy tạo các nhóm, role, user để đảm bảo quyền trên.
Downloaded by MON MON (monmon2@gmail.com)
Tạo vai trò CREATE ROLE XemTatCa;
Gán vai trò cho nhóm GRANT XemTatCa TO NhanVien;
Tạo người dùng và gán vào nhóm CREATE USER 'Admin'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'Director'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'user2'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'user3'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'user4'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'user5'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'user6'@'localhost' IDENTIFIED BY 'password';
Gán người dùng vào nhóm GRANT QuanTri TO 'Admin'@'localhost';
GRANT QuanTri TO 'Director'@'localhost';
GRANT NhanVien TO 'user1'@'localhost';
GRANT NhanVien TO 'user2'@'localhost';
GRANT NhanVien TO 'user3'@'localhost';
GRANT NhanVien TO 'user4'@'localhost';
GRANT NhanVien TO 'user5'@'localhost';
GRANT NhanVien TO 'user6'@'localhost';
Trong bài tập này, chúng ta đã tìm hiểu và thực hiện một số câu truy vấn và tác vụ trong MySQL liên quan đến cơ sở dữ liệu Quản lý Đặt hàng và Giao hàng Cụ thể, chúng ta đã thực hiện các câu truy vấn SELECT, INSERT, UPDATE và DELETE để truy vấn dữ liệu, thêm, sửa đổi và xóa các bản ghi trong các bảng dữ liệu.
Bên cạnh đó, chúng ta đã tạo các ràng buộc toàn vẹn (constraints) và cài đặt các trigger để đảm bảo tính toàn vẹn dữ liệu và kiểm tra một số điều kiện khi thực hiện các thao tác.
Các câu lệnh SQL đã được sử dụng bao gồm tạo bảng, thêm dữ liệu, cập nhật dữ liệu, xóa dữ liệu, tạo ràng buộc toàn vẹn (constraints), và tạo trigger.
Ngoài ra, chúng ta cũng đã thực hiện tạo view để xây dựng các báo cáo và thống kê dữ liệu một cách trực quan và dễ dàng sử dụng.
Cuối cùng, chúng ta đã tìm hiểu về cách sao lưu (backup) và phục hồi (restore) dữ liệu trong MySQL để đảm bảo an toàn và bảo mật dữ liệu trong trường hợp có sự cố xảy ra.
Trong tổng quan, việc nắm vững các câu lệnh SQL và các tác vụ thao tác cơ bản trong MySQL là rất quan trọng để quản lý và tối ưu hóa cơ sở dữ liệu một cách hiệu quả Đồng thời, việc thực hiện các ràng buộc và trigger giúp đảm bảo tính toàn vẹn và hạn chế các lỗi dữ liệu không mong muốn.
Tuy MySQL là một hệ quản trị cơ sở dữ liệu mạnh mẽ và linh hoạt, nhưng việc học hỏi và nắm vững các khái niệm và kỹ thuật trong MySQL là quá trình liên tục Việc tìm hiểu thêm từ các nguồn tài liệu tham khảo và thực hành sẽ giúp chúng ta trở thành những người quản trị cơ sở dữ liệu thành công.
Downloaded by MON MON (monmon2@gmail.com)