TRƢỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN HỆ THỐNG THÔNG TIN -----***----- BÀI GIẢNG HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU TÊN HỌC PHẦN MÃ HỌC PHẦN TRÌNH ĐỘ ĐÀO TẠO DÙNG CHO SV NGÀNH : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU : 17402 : ĐẠI HỌC CHÍNH QUY : CÔNG NGHỆ THÔNG TIN HẢI PHÒNG - 2011 2 MỤC LỤC Chƣơng 1. Giới thiệu 5 1.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server 5 1.2. Các thành phần cơ bản trong Microsoft SQL Server 18 1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL) 24 Chƣơng 2. Tạo và quản lý cơ sở dữ liệu 26 2.1. Các tệp tin cơ sở dữ liệu (Database files) 26 2.2. Tạo cơ sở dữ liệu (Database) 26 2.3. Quản lý cơ sở dữ liệu 30 2.4. Xóa cơ sở dữ liệu 32 Chƣơng 3. Tạo và quản lý các bảng 35 3.1. Tạo bảng (Tables) 35 3.2. Định nghĩa các cột (Columns) 36 3.3. Định nghĩa các ràng buộc (Constrains) 37 3.4. Sửa bảng (ALTER TABLE) 38 3.5. Xóa bảng (DROP TABLE) 39 3.6. Thêm bản ghi mới (INSERT) 39 3.7. Cập nhật bản ghi (UPDATE) 41 3.8. Xóa bản ghi (DELETE) 42 Chƣơng 4. Truy vấn dữ liệu 44 4.1. Truy vấn cơ bản 44 4.2. Truy vấn từ nhiều bảng 51 4.2.1. Inner Joins 51 4.2.2. Outer Joins 51 4.3. Truy vấn lồng nhau (Subqueries) 51 Chƣơng 5. Tạo và quản lý các chỉ mục 54 5.1. Các kiểu chỉ mục (Indexes) 54 5.2. Tạo các chỉ mục 54 5.3. Quản lý các chỉ mục 58 5.4. Xóa các chỉ mục 58 Chƣơng 6. Tạo và quản lý khung nhìn 60 6.1. Định nghĩa 60 6.2. Tạo các khung nhìn (Views) 60 6.3. Quản lý các khung nhìn 61 3 6.4. Xóa các khung nhìn 61 Chƣơng 7. Tạo và quản lý các thủ tục thƣờng trú 62 7.1. Tạo các thủ tục thường trú (Stored procedures) 62 7.2. Thực thi các thủ tục thường trú 64 7.3. Xem và sửa các thủ tục thường trú 64 7.4. Tham số vào và ra (Parameters) 65 7.5. Các thủ tục thường trú của hệ thống 65 Chƣơng 8. Tạo và quản lý hàm ngƣời dùng định nghĩa 68 8.1. Các kiểu hàm người dùng định nghĩa (User-defined functions) 68 8.2. Tạo hàm người dùng định nghĩa 68 8.3. Quản lý hàm người dùng định nghĩa 69 Chƣơng 9. Tạo và quản lý các Trigger 70 9.1. Tạo các Trigger thao tác dữ liệu (DML Triggers) 70 9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers) 70 9.3. Sử dụng các Trigger lồng nhau (Nested Triggers) 71 9.4. Sử dụng các Trigger đệ quy (Recursive Triggers) 74 Một số đề thi mẫu 76 4 Tên học phần: Hệ quản trị Cơ sở dữ liệu Loại học phần: 4 Bộ môn phụ trách giảng dạy: Hệ thống Thông tin Khoa phụ trách: CNTT. Mã học phần: 17402 Tổng số TC: 4 Tổng số tiết Lý thuyết Thực hành/ Xemina Tự học Bài tập lớn Đồ án môn học 90 45 30 0 có không Học phần học trƣớc: Không yêu cầu. Học phần tiên quyết: Không yêu cầu. Học phần song song: Không yêu cầu. Mục tiêu của học phần: Cung cấp cho sinh viên những kiến thức cơ bản về hệ quản trị cơ sở dữ liệu; Các chức năng và công cụ cần thiết để quản trị cơ sở dữ liệu cho người phát triển hệ thống. Nội dung chủ yếu: Giới thiệu về hệ quản trị cơ sở dữ liệu; Tạo và quản lý cơ sở dữ liệu; Tạo và quản lý các bảng; Truy vấn dữ liệu; Tạo và quản lý các chỉ mục; Tạo và quản lý các khung nhìn; Tạo và quản lý các thủ tục thường trú; Tạo và quản lý các hàm người dùng định nghĩa; Tạo và quản lý các Trigger. Nội dung chi tiết: PHÂN PHỐI SỐ TIẾT TÊN CHƢƠNG MỤC Chƣơng 1. Giới thiệu TS LT BT TH 5 3 2 10 6 4 15 9 6 1.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server (2005) 1.2. Các thành phần cơ bản trong Microsoft SQL Server (2005) 1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL) Chƣơng 2. Tạo và quản lý cơ sở dữ liệu 2.1. Các tệp tin cơ sở dữ liệu (Database files) 2.2. Tạo cơ sở dữ liệu (Database) 2.3. Quản lý cơ sở dữ liệu 2.4. Xóa cơ sở dữ liệu Chƣơng 3. Tạo và quản lý các bảng 3.1. Tạo bảng (Tables) 3.2. Định nghĩa các cột (Columns) 3.3. Định nghĩa các ràng buộc (Constrains) 3.4. Sửa bảng (ALTER TABLE) 3.5. Xóa bảng (DROP TABLE) 3.6. Thêm bản ghi mới (INSERT) KT 5 PHÂN PHỐI SỐ TIẾT TÊN CHƢƠNG MỤC TS LT BT TH 3.7. Cập nhật bản ghi (UPDATE) 3.8. Xóa bản ghi (DELETE) Chƣơng 4. Truy vấn dữ liệu 20 12 8 5 3 2 5 3 2 5 3 2 5 3 2 4.1. Truy vấn cơ bản 4.1.1. Mệnh đề SELECT 4.1.2. Mệnh đề FROM 4.1.3. Mệnh đề WHERE 4.1.4. Mệnh đề GROUP BY và HAVING 4.1.5. Mệnh đề ORDER BY 4.1.6. Kết hợp kết quả từ nhiều truy vấn khác nhau 4.2. Truy vấn từ nhiều bảng 4.2.1. Inner Joins 4.2.2. Outer Joins 4.3. Truy vấn lồng nhau (Subqueries) Chƣơng 5. Tạo và quản lý các chỉ mục 5.1. Các kiểu chỉ mục (Indexes) 5.2. Tạo các chỉ mục 5.3. Quản lý các chỉ mục 5.4. Xóa các chỉ mục Chƣơng 6. Tạo và quản lý khung nhìn 6.1. Định nghĩa 6.2. Tạo các khung nhìn (Views) 6.3. Quản lý các khung nhìn 6.4. Xóa các khung nhìn Chƣơng 7. Tạo và quản lý các thủ tục thƣờng trú 7.1. Tạo các thủ tục thường trú (Stored procedures) 7.2. Thực thi các thủ tục thường trú 7.3. Xem và sửa các thủ tục thường trú 7.4. Tham số vào và ra (Parameters) 7.5. Các thủ tục thường trú của hệ thống Chƣơng 8. Tạo và quản lý hàm ngƣời dùng định nghĩa 8.1. Các kiểu hàm người dùng định nghĩa (User-defined functions) KT 6 PHÂN PHỐI SỐ TIẾT TÊN CHƢƠNG MỤC TS LT BT TH KT 8.2. Tạo hàm người dùng định nghĩa 8.3. Quản lý hàm người dùng định nghĩa Chƣơng 9. Tạo và quản lý các Trigger 5 3 2 9.1. Tạo các Trigger thao tác dữ liệu (DML Triggers) 9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers) 9.3. Sử dụng các Trigger lồng nhau (Nested Triggers) 9.4. Sử dụng các Trigger đệ quy (Recursive Triggers) Nhiệm vụ của sinh viên: Tham dự các buổi học lý thuyết và thực hành, làm các bài tập được giao, làm các bài thi giữa học phần và bài thi kết thúc học phần theo đúng quy định. Tài liệu học tập: 1. Dương Quang Thiện, SQL Server 2000: Lập trình T - SQL, NXB Văn hóa Sài Gòn, 2007. 2. Ray Rankins, Paul Bertucci, Chris Gallelli, Alex T.Silverstein, Microsoft SQL Server 2005 Unleashed, Sams Publishing, 2007. 3. Brian Knightet al, Professional SQL Server 2005 Administration, Wrox Press, 2007. 4. Paul Turley & Dan Wood, Beginning Transact-SQL with SQL Server 2000 and 2005, Wrox Press, 2006. Hình thức và tiêu chuẩn đánh giá sinh viên: Hình thức thi: thi viết hoặc vấn đáp. Tiêu chuẩn đánh giá sinh viên: căn cứ vào sự tham gia học tập của sinh viên trong các buổi học lý thuyết và thực hành, kết quả làm các bài tập được giao, kết quả của các bài thi giữa học phần và bài thi kết thúc học phần. Thang điểm: Thang điểm chữ A, B, C, D, F. Điểm đánh giá học phần: Z = 0,4X + 0,6Y. Bài giảng này là tài liệu chính thức và thống nhất của Bộ môn Hệ thống Thông tin, Khoa Công nghệ Thông tin và được dùng để giảng dạy cho sinh viên. Ngày phê duyệt: Trƣởng Bộ môn / / 7 Chƣơng 1. Giới thiệu 1.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server 1.1.1.Khái niệm về CSDL và CSDL quan hệ A. Khái niệm về cơ sở dữ liệu (Database) Cơ sở dữ liệu là một tập hợp có tổ chức các dữ liệu có liên quan luận lý với nhau. Nói cách khác đó là một hệ thống các thông tin có cấu trúc được lưu trữ trên các thiết bị lưu trữ thông tin thứ cấp, ví dụ như: đĩa từ, băng từ, bộ nhớ flash,… nhằm mục đích thỏa mãn yêu cầu tổ chức dữ liệu để giúp cho việc khai thác dữ liệu được nhanh chóng và chính xác. Cơ sở dữ liệu phải được thiết kế sao cho có thể cho phép nhiều người dùng và nhiều ứng dụng khác nhau cùng khai thác. Hình 1: Sơ đồ tổng quát về một hệ cơ sở dữ liệu B. Khái niệm về cơ sở dữ liệu quan hệ Cơ sở dữ liệu quan hệ là cơ sở dữ liệu được tổ chức dựa trên mô hình của đại số quan hệ (Relational Model). Trong đó, dữ liệu được tổ chức thành các bảng dữ liệu (tables). Mỗi bảng dữ liệu gồm có các cột (column) hay còn gọi là các trường (field) và các dòng (row) hay còn gọi là các bản ghi (record). Ví dụ: Mã Sinh viên Tên Sinh viên Lớp HHA01 Lê Hoàng Long KTB48ĐH1 HHA02 Trần Bình Minh KTB48ĐH1 8 Về phương diện toán học, một bảng dữ liệu gồm có n cột: A1, A2, A3…, An có thể coi là một tập con R của tích Đề các dom(A1) x dom(A2)…x dom(An): R dom(A1) x dom(A2)…x dom(An) Người ta gọi đó là quan hệ R xác định trên tập thuộc tính {A1, A2,…, An}. Trong đó dom(Ai) là ký hiệu miền giá trị (domain) của cột Ai. Giữa các cột trong bảng có những mối quan hệ ràng buộc phụ thuộc lẫn nhau gọi là các phụ thuộc hàm. Ví dụ: Trong bảng sinh viên có phụ thuộc hàm: Mã Sinh Viên → Tên Sinh Viên, Lớp Trong một bảng dữ liệu, có thể có một cột (hoặc một số tối thiểu các cột) mà giá trị trên mỗi dòng của nó là duy nhất. Ta gọi đó là khóa (Key). Khi biết giá trị của trường khóa ta có thể suy ra các trường còn lại. Ví dụ: Trong bảng Sinh Viên thì Mã Sinh Viên là khóa. Khi biết Mã Sinh Viên ta có thể tra cứu ra các thuộc tính như Tên Sinh Viên và Lớp. Giữa hai bảng trong cơ sở dữ liệu cũng tồn tại các mối quan hệ ràng buộc lẫn nhau (bắt nguồn từ mô hình ER): Quan hệ 1 – 1: Một bản ghi thuộc bảng này tương ứng với một và chỉ một bản ghi ở bảng kia và ngược lại. Trong trường hợp này người ta thường nhập 2 bảng vào làm một. Quan hệ 1 – n: Một bản ghi thuộc bảng này tương ứng với n bản ghi ở bảng kia (n ≥ 0) nhưng ngược lại một bản ghi ở bảng kia chỉ tương ứng với không quá 1 bản ghi ở bảng này. Bảng ở phía ứng với ứng số nhiều n gọi là bảng con (child) còn bảng ở phía ứng với ứng số 1 gọi là bảng cha (parents). Bảng cha phải có một trường khóa gọi là khóa chính (PK - Primary Key) còn bảng con phải có một trường tham chiếu đến khóa chính của bảng cha gọi là khóa ngoại (FK - Foreign Key). Hình 2: Quan hệ 1- 1 9 Hình 3: Quan hệ 1 - n Quan hệ n – n: Quan hệ n – n không được biểu diễn tường minh trong CSDL. Người ta thường tách quan hệ n – n về thành các quan hệ 1 – n dựa trên mô hình thực thể liên kết (ER). 1.1.2. Khái niệm về hệ quản trị Cơ sở dữ liệu A. Hệ quản trị CSDL là gì? Hệ quản trị cơ sở dữ liệu là một tập hợp chương trình giúp cho người sử dụng tạo ra, duy trì và khai thác một cơ sở dữ liệu. Đó là một hệ thống phần mềm phổ dụng, cung cấp môi trƣờng và công cụ giúp cho việc định nghĩa, xây dựng và thao tác cơ sở dữ liệu cho các ứng dụng khác nhau một cách dễ dàng. Định nghĩa một cơ sở dữ liệu là đặc tả các kiểu dữ liệu, các cấu trúc, các ràng buộc cho các dữ liệu sẽ được lưu trữ. Xây dựng cơ sở dữ liệu là lưu trữ dữ liệu lên các phương tiện lưu trữ được hệ quản trị cơ sở dữ liệu kiểm soát. Thao tác trên một cơ sở dữ liêu là quá trình truy vấn cơ sở dữ liệu để lấy ra các dữ liệu cụ thể, cập nhật cơ sở dữ liệu, tạo ra các báo cáo từ dữ liệu. 10 Hình 4: Mô hình Hệ quản trị cơ sở dữ liệu Mỗi hệ quản trị cơ sở dữ liệu có một ngôn ngữ định nghĩa dữ liệu riêng (DDL - Data Definition Languague). Đây là ngôn ngữ dùng để định nghĩa, khai báo cấu trúc của của cơ sở dữ liêu. Những người thiết kế và quản trị cơ sở dữ liệu thực hiện các công việc khai báo cấu trúc cơ sở dữ liệu. Các chương trình khai báo cấu trúc CSDL được viết bằng ngôn ngữ DDL mà hệ quản trị CSDL cho phép. Các chương trình ứng dụng được viết bằng các ngôn ngữ lập trình C++/C#/Java/Delphi… kết hợp với các ngôn ngữ thao tác dữ liệu (DML - Data Manipulation Language) thông qua các thư viện hoặc đối tượng kết nối CSDL được ngôn ngữ lập trình hỗ trợ: ODBC, RDO, ADO,… Các hệ quản trị cơ sở dữ liệu quan hệ ngày nay phổ biến sử dụng các ngôn ngữ DDL và DML dựa trên ngôn ngữ SQL. Đối với hệ quản trị cơ sở dữ liệu SQL Server thì ngôn ngữ dùng để tương tác với cơ sở dữ liệu là T – SQL. Đây là một phiên bản của ngôn ngữ SQL. Ngôn ngữ T – SQL trên SQL Server bao gồm nhiều câu lệnh khác nhau, có thể chia thành 2 nhóm: o Nhóm ngôn ngữ định nghĩa dữ liệu DDL: với các lệnh cho phép tạo, thay đổi cấu trúc và xóa các đối tượng CSDL: database, table, view,… o Nhóm ngôn ngữ thao tác dữ liệu DML: với các lệnh như SELECT/INSERT/UPDATE/DELETE cho phép lấy về dữ liệu cụ thể, thay đổi giá trị của dữ liệu. 11 Hình 5: Tương tác với hệ quản trị Cơ sở dữ liệu B. Hoạt động của hệ quản trị cơ sở dữ liệu Hình 6: Hoạt động của hệ quản trị cơ sở dữ liệu Các yêu cầu của chương trình ứng dụng được chuyển tới hệ quản trị CSDL (theo con đường số 1). Tại đây hệ quản trị CSDL sẽ tham khảo các từ điển dữ liệu (Meta DataBase) để tìm kiếm các ánh xạ cấu trúc ngoài với cấu trúc quan niệm và cấu trúc vật lý (các ngõ a, b và c). Tại đây hệ quản trị 12 CSDL có thể sẽ tham khảo tới vùng đệm của nó để xác định xem câu trả lời đã có sẵn ở đó chưa, nếu có thì trả lại cho chương trình ứng dụng thông qua con đường số 8b; ngược lại sẽ yêu cầu hệ điều hành truy xuất thông tin theo con đường số 2. Tới đây hệ điều hành sẽ gửi yêu cầu truy xuất thông tin trong CSDL thông qua hệ thống xuất nhập của HĐH (các con đường số 3 và 5). Nếu việc truy xuất không thành công nó sẽ trả lại yêu cầu về cho hệ quản trị CSDL (có thể thông qua các mã lỗi) qua con đường số 6; nếu thành công thì dữ liệu sẽ được chuyển vào vùng đệm của hệ quản trị CSDL. Qua xử lý, hệ quản trị CSDL sẽ chuyển dữ liệu vào vùng đệm của chương trình ứng dụng đề nó xử lý (qua con đường 8a) và cho ra kết quả trả lời của chương trình ứng dụng qua con đường số 10. 1.1.3. Giới thiệu về SQL Server và mô hình Client/Server 1.1.3.1. Khái niệm về mô hình Client/Server Hình 7: Mô hình Client/Server Mô hình client/server hay còn gọi là mô hình khách/chủ là một mô hình nổi tiếng trong mạng máy tính, được áp dụng rất rộng rãi. Ý tưởng của mô hình này là máy trạm (hay còn gọi là máy khách) gửi yêu cầu (request) cho máy chủ (đóng vai trò người cung ứng dịch vụ), máy chủ sẽ xử lý và trả kết quả về cho máy khách. Client/Server là mô hình mang tính tổng quát. Trên thực tế thì một server có thể được nối tới nhiều server khác nhằm làm việc hiệu quả và nhanh hơn. Khi nhận được 1 yêu cầu từ client, server này có thể gửi tiếp yêu cầu vừa nhận được cho server khác ví dụ như database server vì bản thân nó không thể xử lý yêu cầu này được. Máy server có thể thi hành các nhiệm vụ đơn giản hoặc phức tạp. Ví dụ như một máy chủ trả lời thời gian hiện tại trong ngày, khi một máy client yêu cầu lấy thông tin về thời gian nó sẽ phải gửi một yêu cầu theo một tiêu chuẩn do server định 13 ra, nếu yêu cầu được chấp nhận thì máy server sẽ trả về thông tin mà client yêu cầu. Có rất nhiều các dịch vụ server trên mạng nhưng nó đều hoạt động theo nguyên lý là nhận các yêu cầu từ client sau đó xử lý và trả kết quả cho client yêu cầu. Thông thường chương trình server và client được thi hành trên hai máy khác nhau. Cho dù lúc nào server cũng ở trạng thái sẵn sàng chờ nhận yêu cầu từ client nhưng trên thực tế một tiến trình liên tác qua lại (interaction) giữa client và server lại bắt đầu ở phía client, khi mà client gửi tín hiệu yêu cầu tới server. Các chương trình server thường đều thi hành ở mức ứng dụng (tầng ứng dụng của mạng). Sự thuận lợi của phương pháp này là nó có thể làm việc trên bất cứ một mạng máy tính nào có hỗ trợ giao thức truyền thông chuẩn cụ thể ở đây là giao thức TCP/IP. Với các giao thức chuẩn này cũng giúp cho các nhà sản xuất có thể tích hợp nhiều sản phẩm khác nhau của họ lên mạng mà không gặp phải khó khăn gì. Với các chuẩn này thì các chương trình server cho một dịch vụ nào đấy có thể thi hành trên một hệ thống chia sẻ thời gian (timesharing system) với nhiều chương trình và dịch vụ khác hoặc nó có thể chạy trên chính một máy tính các nhân bình thường. Có thể có nhiều chương trình server cùng làm một dịch vụ, chúng có thể nằm trên nhiều máy tính hoặc một máy tính. Với mô hình trên chúng ta nhận thấy rằng mô hình client/server chỉ mang đặc điểm của phần mềm không liên quan gì đến phần cứng mặc dù trên thực tế yêu cầu cho một máy server là cao hơn nhiều so với máy client. Lý do là bởi vì máy server phải quản lý rất nhiều các yêu cầu từ các clients khác nhau trên mạng. Ưu và nhược điểm chính Có thể nói rằng với mô hình client/server thì mọi thứ dường như đều nằm trên bàn của người sử dụng, nó có thể truy cập dữ liệu từ xa (bao gồm các công việc như gửi và nhận file, tìm kiếm thông tin, ...) với nhiều dịch vụ đa dạng mà mô hình cũ không thể làm được. Mô hình client/server cung cấp một nền tảng lý tưởng cho phép tích hợp các kỹ thuật hiện đại như mô hình thiết kế hướng đối tượng, hệ chuyên gia, hệ thông tin địa lý (GIS) ... Một trong những vấn đề nảy sinh trong mô hình này đó là tính an toàn và bảo mật thông tin trên mạng. Do phải trao đổi dữ liệu giữa 2 máy ở 2 khu vực khác nhau cho nên dễ dàng xảy ra hiện tượng thông tin truyền trên mạng bị lộ. 1.1.3.2. SQL Server và mô hình Client/Server 14 Hình 8a: SQL Server và mô hình Client/Server Hình 8b: Dùng các công cụ của SQL Server để truy xuất từ máy khách SQL Server là một hệ quản trị cơ sở dữ liệu quan hệ hoạt động trên môi trường mạng theo mô hình khách/chủ. Phía máy chủ chạy các dịch vụ cần thiết mà quan trọng nhất là dịch vụ cơ sở dữ liệu SQL Server Service. Máy chủ lắng nghe các yêu cầu kết nối đến từ các máy khách và đáp ứng các yêu cầu này. Các ứng dụng phía máy khách kết nối vào các dịch vụ cơ sở dữ liệu có thể là những phần mềm quản lý được viết bởi các ngôn ngữ lập trình có sử dụng các thư viện đối tượng truy xuất CSDL như ADO, ADO.Net, RDO, ODBC, JDBC,... hoặc có thể là chính các công cụ của SQL Server như: Service Manager, Enterprise Manager hay Query Analyzer. Trong môi trường SQL Server, các yêu cầu từ phía máy khách sẽ nằm dưới dạng các lệnh T-SQL. SQL Server sẽ xử lý các lệnh này rồi trả về một resultset cho ứng dụng client với những thông tin được yêu cầu hoặc chỉ xác nhận là công việc được hoàn thành mỹ mãn. Nhiều ứng dụng client hoặc người sử dụng có thể song hành đưa ra cùng lúc những yêu cầu và SQL Server có thể xử lý chúng song song. Một ứng dụng client có thể cung cấp một "cấp độ thoải mái" khác nhau cho người sử dụng. Các công cụ đơn giản nhất (nhưng không dễ dùng) cho phép người sử dụng đưa vào một yêu cầu dưới dạng lệnh T-SQL rồi nhận được những resultset dưới dạng văn bản hoặc table. Còn các công cụ tinh vi hơn sẽ cho ra những biểu mẫu, báo cáo, biểu đồ,... cũng như các đối tượng màn hình thân thiện hơn. Cũng như đã trình bày ở trên, để thiết lập kết nối vật lý với một server CSDL và chuyển những yêu cầu cũng như nhận về kết quả (resultset), các ứng dụng phía client có thể sử dụng nhiều đối tượng hoặc các thư viện truy xuất cơ sở dữ liệu khác nhau.(data access objects hoặc data access API). Những đối tượng truy xuất cơ sở dữ liệu thông dụng hiện nay bao gồm: o ADO (ActiveX Database Object) o RDO (Remote Database Object) o DB - Library o ODBC (Open Database Connectivity) 15 o OLE DB (Object Linking and Embbeding Database) o DAO (Data Access Object) Các nhà phát triển ứng dụng dùng các đối tượng kể trên hoặc các hàm API để truy cập các đối tượng cơ sở dữ liệu và dữ liệu được lưu trữ trong các đối tượng này để triển khai những ứng dụng trong các ngôn ngữ lập trình chẳng hạn VB, C/C++, Java, VB.Net, C#,... 1.1.3.4. Mô hình Client/Server cục bộ Nếu trình ứng dụng truy xuất CSDL và hệ quản trị CSDL SQL Server được cài đặt trên cùng một máy tính vật lý thì ta có mô hình Client/Server cục bộ. Lúc này, vai trò của SQL Server không khác với các hệ quản trị CSDL truyền thống như Foxpro hay MS Access. SQL Server che dấu sự khác biệt giữa kết nối cục bộ và kết nối qua mạng. Người dùng không nhận thấy sự khác biệt ngoài việc tốc độ truyền thông trên mạng chậm hơn tốc độ truyền thông cục bộ. Hình 9: Mô hình Client/Server cục bộ 1.1.3.5. SQL Server và mô hình cơ sở dữ liệu phân tán Cơ sở dữ liệu phân tán là tập hợp các dữ liệu thuộc về cùng một hệ thống, có liên quan logic với nhau và được trải ra trên hệ thống mạng. Hệ quản trị cơ sở dữ liệu phân tán là tập các phần mềm quản trị một cơ sở dữ liệu phân tán, làm cho việc phân tán trở nên trong suốt với người dùng. Khái niệm trong suốt ở đây được hiểu là chủ đích che dấu sự phân tán đối với người sử dụng, làm cho người sử dụng sử dụng cơ sở dữ liệu phân tán như là cơ sở dữ liệu tập trung. SQL Server là hệ quản trị cơ sở dữ liệu hỗ trợ cơ sở dữ liệu phân tán. Nó cho phép tạo ra các view từ các bảng dữ liệu trên các Server khác nhau được kết nối (linked server), thực thi các truy vấn hay chuyển tác phân tán trải dài trên nhiều Server,... 16 Hình 10: Mô hình cơ sở dữ liệu phân tán 1.1.3.6. Kiến trúc đa tầng Hình 11: Mô hình phân lớp hệ thống SQL Server là hệ quản trị cơ sở dữ liệu hoạt động trên môi trường mạng theo mô hình client/server, cho nên khi nên khi phát triển các ứng dụng cơ sở dữ liệu người ta có thể sử dụng các kiến trúc phân lớp (phân chia hệ thống thành các components hay layer), các lớp có thể được thực thi một phần ở server, một phần ở client (kiến trúc nhị tầng) và có thể trên một số trạm trung gian nữa nếu cần thiết (kiến trúc tam tầng). A. Kiến trúc nhị tầng Fat Client Đây là kiểu kiến trúc client/server phổ biến. Phía client của một hệ thống như thế sẽ bao gồm các lớp: 17 o User interface: lớp giao diện người sử dụng. o Presentation service: lớp dịch vụ trình bày. o Business services: lớp thi công các quy tắc nghiệp vụ của hệ thống. o Data services: lớp truy cập và xử lý dữ liệu. Hình 12: Kiến trúc nhị tầng Fat Client Trong khi đó, Data Storage (lớp lưu trữ và quản lý dữ liệu), thường là hệ thống cơ sở dữ liệu (database system), sẽ được đặt tại server. Vì Business services và Data services được thực thi hoàn toàn ở phía client, còn phía server chỉ thực thi các chức năng lưu trữ và quản trị dữ liệu nên sức nặng của hệ thống dồn về phía client. Người ta gọi kiến trúc phân tâng như vậy là Fat Client (Client "béo": chức năng xử lý dồn về phía client) (xem hình 12). B. Kiến trúc nhị tầng Fat Server Ngoài kiểu thực thi hệ thống như trên, người ta có thể cho thực thi toàn bộ Data Services và một phần Business services ở phía server, ví dụ dưới dạng các thủ tục thường trú (stored procedure). Loại kiến trúc như thế thường được gọi là Fat Server. Kiến trúc này giúp san sẻ một phần sức nặng xử lý từ client lên server để giảm tải cho client, tận dụng hiệu năng xử lý phía server. 18 Hình 13: Kiến trúc nhị tầng Fat Server C. Kiến trúc tam tầng Để cải tiến xa hơn hệ thống, ta có thể sử dụng kiến trúc tam tầng, theo đấy các lớp Data services, Business services và Presentation services sẽ nằm trên những tầng khác nhau một cách chặt chẽ. Người ta bổ sung thêm một tầng trung gian (middleware component), Business services sẽ được thực thi trên tầng trung gian này. Biện pháp này giúp giảm tải cho cả server và client, tăng hiệu năng xử lý của hệ thống. Trong mô hình thực tế, tầng trung gian có thể bao gồm một số các máy tính chuyên dụng để chạy các dịch vụ Business Services (xem hình 14) Hình 14: Kiến trúc tam tầng 19 1.2. Các thành phần cơ bản trong Microsoft SQL Server 1.2.1. Cài đặt và cấu hình SQL Server Bƣớc 1: Khi cửa sổ cài đặt xuất hiện ta thấy có các mục để lựa chọn: Install Database Server tức là cài đặt các thành phần cơ bản và quan trọng nhất của hệ quản trị CSDL SQL Server bao gồm các dịch vụ chạy trên server, các công cụ quản lý như Services Manager, Enterprise Manager, Query Analyzer,... Install Analysis Services là cài đặt các dịch vụ phân tích phục vụ cho khai phá dữ liệu (data mining). Install English Query là cài đặt công cụ cho phép thực thi các truy vấn bằng cách sử dụng ngôn ngữ tự nhiên (tiếng Anh) thay vì sử dụng ngôn ngữ SQL. Ta chọn Install Database Server để cài đặt các thành phần của hệ quản trị. Các lựa chọn cài đặt Install Analysis Services và Install English Query trước mắt chưa cần quan tâm đến, khi nào cần dùng đến chúng ta sẽ cài đặt bổ sung. Bƣớc 2: Cửa sổ Computer Name xuất hiện. Tại đây cho phép ta điền vào tên máy tính mà ta muốn cài đặt SQL Server. Nếu ta chọn cài đặt trên Local Computer thì tên máy tính hiện hành sẽ tự động được điền vào. Nếu ta chọn Remote Computer tức là cài đặt SQL Server lên máy tính khác (có kết nối mạng với máy tính hiện hành) thì ta phải chỉ rõ tên máy đó. Trong trường hợp của ta, chọn Local Computer và nhấn Next để cài lên máy tính hiện hành. 20 Bƣớc 3: Cửa sổ Installation Selection xuất hiện cho phép ta lựa chọn chế độ cài đặt: Create a new instance of SQL Server, or install Client Tools: Chọn mục này nếu ta muốn cài mới hoàn toàn một phiên bản (hay còn gọi là "thể hiện" - instance) của SQL Server hoặc muốn cài đặt các công cụ phía Client cho phép truy xuất, quản lý Server. Upgrade, remove or add components to an existing instance of SQL Server: Chọn mục này nếu ta muốn nâng cấp, thêm bớt một số components của một phiên bản SQL Server đã được cài đặt trước đó trên máy tính. Advanced options: Một số tùy chọn cài đặt nâng cao, với các tùy chọn cài đặt ở mức hết sức chi tiết dành cho những người dùng có kinh nghiệm. Trong trường hợp của ta, chọn mục đầu tiên: Create a new instance of SQL Server, or install Client Tools và nhấn Next để sang bước tiếp theo. 21 Bƣớc 4: Cửa sổ User Information xuất hiện yêu cầu ta nhập các thông tin cơ bản về người dùng và công ty sử dụng sản phầm SQL Server. Bƣớc 5: Hộp thoại Software License Agreement xuất hiện, yêu cầu ta chấp nhận các điều khoản về License. Nhấn Next để tiếp tục. 22 Bƣớc 6: Hộp thoại Installation Definition xuất hiện cho phép ta chỉ định các thành phần cài đặt với các tùy chọn: Client Tools Only: Chỉ cài đặt các công cụ truy xuất và quản trị phía Client chứ không cài đặt các thành phần dịch vụ của Database Server lên máy tính hiện hành. Tùy chọn này dùng khi ta đã đặt Server dữ liệu trên một máy khác và giờ ta muốn ngồi ở máy hiện hành để truy xuất, điều khiển, cấu hình Server dữ liệu từ xa. Server and Client Tools: Cài đặt tất cả các thành phần bao gồm Database Server, các công cụ phía Server và Client lên máy tính hiện hành. Conectivity Only: Chỉ cài đặt các thư viện kết nối để hỗ trợ các ứng dụng trên máy Client có thể kết nối với SQL Server. Trong trường hợp của ta, chọn mục Server and Client Tools và nhấn Next để tiếp tục. 23 Bƣớc 7: Cửa sổ Setup Type xuất hiện cho ta lựa chọn một số thông số cài đặt. Có mấy tùy chọn sau: Typical: Cài đặt với các tùy chọn thông dụng nhất. Minimum: Cài đặt với các tùy chọn tối thiểu (yêu cầu cấu hình thấp nhất). Custom: Cho phép người dùng tự mình lựa chọn và loại bỏ những thành phần có thể được cài đặt. Trong trường hợp của ta, chọn mục Typical. Ở phần Destination Folder gồm hai mục: Program Files: Cho phép chỉ định nơi cài đặt SQL Server Data Files: Chỉ định nơi lưu trữ mặc định các tệp tin cơ sở dữ liệu của SQL Server. Sau khi đã thiết lập xong các thông số, nhấn Next để tiếp tục. Bƣớc 8: 24 Hộp thoại Services Account xuất hiện yêu cầu ta thiết lập một số thông số ban đầu liên quan tới tài khoản người dùng dùng để đăng nhập vào SQL Server. Có hai tùy chọn cơ bản: Use the same account for each service. Auto start SQL Server Service: Dùng chung một account cho tất cả các dịch vụ của SQL Server. Dịch vụ SQL Server Service sẽ tự động được khởi động nếu cần thiết. Customize the setting for each service: Thay vì dùng chung, mỗi dịch vụ sẽ có tùy chọn riêng. Lựa chọn này có tính bảo mật cao nhưng khá phiền phức. Trong trường hợp của ta, chọn mục Use the same account for each service. Auto start SQL Server Service. Ở phần Service Setting có hai tùy chọn: Use the Local System account: Sử dụng tài khoản hệ thống trên máy tính hiện hành làm tài khoản đăng nhập vào SQL Server. User a Domain User Account: Sử dụng tài khoản Domain User để đăng nhập vào SQL Server nếu máy tính hiện hành đang làm việc trong môi trường Domain của Windows Server 2000/2003. Trong trường hợp của ta, chọn mục Use the Local System account. Nhấn Next để tiếp tục Bƣớc 9: Hộp thoại Authentication Mode xuất hiện cho phép chúng ta thiết lập chế độ xác thực người dùng của SQL Server. Có hai lựa chọn: Windows Authentication Mode: Xác thực dựa trên account của Windows. Chỉ những người dùng có account đăng nhập của hệ điều hành Windows (những account Windows này phải được đăng ký trước với SQL Server) thì mới có thể đăng nhập vào hệ thống SQL Server. 25 Mixed Mode: Chế độ xác thực hỗn hợp. Chế độ này cho phép cả những người dùng có account của Windows và những người dùng có account riêng của SQL Server đều có thể đăng nhập hệ thống. Trong trường hợp này, tài khoản sa - tài khoản quản trị hệ thống mặc định của SQL Server trở nên có hiệu lực, SQL Server gợi ý người dùng nên nhập password cho account này để đảm bảo tính bảo mật cho hệ thống. Trong trường hợp của ta, chọn chế độ Mixed Mode, account của sa để trống sau đó nhấn Next để tiếp tục cài đăt. Các bước tiếp theo không có gì đặc biệt. Cứ nhấn Next để tiếp tục quá trình cài đặt. Việc cài đặt diễn ra nhanh hay chậm tùy thuộc vào từng máy tính. Quá trình cài đặt xong xuôi, nhấn Finish để kết thúc. 1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL) SQL, viết tắt của Structured Query Language (ngôn ngữ hỏi có cấu trúc), là công cụ sử dụng để tổ chức, quản lý và truy xuất dữ liệu đuợc lưu trữ trong các cơ sở dữ liệu. SQL là một hệ thống ngôn ngữ bao gồm tập các câu lệnh sử dụng để tương tác với cơ sở dữ liệu quan hệ. Tên gọi ngôn ngữ hỏi có cấu trúc phần nào làm chúng ta liên tưởng đến một công cụ (ngôn ngữ) dùng để truy xuất dữ liệu trong các cơ sở dữ liệu. Thực sự mà nói, khả năng của SQL vượt xa so với một công cụ truy xuất dữ liệu, mặc dù đây là mục đích ban đầu khi SQL được xây dựng nên và truy xuất dữ liệu vẫn còn là một trong những chức năng quan trọng của nó. SQL được sử dụng để điều khiển tất cả các chức năng mà một hệ quản trị cơ sở dữ liệu cung cấp cho người dùng bao gồm: • Định nghĩa dữ liệu: SQL cung cấp khả năng định nghĩa các cơ sở dữ liệu, các cấu trúc lưu trữ và tổ chức dữ liệu cũng như mối quan hệ giữa các thành phần dữ liệu. • Truy xuất và thao tác dữ liệu: Với SQL, người dùng có thể dễ dàng thực hiện các thao tác truy xuất, bổ sung, cập nhật và loại bỏ dữ liệu trong các cơ sở dữ liệu. 26 • Điều khiển truy cập: SQL có thể được sử dụng để cấp phát và kiểm soát các thao tác của người sử dụng trên dữ liệu, đảm bảo sự an toàn cho cơ sở dữ liệu Đảm bảo toàn vẹn dữ liệu: SQL định nghĩa các ràng buộc toàn vẹn trong cơ sở dữ liệu nhờ đó đảm bảo tính hợp lệ và chính xác của dữ liệu trước các thao tác cập nhật cũng như các lỗi của hệ thống. Như vậy, có thể nói rằng SQL là một ngôn ngữ hoàn thiện được sử dụng trong các hệ thống cơ sở dữ liệu và là một thành phần không thể thiếu trong các hệ quản trị cơ sở dữ liệu. Mặc dù SQL không phải là một ngôn ngữ lập trình như C, C++, Java,... song các câu lệnh mà SQL cung cấp có thể được nhúng vào trong các ngôn ngữ lập trình nhằm xây dựng các ứng dụng tương tác với cơ sở dữ liệu. Khác với các ngôn ngữ lập trình quen thuộc như C, C++, Java,... SQL là ngôn ngữ có tính khai báo. Với SQL, người dùng chỉ cần mô tả các yêu cầu cần phải thực hiện trên cơ sở dữ liệu mà không cần phải chỉ ra cách thức thực hiện các yêu cầu như thế nào. Chính vì vậy, SQL là ngôn ngữ dễ tiếp cận và dễ sử dụng. Trong hầu hết các hệ quản trị cơ sở dữ liệu quan hệ, SQL có những vai trò như sau: • SQL là ngôn ngữ hỏi có tính tƣơng tác: Người sử dụng có thể dễ dàng thông qua các trình tiện ích để gởi các yêu cầu dưới dạng các câu lệnh SQL đến cơ sở dữ liệu và nhận kết quả trả về từ cơ sở dữ liệu • SQL là ngôn ngữ lập trình cơ sở dữ liệu: Các lập trình viên có thể nhúng các câu lệnh SQL vào trong các ngôn ngữ lập trình để xây dựng nên các chương trình ứng dụng giao tiếp với cơ sở dữ liệu • SQL là ngôn ngữ quản trị cơ sở dữ liệu: Thông qua SQL, người quản trị cơ sở dữ liệu có thể quản lý được cơ sở dữ liệu, định nghĩa các cấu trúc lưu trữ dữ liệu, điều khiển truy cập cơ sở dữ liệu,... • SQL là ngôn ngữ cho các hệ thống khách/chủ (client/server): Trong các hệ thống cơ sở dữ liệu khách/chủ, SQL được sử dụng như là công cụ để giao tiếp giữa các trình ứng dụng phía máy khách với máy chủ cơ sở dữ liệu. • SQL là ngôn ngữ truy cập dữ liệu trên Internet: Cho đến nay, hầu hết các máy chủ Web cũng như các máy chủ trên Internet sử dụng SQL với vai trò là ngôn ngữ để tương tác với dữ liệu trong các cơ sở dữ liệu. • SQL là ngôn ngữ cơ sở dữ liệu phân tán: Đối với các hệ quản trị cơ sở dữ liệu phân tán, mỗi một hệ thống sử dụng SQL để giao tiếp với các hệ thống khác trên mạng, gởi và nhận các yêu cầu truy xuất dữ liệu với nhau. Bài tập Câu 1: Trình bày khái niệm về cơ sở dữ liệu quan hệ. Cơ sở dữ liệu quan hệ có những điểm khác biệt gì so với hệ thống xử lý file truyền thống? 27 Câu 2: Trình bày khái niệm về hệ quản trị cơ sở dữ liệu quan hệ. Câu 3: Trình bày về mô hình Client/Server và kiến trúc phân tầng. Câu 4: Nêu các thành phần cơ bản của hệ quản trị CSDL SQL Server. Câu 3: Trình bày những đặc điểm cơ bản của ngôn ngữ vấn tin SQL. 28 Chƣơng 2. Tạo và quản lý cơ sở dữ liệu 2.1. Các tệp tin cơ sở dữ liệu (Database files) Trong SQL Server, một user database có thể bao gồm hai hay nhiều tập tin (mặc định là 2). Các tập tin trong một database có thể chia làm 3 loại: Primary Data File: Mỗi database phải có ít nhất một tập tin Primary data file với phần mở rộng là .MDF. Tập tin này ngoài nhiệm vụ cất trữ dữ liệu thuần túy còn nhiệm vụ lưu trữ thông tin liên quan đến cấu trúc và đặc điểm của chính database đó (lưu trong các system tables). Ta tuyệt đối không nên can thiệp vào các system tables này vì việc này có thể phá hỏng database. Secondary Data File: Mỗi database có thể không có hoặc có nhiều Secondary Data File. Các tập tin này chỉ thuần túy lưu trữ dữ liệu và có phần mở rộng là .NDF. Log File: Mỗi database phải có ít nhất một transaction log file (có phần mở rộng là .LDF). Log file làm nhiệm vụ lưu trữ thông tin liên quan các giao dịch (transaction) thực hiện trên database đó. Thông tin này một phần phục vụ cho thao tác Roll Back khi có lỗi giao dịch xảy ra. Mỗi tập tin trong CSDL (.MDF,.NDF,.LDF) đêu có 5 thuộc tính: NAME: Tên logic của tập tin. FILENAME: Đường dẫn đầy đủ (tên vật lý). SIZE: Kích thước ban đầu của tập tin (KB, MB, GB, TB). MAXSIZE: Kích thước tối đa cho phép của tập tin (KB, MB, GB,TB). FILEGROWTH : Tốc độ gia tăng kích thước của tập tin (KB, MB, GB, TB,%). Các tập tin CSDL được tổ chức thành các nhóm gọi là file group theo nguyên tắc: Một CSDL có thể có một hay nhiều file group. Trong đó bắt buộc phải có một file group chính gọi là PRIMARY. Mỗi file group có thể chứa một hay nhiều tập tin dữ liệu (.MDF, .NDF). Trong đó phải có ít nhát 1 tập tin Primary Data File (.MDF) nằm trong group chính PRIMARY. Các tập tin Log không thuộc về một file group nào cả. 2.2. Tạo cơ sở dữ liệu (Database) 2.2.1. Sử dụng lệnh CREATE DATABASE CREATE DATABASE <tên CSDL> [ ON 29 PRIMARY <Khai báo tập tin .MDF>, [<Khai báo tập tin .NDF>,] ...] [ FILEGROUP <tên file group> <Khai báo tập tin .NDF>, [<Khai báo tập tin .NDF>,] ...] ... [LOG ON <Khai báo tập tin .LDF>, [<Khai báo tập tin .LDF>,] ...] [COLLATE <tên collation>] [FOR ATTACH] Cú pháp đơn giản hay được sử dụng hơn cả là: CREATE DATABASE <tên CSDL> ON PRIMARY <Khai báo tập tin .MDF> LOG ON <Khai báo tập tin .LDF> Hoặc thậm chí đơn giản hơn nữa CREATE DATABASE <tên CSDL> Trong đó phần khai báo tập tin được bao bởi cặp ngoặc đơn “(…)” và gồm các thành phần: ( [NAME = <tên logic của tập tin>,] FILENAME = <tên vật lý (đường dẫn)>, [SIZE = <kích thước ban đầu>,] [MAXSIZE = <kích thước lớn nhất có thể> | UNLIMITED], [FILEGROWTH = <Tỷ lệ gia tăng kích thước>]) Chú ý: Khi không chỉ rõ kích thước ban đầu (SIZE) của tập tin thì: Đối với tập tin .MDF, SQL Server sẽ lấy kích thước của tập tin .MDF trong Model Database. Đối với các tập tin .NDF, .LDF, SQL Server tự khởi tạo giá trị mặc định là 1MB. Đơn vị mặc định của SIZE và MAXSIZE là MB. 30 2.1.2. Sử dụng Enterprise Manager để tạo CSDL 31 32 2.3. Quản lý cơ sở dữ liệu 2.3.1. Sử dụng lệnh ALTER DATABSE ALTER DATABASE <tên CSDL> [ ADD FILE <Khai báo tập tin .MDF,.NDF> [, . . .] [ TO FILEGROUP <Tên File Group>] ] [ADD LOG FILE <Khai báo tập tin .LDF> [, . . .]] [ADD FILEGROUP <Tên File Group>] [REMOVE FILE <Tên logic của tập tin>] [REMOVE FILEGROUP <Tên File Group>] [MODIFY NAME = <Tên mới cho Database>] [MODIFY FILE <Khai báo tập tin>] [MODIFY FILEGROUP <Tên File Group> <Thuộc tính File Group>|NAME = <Tên mới>] [COLLATE <Tên collation>] Trong đó phần khai báo tập tin được bao bởi cặp ngoặc đơn “(…)” và gồm các thành phần: ( NAME = <tên logic của tập tin>, [NEWNAME = <tên logic mới cho tập tin>,] [FILENAME = <tên vật lý (đường dẫn)>], [SIZE = <kích thước ban đầu>,] [MAXSIZE = <kích thước lớn nhất có thể> | UNLIMITED], [FILEGROWTH = <Tỷ lệ gia tăng kích thước>]) Chú ý: Riêng NEWNAME chỉ dùng khi MODIFY FILE <Thuộc tính File Group> bao gồm: READONLY: Khi một file group bị đánh dấu READONLY thì mọi thao tác cập nhật dữ liệu trên các tập tin thuộc file group này đều không thể thực hiện được. Không được phép áp dụng thuộc tính này cho Primary Group. READWRITE: Ngược lại với READONLY DEFAULT: Đánh dấu file group như là file group mặc định của database hiện thời. 33 2.3.2. Sửa đổi cơ sở dữ liệu bằng Enterprise Manager 34 2.4. Xóa cơ sở dữ liệu 2.4.1. Sử dụng lệnh DROP DATABASE trên Query Analyzer DROP DATABASE <tên CSDL> 2.4.2. Xóa CSDL sử dụng Enterprise Manager 2.5. Các system database đặc biệt Ngay sau khi SQL Server mới được cài đặt xong, có 6 database tự động được cung cấp. Người ta gọi những database này là các system database để phân biệt với các database do người dùng tự tạo ra sau này (user database). Các system database bao gồm: Model database Master database Msdb database Tempdb database 35 Pubs database Northwind database A. Master database Bao gồm tất cả các system table lưu trữ dữ liệu theo dõi việc cài đặt Server về mặt tổng thể cũng như theo dõi tất cả các user database được tạo ra về sau. Cụ thể hơn, Master database có chứa những system catalog lưu trữ thông tin liên quan đến: Khoảng trống đĩa (space disk). Cấp phát tập tin. Cài đặt để cấu hình toàn hệ thống. Tài khoản đăng nhập. Sự hiện hữu của các database khác. Sự hiện hữu của các SQL Server khác (trong các giao dịch phân tán). Mỗi khi tạo một database mới, thay đổi cấu hình, tài khoản đăng nhập,… tất cả thông tin đều được cập nhật vào Master database. B.Model database Đóng vai trò như một khuôn mẫu (template). Mỗi lần người dùng tạo mới một user database thì SQL Server sẽ dùng Model database làm “khuôn mẫu” cho việc tạo mới user database. Mỗi user database lúc mới tạo sẽ kế thừa các thuộc tính và có cấu trúc giống như Model database. Nếu ta muốn mỗi user database lúc mới tạo ra đã có sẵn một số đặc điểm nào đấy, ta có thể thiết lập các đặc điểm đó trên Model database. Các user database được tạo ra sau này sẽ tự động được kế thừa các đặc điểm đó. C. Tempdb database Là một database để lưu trữ dữ liệu tạm thời (tempotary). Nó được dùng để lưu trữ: Những dữ liệu tam thời (bảng tạm) do người dùng tạo ra Những kết quả trung gian phục vụ cho quá trình xử lý của nội bộ SQL Server: xử lý các câu truy vấn (Query), sắp xếp (Sorting),… Mặc định mỗi khi SQL Server được khởi động thì Tempdb database được tái tạo lại, mới hoàn toàn, mọi dữ liệu (bảng tạm) do người dùng lưu trữ lên Tempdb database trước đó sẽ biến mất D. Msdb Database Là một database phục vụ cho hoạt động SQL Server Agent service. Nó lưu trữ thông tin liên quan đến việc hoạch định tác vụ (Task Shedule) cho các hoạt động như: backup dữ liệu, tạo thứ bản (replication),… E. Pubs database và Northwind database Đây là hai CSDL được dùng làm thí dụ mẫu trong SQL Server book và các tài liệu hướng dẫn về SQL Server. Chú ý 36 Tuyệt đối không được tự ý xóa hay can thiệp trực tiếp vào các cơ sở dữ liệu Master và Msdb. Việc này có thể làm ảnh hưởng nghiêm trọng đến hoạt động của Server. Không nên tự ý sửa đổi CSDL dữ liệu Model nếu không có lý do chính đáng. Các CSDL Northwind và Pubs có thể xóa được nhưng không nên làm thế vì chúng là những ví dụ hay về CSDL rất nên tham khảo. Bài tập: Câu 1: Trình bày về tổ chức tập tin trong cơ sở dữ liệu SQL Server. Phân loại tập tin trong SQL Server. Cách khai báo đặc tả tập tin trong SQL Server (5 thuộc tính). Câu 2: Nêu chức năng các cơ sở dữ liệu hệ thống trong SQL Server. Câu 3: Trình bày cú pháp đầy đủ của lệnh CREATE DATABASE và giải thích ý nghĩa các tham số. 37 Chƣơng 3. Tạo và quản lý các bảng 3.1. Tạo bảng (Tables) 3.1.1. Sử dụng lệnh CREATE TABLE CREATE TABLE <Tên bảng dữ liệu> ( <Cột 1> <Kiểu dữ liệu> [<Thuộc tính nếu có>], <Cột 2> <Kiểu dữ liệu> [<Thuộc tính nếu có>], ... <Cột n> <Kiểu dữ liệu> [<Thuộc tính nếu có>], [Các ràng buộc nếu có] ) [ON <Tên file group> | DEFAULT] 3.1.2. Sử dụng Enterprise Manager Vào mục Tables trong CSDL muốn tạo Chọn New Table 38 3.2. Định nghĩa các cột (Columns) A. Thuộc tính NULL và NOT NULL Thuộc tính NULL o Khi một cột được xác lập thuộc tính là NULL giá trị tại cột đó được phép để trống (mang giá trị null) o Thuộc tính NULL là thuộc tính mặc định. Khi một cột không có khai báo gì thêm thì mặc định thuộc tính của cột đó NULL. 39 Thuộc tính NOT NULL Khi một cột được xác lập thuộc tính là NOT NULL thì giá trị tại cột đó không được phép để trống. Khai báo: <Tên cột> <Kiểu dữ liệu> NULL | NOT NULL B. Thuộc tính IDENTITY o Thuộc tính này cho phép ta chỉ định một cột kiểu số nguyên như là một cột định danh (Identity Comlumn) của table (gần giống như cột STT trong các bảng dữ liệu trên giấy). o Ta không phải nhập dữ liệu cho cột này mà các giá trị trên cột được tự đông phát sinh bắt đầu từ một giá trị khởi tạo và tăng dần theo một công sai nào đó được chỉ định, đồng thời đảm bảo tính duy nhất một cách tuyệt đối (không có hai giá trị nào trùng nhau). o Mục đích: có thể dùng cho việc tạo khóa tự động Khai báo: <Tên cột> <Kiểu dữ liệu> … Identity(seed, increment) Với: seed: giá trị khởi tạo, increment: mức tăng Ví dụ: Khai báo cột STT tăng tự động từ 1 STT bigint Identity(1,1) NOT NULL C. Thuộc tính ROWGUICOL o Thuộc tính này cho phép ta chỉ định một cột kiểu UniqueIdentifier như là cột mã định danh quốc tế duy nhất gọi là GUID (Gloabal Unique Identifier) o Tương tự như Identity, ROWGUICOL có thể dùng để tạo khóa tự động bằng cách sử dụng hàm hệ thống NEWID() như là giá trị mặc định cho cột. Khai báo: <Tên cột> UniqueIdentifier ROWGUICOL NOT NULL DEFAULT NEWID() 3.3. Định nghĩa các ràng buộc (Constrains) A. Ràng buộc khóa chính PRIMARY KEY Khi muốn chỉ định một cột làm khóa chính, ta sử dụng ràng buộc PRIMARY KEY trên cột đó theo cú pháp: Constraint <Tên ràng buộc> Primary Key(<Tên cột>) B. Ràng buộc khóa ngoại FOREIGN KEY Khi muốn chỉ định một cột làm khóa ngoại tham chiếu đến bảng cha, ta sử dụng ràng buộc FOREIGN KEY theo cú pháp: Constraint <Tên ràng buộc> Foreign Key(<Tên cột>) References <Tên bảng cha>(<Khóa chính>) C. Ràng buộc kiểm tra CHECK Khi muốn dữ liệu nhập vào phải thỏa mãn một biểu thức điều kiện nào đó ta có thể sử dụng ràng buộc kiểm tra CHECK với cú pháp Constraint <Tên ràng buộc> CHECK(<Biểu thức điều kiện>) 40 D. Ràng buộc mặc định DEFAULT Khi muốn khởi tạo giá trị mặc định cho một cột nào đó của bảng, ta khai báo ràng buộc DEFAULT ngay bên cạnh khai báo cột <Tên cột> <Kiểu dữ liệu> … DEFAULT <Giá trị mặc định> 3.4. Sửa bảng 3.4.1. Dùng lệnh ALTER TABLE ALTER TABLE <Tên bảng> [ADD <Tên cột> <Kiểu dữ liệu> [<Thuộc tính nếu có>],…] [ADD <Định nghĩa ràng buộc>,…] [ALTER COLUMN <Tên cột> [<Tên kiểu dữ liệu mới>] [NULL | NOT NULL] [ADD | DROP ROWGUIDCOL] [DROP COLUMN <Tên cột>,…] [DROP CONSTRAINT <Tên ràng buộc> ,…] [NOCHECK | CHECK CONSTRAINT <Tên ràng buộc>] Chú ý: NOCHECK dùng để tạm thời vô hiệu hóa một ràng buộc chứ không xóa bỏ nó khỏi CSDL. 3.4.2. Sửa đổi bảng dữ liệu sử dụng Enterprise Manager Click chuột phải lên bảng muốn sửa đổi. Chọn Design Table 41 3.5. Xóa bảng (DROP TABLE) 3.5.1. Sử dụng lệnh DROP TABLE DROP TABLE <Tên bảng dữ liệu> 3.5.2. Sử dụng Enterprise Manager 3.6. Thêm bản ghi mới (INSERT) Dữ liệu trong các bảng được thể hiện dưới dạng các dòng (bản ghi). Để bổ sung thêm các dòng dữ liệu vào một bảng, ta sử dụng câu lệnh INSERT. Hầu hết các hệ quản trị CSDL dựa trên SQL cung cấp các cách dưới đây để thực hiện thao tác bổ sung dữ liệu cho bảng: 42 • Bổ sung từng dòng dữ liệu với mỗi câu lệnh INSERT. Đây là các sử dụng thường gặp nhất trong giao tác SQL. • Bổ sung nhiều dòng dữ liệu bằng cách truy xuất dữ liệu từ các bảng dữ liệu khác. Bổ sung từng dòng dữ liệu với lệnh INSERT Để bổ sung một dòng dữ liệu mới vào bảng, ta sử dụng câu lệnh INSERT với cú pháp như sau: INSERT INTO tên_bảng[(danh_sách_cột)] VALUES(danh_sách_trị) Trong câu lệnh INSERT, danh sách cột ngay sau tên bảng không cần thiết phải chỉ định nếu giá trị các trường của bản ghi mới được chỉ định đầy đủ trong danh sách trị. Trong trường hợp này, thứ tự các giá trị trong danh sách trị phải bằng với số lượng các trường của bảng cần bổ sung dữ liệu cũng như phải tuân theo đúng thứ tự của các trường như khi bảng được định nghĩa. Ví dụ: Câu lệnh dưới đây bổ sung thêm một dòng dữ liệu vào bảng KHOA INSERT INTO khoa VALUES(„DHT10‟,‟Khoa Luật‟,‟054821135‟) Trong trường hợp chỉ nhập giá trị cho một số cột trong bảng, ta phải chỉ định danh sách các cột cần nhập dữ liệu ngay sau tên bảng. Khi đó, các cột không được nhập dữ liệu sẽ nhận giá trị mặc định (nếu có) hoặc nhận giá trị NULL (nếu cột cho phép chấp nhận giá trị NULL). Nếu một cột không có giá trị mặc định và không chấp nhận giá trị NULL mà không đuợc nhập dữ liệu, câu lệnh sẽ bị lỗi. Ví dụ: Câu lệnh dưới đây bổ sung một bản ghi mới cho bảng SINHVIEN INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES(„0241020008‟,„Nguyễn Công‟,‟Chính‟,1,‟C24102‟) câu lệnh trên còn có thể được viết như sau: INSERT INTO sinhvien VALUES(„0241020008‟,„Nguyễn Công‟,‟Chính‟, NULL,1,NULL,‟C24102‟) Bổ sung nhiều dòng dữ liệu từ bảng khác Một cách sử dụng khác của câu lệnh INSERT được sử dụng để bổ sung nhiều dòng dữ liệu vào một bảng, các dòng dữ liệu này được lấy từ một bảng khác thông qua câu lệnh SELECT. Ở cách này, các giá trị dữ liệu được bổ sung vào bảng không được chỉ định tường minh mà thay vào đó là một câu lệnh SELECT truy vấn dữ liệu từ bảng khác. Cú pháp câu lệnh INSERT có dạng như sau: INSERT INTO tên_bảng[(danh_sách_cột)] câu_lệnh_SELECT Ví dụ: Giả sử ta có bảng LUUSINHVIEN bao gồm các trường HODEM, TEN, NGAYSINH. Câu lệnh dưới đây bổ sung vào bảng LUUSINHVIEN các dòng dữ liệu có được từ câu truy vấn SELECT: 43 INSERT INTO luusinhvien SELECT hodem,ten,ngaysinh FROM sinhvien WHERE noisinh like „%Huế%‟ Khi bổ sung dữ liệu theo cách này cần lưu ý một số điểm sau: • Kết quả của câu lệnh SELECT phải có số cột bằng với số cột được chỉ định trong bảng đích và phải tương thích về kiểu dữ liệu. • Trong câu lệnh SELECT được sử dụng mệnh đề COMPUTE ... BY 3.7. Cập nhật bản ghi (UPDATE) Câu lệnh UPDATE trong SQL được sử dụng để cập nhật dữ liệu trong các bảng. Câu lệnh này có cú pháp như sau: UPDATE tên_bảng SET tên_cột = biểu_thức [, ..., tên_cột_k = biểu_thức_k] [FROM danh_sách_bảng] [WHERE điều_kiện] Sau UPDATE là tên của bảng cần cập nhật dữ liệu. Một câu lệnh UPDATE có thể cập nhật dữ liệu cho nhiều cột bằng cách chỉ định các danh sách tên cột và biểu thức tương ứng sau từ khoá SET. Mệnh đề WHERE trong câu lệnh UPDATE thường được sử dụng để chỉ định các dòng dữ liệu chịu tác động của câu lệnh (nếu không chỉ định, phạm vi tác động của câu lệnh được hiểu là toàn bộ các dòng trong bảng) Ví dụ 2.51: Câu lệnh dưới đây cập nhật lại số đơn vị học trình của các môn học có số đơn vị học trình nhỏ hơn 2 UPDATE monhoc SET sodvht = 3 WHERE sodvht = 2 Sử dụng cấu trúc CASE trong câu lệnh UPDATE Cấu trúc CASE có thể được sử dụng trong biểu thức khi cần phải đưa ra các quyết định khác nhau về giá trị của biểu thức Ví dụ Giả sử ta có bảng NHATKYPHONG sau đây Sau khi thực hiện câu lệnh: 44 UPDATE nhatkyphong SET tienphong=songay*CASE WHEN loaiphong='A' THEN 100 WHEN loaiphong='B' THEN 70 ELSE 50 END Dữ liệu trong bảng sẽ là: Điều kiện cập nhật dữ liệu liên quan đến nhiều bảng Mệnh đề FROM trong câu lệnh UPDATE được sử dụng khi cần chỉ định các điều kiện liên quan đến các bảng khác với bảng cần cập nhật dữ liệu. Trong truờng hợp này, trong mệnh đề WHERE thường có điều kiện nối giữa các bảng. Ví dụ: Giả sử ta có hai bảng MATHANG và NHATKYBANHANG như sau: Câu lệnh dưới đây sẽ cập nhật giá trị trường THANHTIEN của bảng NHATKYBANHANG theo công thức THANHTIEN = SOLUONG × GIA UPDATE nhatkybanhang SET thanhtien = soluong*gia FROM mathang WHERE nhatkybanhang.mahang = mathang.mahang 3.8. Xóa bản ghi (DELETE) Để xoá dữ liệu trong một bảng, ta sử dụng câu lệnh DELETE. Cú pháp của câu lệnh này như sau: DELETE FROM tên_bảng [FROM danh_sách_bảng] [WHERE điều_kiện] Trong câu lệnh này, tên của bảng cần xoá dữ liệu được chỉ định sau DELETE FROM. Mệnh đề WHERE trong câu lệnh được sử dụng để chỉ định điều kiện đối với các dòng dữ liệu cần xoá. Nếu câu lệnh DELETE không có mệnh đề WHERE thì toàn bộ các dòng dữ liệu trong bảng đều bị xoá. Ví dụ 2.55: Câu lệnh dưới đây xoá khỏi bảng SINHVIEN những sinh viên sinh tại Huế DELETE FROM sinhvien 45 WHERE noisinh LIKE „%Huế%‟ Xoá dữ liệu khi điều kiện liên quan đến nhiều bảng Nếu điều kiện trong câu lệnh DELETE liên quan đến các bảng không phải là bảng cần xóa dữ liệu, ta phải sử dụng thêm mệnh đề FROM và sau đó là danh sách tên các bảng đó. Trong trường hợp này, trong mệnh đề WHERE ta chỉ định thêm điều kiện nối giữa các bảng Ví dụ: Câu lệnh dưới đây xoá ra khỏi bảng SINHVIEN những sinh viên lớp Tin K24 DELETE FROM sinhvien FROM lop WHERE lop.malop=sinhvien.malop AND tenlop='Tin K24' Sử dụng truy vấn con trong câu lệnh DELETE Một câu lệnh SELECT có thể được lồng vào trong mệnh đề WHERE trong câu lệnh DELETE để làm điều kiện cho câu lệnh tương tự như câu lệnh UPDATE. Ví dụ: Câu lệnh dưới đây xoá khỏi bảng LOP những lớp không có sinh viên nào học DELETE FROM lop WHERE malop NOT IN (SELECT DISTINCT malop FROM sinhvien) Xoá toàn bộ dữ liệu trong bảng Câu lệnh DELETE không chỉ định điều kiện đối với các dòng dữ liệu cần xoá trong mệnh đề WHERE sẽ xoá toàn bộ dữ liệu trong bảng. Thay vì sử dụng câu lệnh DELETE trong trường hợp này, ta có thể sử dụng câu lệnh TRUNCATE có cú pháp như sau: TRUNCATE TABLE tên_bảng Bài tập Câu 1: Phân biệt user table và system table trong cơ sở dữ liệu SQL Server. Các system table thường lưu trữ những thông tin gì? Câu 2: Liệt kê và phân loại các kiểu dữ liệu mà SQL Server 2000 hỗ trợ. Câu 3: Trình bày cú pháp đầy đủ của lệnh CREATE TABLE và giải thích chức năng của từng tham số. Câu 4: Tạo cơ sở dữ liệu với các bảng dữ liệu sau đây: KhachHang(MaKH, TenKH, DiaChi) NhaCungCap(MaNCC, TenNCC, DiaChi) MatHang(MaMH,TenMH,DonViTinh, DonGia, MaNCC) HoaDon(MaHD, MaKH, NgayGiaoDich) ChiTietHoaDon(MaHD, MaMH, SoLuong) (Sinh viên tự xác định kiểu dữ liệu và mối liên kết giữa các bảng) 46 Chƣơng 4. Truy vấn dữ liệu 4.1. Truy vấn cơ bản 4.1.1. Mệnh đề SELECT Câu lệnh SELECT được sử dụng để truy xuất dữ liệu từ các dòng và các cột của một hay nhiều bảng, khung nhìn. Câu lệnh này có thể dùng để thực hiện phép chọn (tức là truy xuất một tập con các dòng trong một hay nhiều bảng), phép chiếu (tức là truy xuất một tập con các cột trong một hay nhiều bảng) và phép nối (tức là liên kết các dòng trong hai hay nhiều bảng để truy xuất dữ liệu). Ngoài ra, câu lệnh này còn cung cấp khả năng thực hiện các thao tác truy vấn và thống kê dữ liệu phức tạp khác. Cú pháp chung của câu lệnh SELECT có dạng: SELECT [ALL | DISTINCT][TOP n] danh_sách_chọn [INTO tên_bảng_mới] FROM danh_sách_bảng/khung_nhìn [WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING điều_kiện] [ORDER BY cột_sắp_xếp] [COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]] Điều cần lưu ý đầu tiên đối với câu lệnh này là các thành phần trong câu lệnh SELECT nếu được sử dụng phải tuân theo đúng thứ tự như trong cú pháp. Nếu không, câu lệnh sẽ được xem là không hợp lệ. Câu lệnh SELECT được sử dụng để tác động lên các bảng dữ liệu và kết quả của câu lệnh cũng được hiển thị dưới dạng bảng, tức là một tập hợp các dòng và các cột (ngoại trừ trường hợp sử dụng câu lệnh SELECT với mệnh đề COMPUTE). 4.1.2. Mệnh đề FROM Mệnh đề FROM trong câu lệnh SELECT được sử dung nhằm chỉ định các bảng và khung nhìn cần truy xuất dữ liệu. Sau FROM là danh sách tên của các bảng và khung nhìn tham gia vào truy vấn, tên của các bảng và khung nhìn được phân cách nhau bởi dấu phẩy. Ví dụ: Câu lệnh dưới đây hiển thị danh sách các khoa trong trường SELECT * FROM khoa kết quả câu lệnh như sau: 47 Ta có thể sử dụng các bí danh cho các bảng hay khung nhìn trong câu lệnh SELECT. Bí danh được gán trong mệnh đề FROM bằng cách chỉ định bí danh ngay sau tên bảng. Ví dụ 2.3: câu lệnh sau gán bí danh là a cho bảng khoa SELECT * FROM khoa a 4.1.3. Mệnh đề WHERE Mệnh đề WHERE trong câu lệnh SELECT được sử dụng nhằm xác định các điều kiện đối với việc truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logic và chỉ những dòng dữ liệu nào thoả mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn. Ví dụ: Câu lệnh dưới đây hiển thị danh sách các môn học có số đơn vị học trình lớn hơn 3 SELECT * FROM monhoc WHERE sodvht>3 Trong mệnh đề WHERE thường sử dụng: • Các toán tử kết hợp điều kiện (AND, OR) • Các toán tử so sánh • Kiểm tra giới hạn của dữ liệu (BETWEEN/ NOT BETWEEN) • Danh sách • Kiểm tra khuôn dạng dữ liệu. • Các giá trị NULL a. Các toán tử so sánh Toán tử ý nghĩa = Bằng > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng <= Nhỏ hơn hoặc bằng <> Khác !> Không lớn hơn !< Không nhỏ hơn 48 Ví dụ: Câu lệnh: SELECT masv,hodem,ten,ngaysinh FROM sinhvien WHERE (ten='Anh') AND (YEAR(GETDATE())-YEAR(ngaysinh)<=20) cho biết mã, họ tên và ngày sinh của các sinh viên có tên là Anh và có tuổi nhỏ hơn hoặc bằng 20. b. Kiểm tra giới hạn của dữ liệu Để kiểm tra xem giá trị dữ liệu nằm trong (ngoài) một khoảng nào đó, ta sử dụng toán tử BETWEEN (NOT BETWEEN) như sau: Cách sử dụng Ý nghĩa giá_trị BETWEEN a AND b a ≤ giá_trị ≤ b giá_trị NOT BETWEEN a AND b (giá_trị < a) AND (giá_trị>b) Ví dụ: Câu lệnh dưới đây cho biết họ tên và tuổi của các sinh viên có tên là Bình và có tuổi nằm trong khoảng từ 20 đến 22 SELECT hodem,ten,year(getdate())-year(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bình' AND YEAR(GETDATE())-YEAR(ngaysinh) BETWEEN 20 AND 22 c. Danh sách (IN và NOT IN) Từ khoá IN được sử dụng khi ta cần chỉ định điều kiện tìm kiếm dữ liệu cho câu lệnh SELECT là một danh sách các giá trị. Sau IN (hoặc NOT IN) có thể là một danh sách các giá trị hoặc là một câu lệnh SELECT khác. Ví dụ: Để biết danh sách các môn học có số đơn vị học trình là 2, 4 hoặc 5, thay vì sử dụng câu lệnh SELECT * FROM monhoc WHERE sodvht=2 OR sodvht=4 OR sodvht=5 ta có thể sử dụng câu lệnh SELECT * FROM monhoc WHERE sodvht IN (2,4,5) d. Toán tử LIKE và các ký tự đại diện 49 Từ khoá LIKE (NOT LIKE) sử dụng trong câu lệnh SELECT nhằm mô tả khuôn dạng của dữ liệu cần tìm kiếm. Chúng thường được kết hợp với các ký tự đại diện sau đây: Ký tự đại ý nghĩa diện % Chuỗi ký tự bất kỳ gồm không hoặc nhiều ký tự _ Ký tự đơn bất kỳ [] Ký tự đơn bất kỳ trong giới hạn được chỉ định (ví dụ [a-f]) hay một tập (ví dụ [abcdef]) [^] Ký tự đơn bất kỳ không nằm trong giới hạn được chỉ định ( ví dụ [^af] hay một tập (ví dụ [^abcdef]). Ví dụ : Câu lệnh dưới đây SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'Lê%' cho biết họ tên của các sinh viên có họ là Lê và có kết quả như sau Câu lệnh: SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'Lê%' AND ten LIKE '[AB]%' Có kết quả là: e. Giá trị NULL Dữ liệu trong một cột cho phép NULL sẽ nhận giá trị NULL trong các trường hợp sau: Nếu không có dữ liệu được nhập cho cột và không có mặc định cho cột hay kiểu dữ liệu trên cột đó. 50 • Người sử dụng trực tiếp đưa giá trị NULL vào cho cột đó. • Một cột có kiểu dữ liệu là kiểu số sẽ chứa giá trị NULL nếu giá trị được chỉ định gây tràn số. Trong mệnh đề WHERE, để kiểm tra giá trị của một cột có giá trị NULL hay không, ta sử dụng cách viết: WHERE tên_cột IS NULL hoặc: WHERE tên_cột IS NOT NULL 4.1.4. Mệnh đề GROUP BY và HAVING Ngoài khả năng thực hiện các yêu cầu truy vấn dữ liệu thông thường (chiếu, chọn, nối,…) như đã đề cập như ở các phần trước, câu lệnh SELECT còn cho phép thực hiện các thao tác truy vấn và tính toán thống kê trên dữ liệu như: cho biết tổng số tiết dạy của mỗi giáo viên, điểm trung bình các môn học của mỗi sinh viên,… Mệnh đề GROUP BY sử dụng trong câu lệnh SELECT nhằm phân hoạch các dòng dữ liệu trong bảng thành các nhóm dữ liệu, và trên mỗi nhóm dữ liệu thực hiện tính toán các giá trị thống kê như tính tổng, tính giá trị trung bình,... Các hàm gộp được sử dụng để tính giá trị thống kê cho toàn bảng hoặc trên mỗi nhóm dữ liệu. Chúng có thể được sử dụng như là các cột trong danh sách chọn của câu lệnh SELECT hoặc xuất hiện trong mệnh đề HAVING, nhưng không được phép xuất hiện trong mệnh đề WHERE SQL cung cấp các hàm gộp dưới đây: Hàm gộp Chức năng SUM([ALL | DISTINCT] biểu_thức) Tính tổng các giá trị. AVG([ALL | DISTINCT] biểu_thức) Tính trung bình của các giá trị COUNT([ALL | DISTINCT] biểu_thức) Đếm số các giá trị trong biểu thức. COUNT(*) Đếm số các dòng được chọn. MAX(biểu_thức) Tính giá trị lớn nhất MIN(biểu_thức) Tính giá trị nhỏ nhất Trong đó: • Hàm SUM và AVG chỉ làm việc với các biểu thức số. • Hàm SUM, AVG, COUNT, MIN và MAX bỏ qua các giá trị NULL khi tính toán. • Hàm COUNT(*) không bỏ qua các giá trị NULL. Mặc định, các hàm gộp thực hiện tính toán thống kê trên toàn bộ dữ liệu. Trong trường hợp cần loại bỏ bớt các giá trị trùng nhau (chỉ giữ lại một giá trị), ta chỉ định thêm từ khoá DISTINCT ở trước biểu thức là đối số của hàm. Mệnh đề HAVING được sử dụng nhằm chỉ định điều kiện đối với các giá trị thống kê được sản sinh từ các hàm gộp tương tự như cách thức mệnh đề WHERE thiết lập các điều kiện cho câu lệnh 51 SELECT. Mệnh đề HAVING thường không thực sự có nghĩa nếu như không sử dụng kết hợp với mệnh đề GROUP BY. Một điểm khác biệt giữa HAVING và WHERE là trong điều kiện của WHERE không được có các hàm gộp trong khi HAVING lại cho phép sử dụng các hàm gộp trong điều kiện của mình. Ví dụ: Để biết trung bình điểm thi lần 1 của các sinh viên có điểm trung bình lớn hơn hoặc bằng 5, ta sử dụng câu lệnh như sau: SELECT sinhvien.masv,hodem,ten, SUM(diemlan1*sodvht)/sum(sodvht) FROM sinhvien,diemthi,monhoc WHERE sinhvien.masv=diemthi.masv AND diemthi.mamonhoc=monhoc.mamonhoc GROUP BY sinhvien.masv,hodem,ten HAVING sum(diemlan1*sodvht)/sum(sodvht)>=5 4.1.5. Mệnh đề ORDER BY Mặc định, các dòng dữ liệu trong kết quả của câu truy vấn tuân theo thứ tự của chúng trong bảng dữ liệu hoặc được sắp xếp theo chỉ mục (nếu trên bảng có chỉ mục). Trong trường hợp muốn dữ liệu được sắp xếp theo chiều tăng hoặc giảm của giá trị của một hoặc nhiều trường, ta sử dụng thêm mệnh đề ORDER BY trong câu lệnh SELECT; Sau ORDER BY là danh sách các cột cần sắp xếp (tối đa là 16 cột). Dữ liệu được sắp xếp có thể theo chiều tăng (ASC) hoặc giảm (DESC), mặc định là sắp xếp theo chiều tăng. Ví dụ: Câu lệnh dưới đây hiển thị danh sách các môn học và sắp xếp theo chiều giảm dần của số đơn vị học trình SELECT * FROM monhoc ORDER BY sodvht DESC Nếu sau ORDER BY có nhiều cột thì việc sắp xếp dữ liệu sẽ được ưu tiên theo thứ tự từ trái qua phải. Ví dụ 2.21: Câu lệnh SELECT hodem,ten,gioitinh, YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bình' ORDER BY gioitinh,tuoi có kết quả là: Thay vì chỉ định tên cột sau ORDER BY, ta có thể chỉ định số thứ tự của cột cấn được sắp xếp. Câu lệnh ở ví dụ trên có thể được viết lại như sau: 52 SELECT hodem,ten,gioitinh, YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bình' ORDER BY 3, 4 4.1.6. Kết hợp kết quả từ nhiều truy vấn khác nhau Phép hợp được sử dụng trong trường hợp ta cần gộp kết quả của hai hay nhiều truy vấn thành một tập kết quả duy nhất. SQL cung cấp toán tử UNION để thực hiện phép hợp. Cú pháp như sau Câu_lệnh_1 UNION [ALL] Câu_lệnh_2 [UNION [ALL] Câu_lệnh_3] ... [UNION [ALL] Câu_lệnh_n] [ORDER BY cột_sắp_xếp] [COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]] Trong đó Câu_lệnh_1 có dạng SELECT danh_sách_cột [INTO tên_bảng_mới] [FROM danh_sách_bảng|khung_nhìn] [WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING điều_kiện] và Câu_lệnh_i (i = 2,..,n) có dạng SELECT danh_sách_cột [FROM danh_sách_bảng|khung_nhìn] [WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING điều_kiện] Ví dụ: Giả sử ta có hai bảng Table1 và Table2 lần lượt như sau: câu lệnh SELECT A,B FROM Table1 UNION SELECT D,E FROM table2 Cho kết quả như sau: 53 Mặc định, nếu trong các truy vấn thành phần của phép hợp xuất hiện những dòng dữ liệu giống nhau thì trong kết quả truy vấn chỉ giữ lại một dòng. Nếu muốn giữ lại các dòng này, ta phải sử dụng thêm từ khoá ALL trong truy vấn thành phần. Ví dụ: Câu lệnh SELECT A,B FROM Table1 UNION ALL SELECT D,E FROM table2 Cho kết quả như sau Khi sử dụng toán tử UNION để thực hiện phép hợp, ta cần chú ý các nguyên tắc sau: • Danh sách cột trong các truy vấn thành phần phải có cùng số lượng. • Các cột tương ứng trong tất cả các bảng, hoặc tập con bất kỳ các cột được sử dụng trong bản thân mỗi truy vấn thành phần phải cùng kiểu dữ liệu. • Các cột tương ứng trong bản thân từng truy vấn thành phần của một câu lệnh UNION phải xuất hiện theo thứ tự như nhau. Nguyên nhân là do phép hợp so sánh các cột từng cột một theo thứ tự được cho trong mỗi truy vấn. • Khi các kiểu dữ liệu khác nhau được kết hợp với nhau trong câu lệnh UNION, chúng sẽ được chuyển sang kiểu dữ liệu cao hơn (nếu có thể được). • Tiêu đề cột trong kết quả của phép hợp sẽ là tiêu đề cột được chỉ định trong truy vấn đầu tiên. Truy vấn thành phần đầu tiên có thể có INTO để tạo mới một bảng từ kết quả của chính phép hợp. • Mệnh đề ORDER BY và COMPUTE dùng để sắp xếp kết quả truy vấn hoặc tính toán các giá trị thống kê chỉ được sử dụng ở cuối câu lệnh UNION. Chúng không được sử dụng ở trong bất kỳ truy vấn thành phần nào. • Mệnh đề GROUP BY và HAVING chỉ có thể được sử dụng trong bản thân từng truy vấn thành phần. Chúng không được phép sử dụng để tác động lên kết quả chung của phép hợp. • Phép toán UNION có thể được sử dụng bên trong câu lệnh INSERT. • Phép toán UNION không được sử dụng trong câu lệnh CREATE VIEW. 4.2. Truy vấn từ nhiều bảng 4.2.1. Inner Joins Điều kiện để thực hiện phép nối trong được chỉ định trong mệnh đề FROM theo cú pháp như sau: tên_bảng_1 [INNER] JOIN tên_bảng_2 ON điều_kiện_nối 54 Ví dụ 2.31: Để hiển thị họ tên và ngày sinh của các sinh viên lớp Tin K24, thay vì sử dụng câu lệnh: SELECT hodem,ten,ngaysinh FROM sinhvien,lop WHERE tenlop='Tin K24' AND sinhvien.malop=lop.malop ta có thể sử dụng câu lệnh như sau: SELECT hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE tenlop='Tin K24' 4.2.2. Outer Joins SQL2 cung cấp các phép nối ngoài sau đây: • Phép nối ngoài trái (LEFT OUTER JOIN) • Phép nối ngoài phải (RIGHT OUTER JOIN) • Phép nối ngoài đầy đủ (FULL OUTER JOIN) Cũng tương tự như phép nối trong, điều kiện của phép nối ngoài cũng được chỉ định ngay trong mệnh đề FROM theo cú pháp: tên_bảng_1 LEFT|RIGHT|FULL [OUTER] JOIN tên_bảng_2 ON điều_kiện_nối Ví dụ: Giả sử ta có hai bảng dữ liệu như sau: Bảng DONVI Bảng NHANVIEN Phép nối ngoài trái giữa hai bảng NHANVIEN và DONVI được biểu diễn bởi câu lệnh: SELECT * FROM nhanvien LEFT OUTER JOIN donvi ON nhanvien.madv=donvi.madv có kết quả là: Câu lệnh: SELECT * FROM nhanvien RIGHT OUTER JOIN donvi ON nhanvien.madv=donvi.madv thực hiện phép nối ngoài phải giữa hai bảng NHANVIEN và DONVI, và có kết quả là: Nếu phép nối ngoài trái (tương ứng phải) hiển thị trong kết quả truy vấn cả những dòng dữ liệu không thoả điều kiện nối của bảng bên trái (tương ứng phải) trong phép nối thì phép nối ngoài đầy 55 đủ hiển thị trong kết quả truy vấn cả những dòng dữ liệu không thoả điều kiện nối của cả hai bảng tham gia vào phép nối. Ví dụ: Với hai bảng NHANVIEN và DONVI như ở trên, câu lệnh SELECT * FROM nhanvien FULL OUTER JOIN donvi ON nhanvien.madv=donvi.madv cho kết quả là: Một đặc điểm nổi bật của SQL2 là cho phép biểu diễn phép nối trên nhiều bảng dữ liệu một cách rõ ràng. Thứ tự thực hiện phép nối giữa các bảng được xác định theo nghĩa kết quả của phép nối này được sử dụng trong một phép nối khác. Ví dụ: Câu lệnh dưới đây hiển thị họ tên và ngày sinh của các sinh viên thuộc Khoa Công nghệ Thông tin SELECT hodem,ten,ngaysinh FROM (sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop) INNER JOIN khoa ON lop.makhoa=khoa.makhoa WHERE tenkhoa=N'Khoa công nghệ thông tin' Trong câu lệnh trên, thứ tự thực hiện phép nối giữa các bảng được chỉ định rõ ràng: phép nối giữa hai bảng sinhvien và lop được thực hiện trước và kết quả của phép nối này lại tiếp tục được nối với bảng khoa. Bài tập Câu 1: Trình bày cú pháp chung của câu lệnh truy vấn SELECT. Chỉ ra sự tương đương giữa câu lệnh SELECT và biểu thức đại số quan hệ. Câu 2: Phân biệt các phép kết nối bảng dữ liệu: các dạng Join (Inner Join, Outer Join, Cross Join). Câu 3: Trình bày về phép toán Union. Điều kiện để thực hiện được phép toán này là gì? Câu 4: Trình bày chức năng các hàm thống kê: COUNT, SUM, MAX, MIN, AVG đi kèm với GROUP BY. 56 Chƣơng 5. Tạo và quản lý các chỉ mục 5.1. Các kiểu chỉ mục (Indexes) CLUSTERED Sắp xếp lại dữ liệu về mặt vật lý. Chỉ có duy nhất một clustered trong một bảng Yêu cầu ít nhất 120% kích thước của bảng cóthể sử dụng trong vùng tạm. Khoảng trống vùng tạm tồn tại trong CSDL tạo chỉ mục mà chúng ta tạo chỉ mục. NON - CLUSTERED Thứtự các dòng trong bảng không sắp xếp về mặt vật lý giống Clustered Đây là kiểu điển hình để tạo chỉmục cho cột liên kết các cột khác. Các giá trị có thể được thay đổi thường xuyên SQL server sử dụng mặc định khi tạo chỉ mục là non – clustered Chúng ta cóthểtạo 249 non–clustered cho mỗi bảng 5.2. Tạo các chỉ mục Có thể sử dụng lệnh CREATE INDEX: CREATE [UNIQUE] INDEX tengọi khoá INDEX ON tên bảng ( Namefield1 [ASC/DESC],Namefield2 [ASC/DESC],....) WITH PRIMARY [ DISALLOW NULL ]/ [ IGNORE NULL ] Hoặc sử dụng Wizard: 57 58 59 60 5.3. Quản lý và gỡ bỏ các chỉ mục DROP INDEX { <drop_relational_or_xml_or_spatial_index> [ ,...n ] | <drop_backward_compatible_index> [ ,...n ] } <drop_relational_or_xml_or_spatial_index> ::= index_name ON <object> [ WITH ( <drop_clustered_index_option> [ ,...n ] ) ] <drop_backward_compatible_index> ::= [ owner_name. ] table_or_view_name.index_name <object> ::= { [ database_name. [ schema_name ] . | schema_name. ] table_or_view_name } <drop_clustered_index_option> ::= { MAXDOP = max_degree_of_parallelism 61 | ONLINE = { ON | OFF } | MOVE TO { partition_scheme_name ( column_name ) | filegroup_name | "default" } [ FILESTREAM_ON { partition_scheme_name | filestream_filegroup_name | "default" } ] } Bài tập Câu 1: Trình bày khái niệm và vai trò của chỉ mục trong cơ sở dữ liệu. Câu 2: Khái niệm về B-Tree và tổ chức chỉ mục trong SQL Server 2000. Câu 3: Trình bày cú pháp đầy đủ của lệnh tạo chỉ mục và giải thích ý nghĩa từng tham số. 62 Chƣơng 6. Tạo và quản lý khung nhìn 6.1. Định nghĩa Khung nhìn là một lược đồ dữ liệu được lấy ra từ một lược đồ dữ liệu khác đã có. 6.2. Tạo các khung nhìn (Views) Câu lệnh CREATE VIEW như sau: CREATE VIEW tên_khung_nhìn[(danh_sách_tên_cột)] AS câu_lệnh_SELECT Ví dụ: Câu lệnh dưới đây tạo khung nhìn có tên DSSV từ câu lệnh SELECT truy vấn từ hai bảng SINHVIEN và LOP CREATE VIEW dssv AS SELECT masv,hodem FROM sinhvien,lop WHERE sinhvien.malop=lop.malop thựiện câu lệnh: SELECT * FROM dssv ta có được kết quả như sau: 6.3. Quản lý các khung nhìn Câu lệnh ALTER VIEW được sử dụng để định nghĩa lại khung nhìn hiện có nhưng không làm thay đổi các quyền đã được cấp phát cho người sử dụng trước đó. Câu lệnh này sử dụng tương tự như câu lệnh CREATE VIEW và có cú pháp như sau: ALTER VIEW tên_khung_nhìn [(danh_sách_tên_cột)] AS 63 Câu_lệnh_SELECT Ví dụ: Ta định nghĩa khung nhìn như sau: CREATE VIEW viewlop AS SELECT malop,tenlop,tenkhoa FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa WHERE tenkhoa='Khoa Vật lý‟ và có thể định nghĩa lại khung nhìn trên bằng câu lệnh: ALTER VIEW view_lop AS SELECT malop,tenlop,hedaotao FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa WHERE tenkhoa='Khoa Công nghệ thông tin' 6.4. Xóa các khung nhìn Khi một khung nhìn không còn sử dụng, ta có thể xoá nó ra khỏi cơ sở dữ liệu thông qua câu lệnh: DROP VIEW tên_khung_nhìn Nếu một khung nhìn bị xoá, toàn bộ những quyền đã cấp phát cho người sử dụng trên khung nhìn cũng đồng thời bị xoá. Do đó, nếu ta tạo lại khung nhìn thì phải tiến hành cấp phát lại quyền cho người sử dụng. Ví dụ: Câu lệnh dưới đây xoá khung nhìn VIEW_LOP ra khỏi cơ sở dữ liệu DROP VIEW view_lop Bài tập Câu 1: Trình bày khái niệm về view (bảng ảo). View giúp tăng tính bảo mật cho cơ sở dữ liệu như thế nào? Câu 2: Trình bày các lệnh tạo, sửa đổi và xóa view. Câu 3: Cập nhật dữ liệu thông qua view như thế nào? Câu 4: Nếu ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo view. 64 Chƣơng 7. Tạo và quản lý các thủ tục thƣờng trú 7.1. Tạo các thủ tục thƣờng trú (Stored procedures) Thủ tục lưu trữ được tạo bởi câu lệnh CREATE PROCEDURE với cú pháp như sau: CREATE PROCEDURE tên_thủ_tục [(danh_sách_tham_số)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Các_câu_lệnh_của_thủ_tục Trong đó: tên_thủ_tục Tên của thủ tục cần tạo. Tên phải tuân theo qui tắc định danh và không được vượt quá 128 ký tự. danh_sách_tham_số Các tham số của thủ tục được khai báo ngay sau tên thủ tục và nếu thủ tục có nhiều tham số thì các khai báo phân cách nhau bởi dấu phẩy. Khai báo của mỗi một tham số tối thiểu phải bao gồm hai phần: • tên tham số được bắt đầu bởi dấu @. • kiểu dữ liệu của tham số Ví dụ: @mamonhoc nvarchar(10) Thông thường, thủ tục sẽ được phân tích, tối ưu và dịch sẵn ở lần gọi đầu RECOMPILE tiên. Nếu tuỳ chọn WITH RECOMPILE được chỉ định, thủ tục sẽ được dịch lại mỗi khi được gọi. ENCRYPTION Thủ tục sẽ được mã hoá nếu tuỳ chọn WITH ENCRYPTION được chỉ định. Nếu thủ tục đã được mã hoá, ta không thể xem được nội dung của thủ tục. các_câu_lệnh_của_thủ_tục Tập hợp các câu lệnh sử dụng trong nội dung thủ tục. Các câu lệnh này có thể đặt trong cặp từ khoá BEGIN...END hoặc có thể không. Ví dụ 5.1: Giả sử ta cần thực hiện một chuỗi các thao tác như sau trên cơ sở dữ liệu 1. Bổ sung thêm môn học cơ sở dữ liệu có mã TI-005 và số đơn vị học trình là 5 vào bảng MONHOC 65 2. Lên danh sách nhập điểm thi môn cơ sở dữ liệu cho các sinh viên học lớp có mã C24102 (tức là bổ sung thêm vào bảng DIEMTHI các bản ghi với cột MAMONHOC nhận giá trị TI-005, cột MASV nhận giá trị lần lượt là mã các sinh viên học lớp có mã C24105 và các cột điểm là NULL). Nếu thực hiện yêu cầu trên thông qua các câu lệnh SQL như thông thường, ta phải thực thi hai câu lệnh như sau: INSERT INTO MONHOC VALUES('TI-005','Cơ sở dữ liệu',5) INSERT INTO DIEMTHI(MAMONHOC,MASV) SELECT „TI-005‟,MASV FROM SINHVIEN WHERE MALOP='C24102' Thay vì phải sử dụng hai câu lệnh như trên, ta có thể định nghĩa môt thủ tục lưu trữ với các tham số vào là @mamonhoc, @tenmonhoc, @sodvht và @malop như sau: CREATE PROC sp_LenDanhSachDiem( @mamonhoc NVARCHAR(10), @tenmonhoc NVARCHAR(50), @sodvht SMALLINT, @malop NVARCHAR(10)) AS BEGIN INSERT INTO monhoc VALUES(@mamonhoc,@tenmonhoc,@sodvht) INSERT INTO diemthi(mamonhoc,masv) SELECT „TI-005‟,MASV FROM SINHVIEN WHERE MALOP='C24102' Thay vì phải sử dụng hai câu lệnh như trên, ta có thể định nghĩa môt thủ tục lưu trữ với các tham số vào là @mamonhoc, @tenmonhoc, @sodvht và @malop như sau: CREATE PROC sp_LenDanhSachDiem( @mamonhoc NVARCHAR(10), @tenmonhoc NVARCHAR(50), @sodvht SMALLINT, @malop NVARCHAR(10)) AS 66 BEGIN INSERT INTO monhoc VALUES(@mamonhoc,@tenmonhoc,@sodvht) INSERT INTO diemthi(mamonhoc,masv) SELECT @mamonhoc,masv FROM sinhvien WHERE malop=@malop END Khi thủ tục trên đã được tạo ra, ta có thể thực hiện được hai yêu cầu đặt ra ở trên một cách đơn giản thông qua lòi gọi thủ tục: sp_LenDanhSachDiem 'TI-005','Cơ sở dữ liệu',5,'C24102' 7.2. Thực thi các thủ tục thƣờng trú Như đã thấy ở ví dụ ở trên, khi một thủ tục lưu trữ đã được tạo ra, ta có thể yêu cầu hệ quản trị cơ sở dữ liệu thực thi thủ tục bằng lời gọi thủ tục có dạng: tên_thủ_tục [danh_sách_các_đối_số] Số lượng các đối số cũng như thứ tự của chúng phải phù hợp với số lượng và thứ tự của các tham số khi định nghĩa thủ tục. Trong trường hợp lời gọi thủ tục được thực hiện bên trong một thủ tục khác, bên trong một trigger hay kết hợp với các câu lệnh SQL khác, ta sử dụng cú pháp như sau: EXECUTE tên_thủ_tục [danh_sách_các_đối_số] Thứ tự của các đối số được truyền cho thủ tục có thể không cần phải tuân theo thứ tự của các tham số như khi định nghĩa thủ tục nếu tất cả các đối số được viết dưới dạng: @tên_tham_số = giá_trị Ví dụ 5.2: Lời gọi thủ tục ở ví dụ trên có thể viết như sau: sp_LenDanhSachDiem @malop='C24102', @tenmonhoc='Cơ sở dữ liệu', @mamonhoc='TI-005', @sodvht=5 7.3. Xem và sửa các thủ tục thƣờng trú Khi một thủ tục đã được tạo ra, ta có thể tiến hành định nghĩa lại thủ tục đó bằng câu lệnh ALTER PROCEDURE có cú pháp như sau: ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS 67 Các_câu_lệnh_Của_thủ_tục Câu lệnh này sử dụng tương tự như câu lệnh CREATE PROCEDURE. Việc sửa đổi lại một thủ tục đã có không làm thay đổi đến các quyền đã cấp phát trên thủ tục cũng như không tác động đến các thủ tục khác hay trigger phụ thuộc vào thủ tục này. 7.4. Tham số vào và ra (Parameters) Ngoài những tham số được truyền cho thủ tục, bên trong thủ tục còn có thể sử dụng các biến nhằm lưu giữ các giá trị tính toán được hoặc truy xuất được từ cơ sở dữ liệu. Các biến trong thủ tục được khai báo bằng từ khoá DECLARE theo cú pháp như sau: DECLARE @tên_biến kiểu_dữ_liệu Tên biến phải bắt đầu bởi ký tự @ và tuân theo qui tắc về định danh. Ví dụ dưới đây minh hoạ việc sử dụng biến trong thủ tục Ví dụ 5.3: Trong định nghĩa của thủ tục dưới đây sử dung các biến chứa các giá trị truy xuất được từ cơ sở dữ liệu. CREATE PROCEDURE sp_Vidu( @malop1 NVARCHAR(10), @malop2 NVARCHAR(10)) AS DECLARE @tenlop1 NVARCHAR(30) DECLARE @namnhaphoc1 INT DECLARE @tenlop2 NVARCHAR(30) DECLARE @namnhaphoc2 INT SELECT @tenlop1=tenlop, @namnhaphoc1=namnhaphoc FROM lop WHERE malop=@malop1 SELECT @tenlop2=tenlop, @namnhaphoc2=namnhaphoc FROM lop WHERE malop=@malop2 PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1) print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2) IF @namnhaphoc1=@namnhaphoc2 PRINT 'Hai lớp nhập học cùng năm' ELSE PRINT 'Hai lớp nhập học khác năm' Trong các ví dụ trước, nếu đối số truyền cho thủ tục khi có lời gọi đến thủ tục là biến, những thay đổi giá trị của biền trong thủ tục sẽ không được giữ lại khi kết thúc quá trình thực hiện thủ tục. 68 Ví dụ 5.4: Xét câu lệnh sau đây CREATE PROCEDURE sp_Conghaiso(@a INT,@b INT, @c INT) AS SELECT @c=@a+@b Nếu sau khi đã tạo thủ tục với câu lệnh trên, ta thực thi một tập các câu lệnh như sau: DECLARE @tong INT SELECT @tong=0 EXECUTE sp_Conghaiso 100,200,@tong SELECT @tong Câu lệnh “SELECT @tong” cuối cùng trong loạt các câu lệnh trên sẽ cho kết quả là: 0 Trong trường hợp cần phải giữ lại giá trị của đối số sau khi kết thúc thủ tục, ta phải khai báo tham số của thủ tục theo cú pháp như sau: @tên_tham_số kiểu_dữ_liệu OUTPUT hoặc: @tên_tham_số kiểu_dữ_liệu OUT và trong lời gọi thủ tục, sau đối số được truyền cho thủ tục, ta cũng phải chỉ định thêm từ khoá OUTPUT (hoặc OUT) Ví dụ 5.5: Ta định nghĩa lại thủ tục ở ví dụ 5.4 như sau: CREATE PROCEDURE sp_Conghaiso( @a INT, @b INT, @c INT OUTPUT) AS SELECT @c=@a+@b và thực hiện lời gọi thủ tục trong một tập các câu lệnh như sau: DECLARE @tong INT SELECT @tong=0 EXECUTE sp_Conghaiso 100,200,@tong OUTPUT SELECT @tong thì câu lệnh “SELECT @tong” sẽ cho kết quả là: 300 Tham số với giá trị mặc định Các tham số được khai báo trong thủ tục có thể nhận các giá trị mặc định. Giá trị mặc định sẽ được gán cho tham số trong trường hợp không truyền đối số cho tham số khi có lời gọi đến thủ tục. Tham số với giá trị mặc định được khai báo theo cú pháp như sau: @tên_tham_số kiểu_dữ_liệu = giá_trị_mặc_định Ví dụ 5.6: Trong câu lệnh dưới đây: 69 CREATE PROC sp_TestDefault( @tenlop NVARCHAR(30)=NULL, @noisinh NVARCHAR(100)='Huế') AS BEGIN IF @tenlop IS NULL SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh ELSE SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh AND tenlop=@tenlop END thủ tục sp_TestDefault được định nghĩa với tham số @tenlop có giá trị mặc định là NULL và tham số @noisinh có giá trị mặc định là Huế. Với thủ tục được định nghĩa như trên, ta có thể thực hiện các lời gọi với các mục đích khác nhau như sau: • Cho biết họ tên của các sinh viên sinh tại Huế: sp_testdefault • Cho biết họ tên của các sinh viên lớp Tin K24 sinh tại Huế: sp_testdefault @tenlop='Tin K24' • Cho biết họ tên của các sinh viên sinh tại Nghệ An: sp_testDefault @noisinh=N'Nghệ An' • Cho biết họ tên của các sinh viên lớp Tin K26 sinh tại Đà Nẵng: sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng' Bài tập cuối chƣơng Câu 1: Trình bày khái niệm về thủ tục thường trú. Câu 2: Cú pháp đầy đủ của lệnh tạo, sửa đổi và xóa thủ tục thường trú. Giải thích ý nghĩa các tham số. Câu 3: Ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo thủ tục. Câu 4: Thực thi thủ tục như thế nào? Thủ tục trong SQL Server có thể được gọi từ các ngôn ngữ lập trình ngoài không? 70 Chƣơng 8. Tạo và quản lý hàm ngƣời dùng định nghĩa 8.1. Các kiểu hàm ngƣời dùng định nghĩa (User-defined functions) Hàm là đối tượng cơ sở dữ liệu tương tự như thủ tục. Điểm khác biệt giữa hàm và thủ tục là hàm trả về một giá trị thông qua tên hàm còn thủ tục thì không. Điều này cho phép ta sử dụng hàm như là một thành phần của một biêu thức (chẳng hạn trong danh sách chọn của câu lệnh SELECT). Ngoài những hàm do hệ quản trị cơ sở dữ liệu cung cấp sẵn, người sử dụng có thể định nghĩa thêm các hàm nhằm phục vụ cho mục đích riêng của mình. 8.2. Tạo hàm ngƣời dùng định nghĩa Hàm được định nghĩa thông qua câu lệnh CREATE FUNCTION với cú pháp như sau: CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS (kiểu_trả_về_của_hàm) AS BEGIN các_câu_lệnh_của_hàm END Ví dụ 5.7: Câu lệnh dưới đây định nghĩa hàm tính ngày trong tuần (thứ trong tuần) của một giá trị kiểu ngày CREATE FUNCTION thu(@ngay DATETIME) RETURNS NVARCHAR(10) AS BEGIN DECLARE @st NVARCHAR(10) SELECT @st=CASE DATEPART(DW,@ngay) WHEN 1 THEN 'Chu nhật' WHEN 2 THEN 'Thứ hai' WHEN 3 THEN 'Thứ ba' WHEN 4 THEN 'Thứ tư' WHEN 5 THEN 'Thứ năm' WHEN 6 THEN 'Thứ sáu' ELSE 'Thứ bảy' END 71 RETURN (@st) /* Trị trả về của hàm */ END Một hàm khi đã được định nghĩa có thể được sử dụng như các hàm do hệ quản trị cơ sở dữ liệu cung cấp (thông thường trước tên hàm ta phải chỉ định thêm tên của người sở hữu hàm) Ví dụ 5.8: Câu lệnh SELECT dưới đây sử dụng hàm đã được định nghĩa ở ví dụ trước: SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh FROM sinhvien WHERE malop=‟C24102‟ có kết quả là: 8.3. Quản lý hàm ngƣời dùng định nghĩa Thay đổi cấu trúc hàm, dùng lệnh ALTER FUNCTION ALTER FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS (kiểu_trả_về_của_hàm) AS BEGIN các_câu_lệnh_của_hàm END Bài tập Câu 1: Trình bày khái niệm về hàm người dùng. Câu 2: Cú pháp đầy đủ của lệnh tạo, sửa đổi và xóa hàm người dùng. Giải thích ý nghĩa các tham số. Câu 3: Ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo hàm người dùng. Câu 4: Gọi hàm người dùng như thế nào? Hàm người dùng trong SQL Server có thể được gọi từ các ngôn ngữ lập trình ngoài không? 72 Chƣơng 9. Tạo và quản lý các Trigger 9.1. Tạo các Trigger thao tác dữ liệu (DML Triggers) Một trigger là một đối tượng gắn liền với một bảng và được tự động kích hoạt khi xảy ra những giao tác làm thay đổi dữ liệu trong bảng. Định nghĩa một trigger bao gồm các yếu tố sau: • Trigger sẽ được áp dụng đối với bảng nào? • Trigger được kích hoạt khi câu lệnh nào được thực thi trên bảng: INSERT, UPDATE, DELETE? • Trigger sẽ làm gì khi được kích hoạt? Câu lệnh CREATE TRIGGER được sử dụng để đinh nghĩa trigger và có cú pháp như sau: CREATE TRIGGER tên_trigger ON tên_bảng FOR {[INSERT][,][UPDATE][,][DELETE]} AS [IF UPDATE(tên_cột) [AND UPDATE(tên_cột)|OR UPDATE(tên_cột)] ...] các_câu_lệnh_của_trigger Ví dụ: Ta định nghĩa các bảng như sau: Bảng MATHANG lưu trữ dữ liệu về các mặt hàng: CREATE TABLE mathang ( mahang NVARCHAR(5) PRIMARY KEY, /*mã hàng*/ tenhang NVARCHAR(50) NOT NULL, /*tên hàng*/ soluong INT, /*số lượng hàng hiện có*/ ) Bảng NHATKYBANHANG lưu trữ thông tin về các lần bán hàng CREATE TABLE nhatkybanhang ( stt INT IDENTITY PRIMARY KEY, ngay DATETIME, /*ngày bán hàng*/ nguoimua NVARCHAR(30), /*tên người mua hàng*/ mahang NVARCHAR(5) /*mã mặt hàng được bán*/ FOREIGN KEY REFERENCES mathang(mahang), 73 soluong INT, /*giá bán hàng*/ giaban MONEY /*số lượng hàng được bán*/ ) Câu lệnh dưới đây định nghĩa trigger trg_nhatkybanhang_insert. Trigger này có chức năng tự động giảm số lượng hàng hiện có khi một mặt hàng nào đó được bán (tức là khi câu lệnh INSERT được thực thi trên bảng NHATKYBANHANG). CREATE TRIGGER trg_nhatkybanhang_insert ON nhatkybanhang FOR INSERT AS UPDATE mathang SET mathang.soluong=mathang.soluong-inserted.soluong FROM mathang INNER JOIN inserted ON mathang.mahang=inserted.mahang Với trigger vừa tạo ở trên, nếu dữ liệu trong bảng MATHANG là: thì sau khi ta thực hiện câu lênh: INSERT INTO nhatkybanhang (ngay,nguoimua,mahang,soluong,giaban) VALUES('5/5/2004','Tran Ngoc Thanh','H1',10,5200) dữ liệu trong bảng MATHANG sẽ như sau: Trong câu lệnh CREATE TRIGGER ở ví dụ trên, sau mệnh đề ON là tên của bảng mà trigger cần tạo sẽ tác động đến. Mệnh đề tiếp theo chỉ định câu lệnh sẽ kích hoạt trigger (FOR INSERT). Ngoài INSERT, ta còn có thể chỉ định UPDATE hoặc DELETE cho mệnh đề này, hoặc có thể kết hợp chúng lại với nhau. Phần thân của trigger nằm sau từ khoá AS bao gồm các câu lệnh mà trigger sẽ thực thi khi được kích hoạt. 9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers) Thay vì chỉ định một trigger được kích hoạt trên một bảng, ta có thể chỉ định trigger được kích hoạt và thực hiện những thao tác cụ thể khi việc thay đổi dữ liệu chỉ liên quan đến một số cột nhất định nào đó của cột. Trong trường hợp này, ta sử dụng mệnh đề IF UPDATE trong trigger. IF UPDATE không sử dụng được đối với câu lệnh DELETE. 74 Ví dụ: Xét lại ví dụ với hai bảng MATHANG và NHATKYBANHANG, trigger dưới đây được kích hoạt khi ta tiến hành cập nhật cột SOLUONG cho một bản ghi của bảng NHATKYBANHANG (lưu ý là chỉ cập nhật đúng một bản ghi) CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong – (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang Với trigger ở ví dụ trên, câu lệnh: UPDATE nhatkybanhang SET soluong=soluong+20 WHERE stt=1 sẽ kích hoạt trigger ứng với mệnh đề IF UPDATE (soluong) và câu lệnh UPDATE trong trigger sẽ được thực thi. Tuy nhiên câu lệnh: UPDATE nhatkybanhang SET nguoimua='Mai Hữu Toàn' WHERE stt=3 lại không kích hoạt trigger này. Mệnh đề IF UPDATE có thể xuất hiện nhiều lần trong phần thân của trigger. Khi đó, mệnh đề IF UPDATE nào đúng thì phần câu lệnh của mệnh đề đó sẽ được thực thi khi trigger được kích hoạt. Ví dụ 5.14: Giả sử ta định nghĩa bảng R như sau: CREATE TABLE R ( A INT, B INT, C INT ) và trigger trg_R_update cho bảng R: CREATE TRIGGER trg_R_test ON R 75 FOR UPDATE AS IF UPDATE(A) Print 'A updated' IF UPDATE(C) Print 'C updated' Câu lệnh: UPDATE R SET A=100 WHERE A=1 sẽ kích hoạt trigger và cho kết quả là: A updated và câu lệnh: UPDATE R SET C=100 WHERE C=2 cũng kích hoạt trigger và cho kết quả là: C updated còn câu lệnh: UPDATE R SET B=100 WHERE B=3 hiển nhiên sẽ không kích hoạt trigger 9.3. Sử dụng các Trigger lồng nhau (Nested Triggers) Một trigger có khả năng nhận biết được sự thay đổi về mặt dữ liệu trên bảng dữ liệu, từ đó có thể phát hiện và huỷ bỏ những thao tác không đảm bảo tính toàn vẹn dữ liệu. Trong một trigger, để huỷ (1) bỏ tác dụng của câu lệnh làm kích hoạt trigger, ta sử dụng câu lệnh : ROLLBACK TRANSACTION Ví dụ 5.15: Nếu trên bảng MATHANG, ta tạo một trigger như sau: CREATE TRIGGER trg_mathang_delete ON mathang FOR DELETE AS ROLLBACK TRANSACTION Thì câu lệnh DELETE sẽ không thể có tác dụng đối với bảng MATHANG. Hay nói cách khác, ta không thể xoá được dữ liệu trong bảng. Ví dụ 5.16: Trigger dưới đây được kích hoạt khi câu lệnh INSERT được sử dụng để bổ sung một bản ghi mới cho bảng NHATKYBANHANG. Trong trigger này kiểm tra điều kiện hợp lệ của dữ liệu là số lượng hàng bán ra phải nhỏ hơn hoặc bằng số lượng hàng hiện có. Nếu điều kiện này không thoả mãn thì huỷ bỏ thao tác bổ sung dữ liệu. CREATE TRIGGER trg_nhatkybanhang_insert 76 ON NHATKYBANHANG FOR INSERT AS DECLARE @sl_co int /* Số lượng hàng hiện có */ DECLARE @sl_ban int /* Số lượng hàng được bán */ DECLARE @mahang nvarchar(5) /* Mã hàng được bán */ SELECT @mahang=mahang,@sl_ban=soluong FROM inserted SELECT @sl_co = soluong FROM mathang where mahang=@mahang /*Nếu số lượng hàng hiện có nhỏ hơn số lượng bán thì huỷ bỏ thao tác bổ sung dữ liệu */ IF @sl_co<@sl_ban ROLLBACK TRANSACTION /* Nếu dữ liệu hợp lệ thì giảm số lượng hàng hiện có */ ELSE UPDATE mathang SET soluong=soluong-@sl_ban WHERE mahang=@mahang 9.4. Sử dụng các Trigger đệ quy (Recursive Triggers) Trong các ví dụ trước, các trigger chỉ thực sự hoạt động đúng mục đích khi các câu lệnh kích hoạt trigger chỉ có tác dụng đối với đúng một dòng dữ liêu. Ta có thể nhận thấy là câu lệnh UPDATE và DELETE thường có tác dụng trên nhiều dòng, câu lệnh INSERT mặc dù ít rơi vào trường hợp này nhưng không phải là không gặp; đó là khi ta sử dụng câu lệnh có dạng INSERT INTO ... SELECT ... Vậy làm thế nào để trigger hoạt động đúng trong trường hợp những câu lệnh có tác động lên nhiều dòng dữ liệu? Có hai giải pháp có thể sử dụng đối với vấn đề này: • Sử dụng truy vấn con. • Sử dụng biến con trỏ. Ta hình dung vấn đề này và cách khắc phục qua ví dụ dưới đây: Ví dụ: Ta xét lại trường hợp của hai bảng MATHANG và NHATKYBANHANG như sơ đồ dưới đây: 77 Trigger dưới đây cập nhật lại số lượng hàng của bảng MATHANG khi câu lệnh UPDATE được sử dụng để cập nhật cột SOLUONG của bảng NHATKYBANHANG. CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong – (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang Với trigger được định nghĩa như trên, nếu thực hiện câu lệnh: UPDATE nhatkybanhang SET soluong = soluong + 10 WHERE stt = 1 thì dữ liệu trong hai bảng MATHANG và NHATKYBANHANG sẽ là: Bài tập Câu 1: Trình bày khái niệm về Trigger? So sánh sự khác biệt giữa Trigger và ràng buộc (constraint) Câu 2: Trình bày cú pháp đầy đủ của các lệnh tạo, sửa, xóa Trigger và giải thích ý nghĩa của các tham số. Câu 3: Thế nào là Trigger đệ quy? Hãy đưa ra một ví dụ cài đặt Trigger đệ quy. 78 MỘT SỐ ĐỀ THI MẪU 79 Trường Đại Học Hàng Hải Việt Nam Khoa Công nghệ Thông tin BỘ MÔN HỆ THỐNG THÔNG TIN -----***----- THI KẾT THÚC HỌC PHẦN Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU Năm học : 2009 - 2010 Đề thi số: Ký duyệt đề: 1 Thời gian: 60 phút Câu 1: (3 điểm) Viết các lệnh T-SQL để tạo cơ sở dữ liệu QLYBAIXE gồm các bảng dữ liệu sau đây: ChuXe(MaCX, TenCX, DiaChi) LoaiXe(MaLoai, TenLoai) Xe(SoXe, MaCX, MaLoai) NhatKyBai(SoXe, NgayVao, NgayRa) Trong đó bảng NhatKyBai lưu giữ thông tin thời gian lưu bãi của xe. Một xe có thể vào bãi nhiều lần. Xe nào chưa ra khỏi bãi thì có có trường NgayRa = NULL. Câu 3: (4 điểm) Viết các câu lệnh truy vấn trên cơ sở dữ liệu QLYBAIXE để thực hiện các nhiệm vụ sau: 1. Thống kê xem mỗi chủ xe sở hữu bao nhiêu loại xe khác nhau: MaCX TenCX SoLoaiXe 2. Thống kê các xe hiện đang nằm trên bãi và số ngày lưu bãi tính từ lần vào gần nhất cho đến thời điểm hiện tại SoXe SoNgayLuu 3. Thống kê các xe ra khỏi bãi vào tháng 10/2009 và tổng số ngày lưu bãi của các xe này qua các lần ra vào bãi (tính từ lần vào đầu tiên cho tới lần ra cuối cùng) SoXe TongSoNgay 4. Thống kê số lần vào bãi của mỗi loại xe MaLoai TenLoai SoLan Câu 4: (3 điểm) Viết một thủ tục thường trú có tên sp_ThemXe làm nhiệm vụ thêm một bản ghi mới vào bảng Xe trong cơ sở dữ liệu QLYBAIXE. Biết xe mới thêm vào phải thỏa mãn các điều kiện: o Không có SoXe trùng với một xe nào đó đã có trên bảng. o Xe này phải thuộc sở hữu của một chủ xe có MaCX nằm trong bảng ChuXe o Xe này phải thuộc về một loại xe có MaLoai nằm trong bảng LoaiXe 80 Trường Đại Học Hàng Hải Việt Nam Khoa Công nghệ Thông tin BỘ MÔN HỆ THỐNG THÔNG TIN -----***----- THI KẾT THÚC HỌC PHẦN Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU Năm học : 2009 - 2010 Đề thi số: Thời gian: 75 phút Ký duyệt đề: 2 Câu 1: (3 điểm) Hãy viết lệnh T-SQL tạo cơ sở dữ liệu có tên HDANDETAI gồm các bảng dữ liệu sau đây: GiangVien(MaGV, TenGV) DeTai(MaDT, TenDT) SinhVien(MaSV, TenSV, Lop, MaDT, MaGVHD, MaGVPB) Trong đó mỗi sinh viên chỉ được nhận một đề tài. Các sinh viên có thể nhận đề tài giống nhau. Mỗi sinh viên có một giáo viên hướng dẫn và một giáo viên phản biện. Câu 2: (4 điểm) Viết các câu lệnh truy vấn trên cơ sở dữ liệu HDANDETAI thực hiện những công việc sau: o Hãy thống kê xem mỗi giáo viên đã hướng dẫn và phản biện bao nhiêu sinh viên: MaGV o SoSVPhanBien TenGV SoDeTaiHD SoDeTaiPB Hãy thống kê xem mỗi lớp nhận bao nhiêu đề tài khác nhau: Lop o SoSVHuongDan Hãy thống kê xem mỗi giáo viên đã hướng dẫn và phản biện bao nhiêu đề tài khác nhau: MaGV o TenGV SoDeTai Hãy thống kê xem mỗi giáo viên hướng dẫn sinh viên đến từ bao nhiêu lớp khác nhau: MaGV TenGV SoLopHuongDan Câu 3: (3 điểm) Hãy xây dựng một hàm người dùng UDF để tính tổng các giai thừa: F(n) = 1! + 2! + 3! + ... + n! 81 Trường Đại Học Hàng Hải Việt Nam Khoa Công nghệ Thông tin BỘ MÔN HỆ THỐNG THÔNG TIN -----***----- THI KẾT THÚC HỌC PHẦN Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU Năm học : 2009 - 2010 Thời gian: 60 phút Đề thi số: Ký duyệt đề: 3 Câu 1: (3 điểm) Viết các lệnh T-SQL để cơ sở dữ liệu QLYNHANSU bao gồm các bảng dữ liệu sau: PhongBan(MaPB, TenPB) ChuyenMon(MaCM, TenCM) NhanVien(MaNV, TenNV, MaPB, MaCM, LaTruongPhong) Chú ý: Mỗi phòng ban có một và chỉ một nhân viên giữ vị trí trưởng phòng. Nhân viên nào giữ vị trí trưởng phòng thì trường LaTruongPhong = 1, còn bình thường mặc định LaTruongPhong = 0. Câu 3: (3 điểm) Hãy viết các câu lệnh truy vấn làm nhiệm vụ: 1. Thống kê ra mã nhân viên và tên của các vị trưởng phòng của những phòng ban có ít nhân viên nhất MaNV TenNV TenPB 2. Thống kê xem ứng với mỗi một phòng ban thì nhân viên phòng ban đó có bao nhiêu chuyên môn khác nhau: MaPB TenPB SoLuongCMBiet 3. Thống kê xem ứng với mỗi loại chuyên môn thì có bao nhiêu phòng ban có nhân viên biết chuyên môn đó: MaCM TenCM SoLuongPB Câu 4: (4 điểm) 1. Tạo một view làm nhiệm vụ thống kê số lượng nhân viên của mỗi phòng ban: MaPB TenPB SoLuongNV 2. Tạo một Trigger làm nhiệm vụ kiểm soát quá trình Insert và Update trên bảng NhanVien nhằm đảm bảo sao cho ứng với mỗi phòng ban chỉ có một nhân viên được thiết lập là trưởng phòng (có trường LaTruongPhong = 1). 82 Trường Đại Học Hàng Hải Việt Nam Khoa Công nghệ Thông tin BỘ MÔN HỆ THỐNG THÔNG TIN -----***----- THI KẾT THÚC HỌC PHẦN Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU Năm học : 2009 - 2010 Thời gian: 60 phút Đề thi số: Ký duyệt đề: 4 Câu 1: (3 điểm) Viết các lệnh T-SQL tạo cơ sở dữ liệu QLYBANHANG gồm các bảng dữ liệu sau đây: LoaiHang(MaLoai, TenLoai) NhaCungCap(MaNCC, TenNCC, DiaChi, DienThoai) HangNhap(MaHN, MaLoai, MaNCC, SoLuong, DonGia) Câu 3: (3 điểm) 1. Thống kê xem mỗi nhà cung cấp đã cung cấp bao nhiêu loại hàng khác nhau: MaNCC TenNCC SoLoaiHang 2. Thống kê xem mỗi loại hàng được cung cấp bởi bao nhiêu nhà cung cấp khác nhau: MaNCC TenNCC SoLoaiHang 3. Thống kê số tiền phải thanh toán cho mỗi nhà cung cấp, biết số tiền phải thanh toán ứng với mỗi MaHN là SoLuong * DonGia: MaNCC TenNCC SoTien Câu 4: (4 điểm) 1. Viết lệnh T-SQL định nghĩa một thủ tục thường trú có tên sp_AddHangNhap làm nhiệm vụ thêm một bản ghi mới vào bảng hàng nhập. Dữ liệu nhập vào phải thỏa mãn tất cả các điều kiện sau đây: Có @MaHN không trùng với một MaHN nào đã có trong bảng Có @MaLoai phải nằm trong số các MaLoai có mặt trong bảng LoaiHang Có @MaNCC nằm trong số các MaNCC có mặt trong bảng NhaCungCap Nếu thêm thành công, thủ tục trả về giá trị 1. Nếu dữ liệu không hợp lệ, thủ tục trả về giá trị 0. 2. Giả sử người ta không tạo ràng buộc khóa chính trên cột MaHN, hãy tạo một Trigger làm nhiệm vụ kiểm soát việc Insert, Update trên bảng HangNhap để đảm bảo tính không trùng lặp của dữ liệu nhập vào cột MaHN và dữ liệu điền vào cột SoLuong luôn phải thỏa mãn điều kiện 10 < SoLuong < 30. 83 Trường Đại Học Hàng Hải Việt Nam Khoa Công nghệ Thông tin BỘ MÔN HỆ THỐNG THÔNG TIN -----***----- THI KẾT THÚC HỌC PHẦN Đề thi số: Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU Năm học : 2009 - 2010 Ký duyệt đề: 5 Thời gian: 60 phút Câu 1: (3 điểm) Viết các lệnh T-SQL tạo cơ sở dữ liệu CHOTHUEXE gồm các bảng dữ liệu sau đây: LoaiXe(MaLoai, TenLoai, DonGiaTheoNgay) KhachHang(MaKhach, TenKhach, DiaChi, DienThoai) Xe(SoXe, MaLoai, TinhTrang) NhatKyThue(SoXe, MaKhach, TuNgay, DenNgay) Câu 3: (4 điểm) Viết các câu lệnh truy vấn làm nhiệm vụ sau đây: 1. Thống kê xem mỗi khách hàng đã từng thuê bao nhiêu loại xe khác nhau: MaKhach TenKhach SoLoaiXeDaThue 2. Thống kê xem mỗi khách hàng đã từng thuê bao nhiêu chiếc xe khác nhau: MaKhach TenKhach SoLuongXeDaThue 3. Thống kê xem mỗi loại xe đã được bao nhiêu khách hàng khác nhau thuê: MaLoai TenLoai SoKhachHang 4. Thống kê xem mỗi xe đã được bao nhiêu khách hàng khác nhau thuê: SoXe SoKhachHang Câu 4: (3 điểm) 1. Hãy viết lệnh T-SQL định nghĩa ra một view thống kê số tiền mà khách phải trả cho mỗi lần thuê xe: SoXe MaKhach TuNgay DenNgay SoNgayThue DonGiaTheoNgay ThanhTien Biết SoNgayThue = DenNgay - TuNgay, ThanhTien = SoNgayThue * DonGiaTheoNgay 2. Hãy viết lệnh T-SQL để định nghĩa một Trigger kiểm soát việc Insert, Update trên bảng NhatKyThue sao cho luôn đảm bảo trên các trường TuNgay và DenNgay thì ngày bắt đầu luôn phải có giá trị nhỏ ngày kết thúc (TuNgay < DenNgay).