CƠ SỞ DỮ LIỆU QUAN HỆ

Nguyễn Thánh Tiền

Mr Favoirite 2012
Thành viên
2 Tháng mười 2010
1,931
782
324
Hà Nội
cO VUA
[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Cơ sở dữ liệu là một kho chứa dữ liệu và dùng để chia sẻ. Để biến dữ liệu ở dạng cơ sở dữ liệu quan hệ có thể dùng được cho người sử dụng, chúng ta phải phân tích một số vấn đề chính. Thứ nhất, làm thế nào mà người sử dụng có thể chỉ định rõ các yêu cầu của mình trên dữ liệu: Một trong những ngôn ngữ truy vấn nào mà họ có thể dùng? Chương 1 sẽ bao hàm ngôn ngữ SQL, vốn là ngôn ngữ truy vấn được sử dụng nhiều nhất hiện nay. Chương 2 sẽ trình bày hai ngôn ngữ truy vấn khác QBE và Datalog, vốn là ngôn ngữ truy vấn thay thế SQL dùng để trích xuất dữ liệu quan hệ.

Một vấn đề quan trọng khác là sự an toàn và toàn vẹn của dữ liệu; Cơ sở dữ liệu cần phải bảo vệ dữ liệu khỏi các hiểm nguy từ các hoạt động cố ý hoặc vô ý của người sử dụng. Bộ phận đảm bảo tính toàn vẹn của một cơ sở dữ liệu phải đảm bảo rằng các cập nhật dữ liệu không gây ra vi phạm ràng buộc toàn vẹn. Bộ phận đảm bảo sự an toàn của cơ sở dữ liệu bao gồm việc xác thực người sử dụng và điều khiển việc truy cập, nhằm giới hạn các hoạt động của mỗi người sử dụng. Chương 3 sẽ trình bày các vấn đề về an toàn và toàn vẹn dữ liệu.
 
  • Like
Reactions: realjacker07

Nguyễn Thánh Tiền

Mr Favoirite 2012
Thành viên
2 Tháng mười 2010
1,931
782
324
Hà Nội
cO VUA
CHƯƠNG 1 SQL
1.1 Nền tảng

IBM phát triển phiên bản đầu tiên của SQL tại phòng nghiên cứu ở San Jose (hiện nay là Trung tâm nghiên cứu Almaden). Thực tế, ngôn ngữ SQL có nguồn gốc từ ngôn ngữ Sequel, là một phần của dự án “System R” ở những năm đầu thập niên 1970. Sau đó ngôn ngữ Sequel được cải tiến và đổi tên thành SQL (Structured Query Language - Ngôn ngữ truy vấn có cấu trúc). Hiện này có nhiều ứng dụng hỗ trợ ngôn ngữ SQL. SQL đã dần dần trở thành ngôn ngữ cơ sở dữ liệu quan hệ chuẩn.

Năm 1986, Viện tiêu chuẩn quốc gia Mỹ (American National Standards Institute - ANSI) và Tổ chức chuẩn hóa quốc tế (ISO) đã đề xuất ra chuẩn SQL, đặt tên là SQL-86. Năm 1987, IBM đã tự đề xuất ra chuẩn SQL riêng của họ, đặt tên là SAA-SQL. Năm 1989, ANSI mở rộng chuẩn SQL thành SQL-89. Chuẩn SQL tiếp theo sau đó là SQL-92 và phiên bản gần đây nhất là SQL:99.

Trong chương này, chúng tôi trình bày khái quát về SQL, chủ yếu về chuẩn SQL-92. Chúng tôi cũng trình bày một vài đặc điểm của chuẩn SQL:1999 – là chuẩn cao hơn của chuẩn SQL-92.

Các thành phần của ngôn ngữ SQL bao gồm:

· Ngôn ngữ định nghĩa dữ liệu: (Data-Definition Language, DDL). DDL cung cấp các lệnh dùng để định nghĩa các lược đồ quan hệ, xóa các quan hệ và sửa các lược đồ quan hệ.

· Ngôn ngữ thao tác dữ liệu: (Interactive data-manipulation language, DML). DML bao gồm ngôn ngữ truy vấn dựa trên cả hai đại số quan hệ và các phép toán trên các bộ của quan hệ. DML bao gồm các lệnh dùng để chèn, xóa và sửa các bộ dữ liệu trên cơ sở dữ liệu.

· Định nghĩa khung nhìn: (View definition). DDL chứa các lệnh để định nghĩa các khung nhìn.

· Điều khiển giao tác: SQL chứa các lệnh dùng để chỉ rõ phần bắt đầu và kết thúc của các giao tác.

· SQL nhúng và SQL động: SQL nhúng và SQL động định nghĩa cách thức các lệnh SQL có thể được nhúng trong các ngôn ngữ lập trình phổ biến như C, C++, Java, PL/I, Cobol, Pascal và Fortran.

· Sự toàn vẹn. DDL bao gồm các lệnh để chỉ rõ các ràng buộc toàn vẹn mà dữ liệu được lưu trên cơ sở dữ liệu buộc phải thỏa mãn. Các cập nhật gây ra vi phạm ràng buộc toàn vẹn sẽ không được cho phép.

· Sự xác thực. DDL bao gồm các lệnh để chỉ rõ các quyền truy cập đến các quan hệ và các khung nhìn.


Trong chương này, chúng tôi trình bày tổng quan về DML và các đặc điểm cơ bản của DDL. Chúng tôi cũng trình bày sơ lược về SQL nhúng và SQL động, bao gồm các chuẩn ODBC và JDBC cho việc tương tác với cơ sở dữ liệu bằng các ngôn ngữ lập trình C và Java.

Trong chương này và các chương về sau, chúng tôi sử dụng lược đồ quan hệ mẫu về việc kinh doanh của ngân hàng như sau:

Branch-schema = (branch-name, branch-city, assets)

Customer-schema = (customer-name, customer-street, customer-city)

Loan-schema = (loan-number, branch-name, amount)

Borrower-schema = (customer-name, loan-number)

Account-schema = (account-number, branch-name, balance)

Depositor-schema = (customer-name, account-number)

Lưu ý, trong chương này và một số nơi khác của sách, chúng tôi sử dụng dấu gạch nối trong lược đồ, các quan hệ và các thuộc tính để dễ đọc. Thực tế trong hệ thống SQL, dấu gạch nối là không hợp lệ (vì nó được xem là phép toán trừ). Các đơn giản để dịch các tên này là dùng dấu gạch dưới (“_”). Ví dụ, chúng tôi dùng branch_name thay cho branch-name.
 

Nguyễn Thánh Tiền

Mr Favoirite 2012
Thành viên
2 Tháng mười 2010
1,931
782
324
Hà Nội
cO VUA
1.2 Cấu trúc cơ bản


Một cơ sở dữ liệu quan hệ bao gồm một tập hợp các quan hệ, mỗi quan hệ được gán một tên duy nhất và có một cấu trúc nhất định. SQL cho phép sử dụng giá trị rỗng để gán cho các giá trị không biết hoặc không tồn tại. SQL cho phép người sử dụng chỉ rõ các thuộc tính nào không thể gán giá trị rỗng (chúng ta sẽ thảo luận vấn đề này ở mục 1.11).

Cấu trúc cơ bản của một biểu thức SQL bao gồm ba mệnh đề: Select, FromWhere.

· Mệnh đề Select tương ứng với phép chiếu của đại số quan hệ. Nó được sử dụng để liệt kê các thuộc tính được yêu cầu xuất hiện trong kết quả của truy vấn.

· Mệnh đề From tương ứng với phép toán tích Đề-các của đại số quan hệ. Nó liệt kê các quan hệ sẽ được quét qua trong quá trình thực hiện truy vấn.

· Mệnh đề Where tương ứng với điều kiện lọc của đại số quan hệ. Nó đề cập đến các thuộc tính của quan hệ xuất hiện trong mệnh đề From.

Cấu trúc thông thường của một truy vấn SQL có dạng:

select A1, A2, . . .,An

from r1, r2, . . . , rm

where P

Mỗi Ai đại diện cho một thuộc tính và một ri đại diện cho một quan hệ. P là điều kiện lọc. Truy vấn trên tươgn đương với biểu thức đại số quan hệ như sau:

ΠA1, A2,...,An(σP (r1 × r2 × · · · × rm))


Nếu không có mệnh đề Where thì nghĩa là truy vấn không có điều kiện. Tuy nhiên, không giống như kết quả của một biểu thức đại số quan hệ, kết quả của truy vấn SQL có thể chứa nhiều bộ giống nhau, chúng tôi sẽ bàn vấn đề này ở phần 1.2.8.

SQL hình thành nên phép tích Đề-các của các quan hệ có tên trong mệnh đề From, sau đó thực hiện phép chọn đại số quan hệ dựa trên các điều kiện ở mệnh đề Where và sau đó lọc lấy các kết quả của các thuộc tính ở mệnh đề Select. Trong thực tế, SQL có thể chuyển đổi biểu thức sang dạng tương đương để có thể thực hiện hiệu quả hơn.



1.2.1 Mệnh đề select

Dĩ nhiên, kết quả của một truy vấn SQL là một quan hệ. Chúng ta hãy xét một ví dụ đơn giản bằng cách sử dụng lược đồ quan hệ ngân hàng ở trên, yêu cầu “Hãy tìm tên của tất cả các chi nhánh trong quan hệ loan”.

select branch-name

from loan

Kết quả của một quan hệ bao gồm một thuộc tính với tiêu đề branch-name. Các ngôn ngữ truy vấn thông dụng thường dựa trên các ghi chú toán học rằng một quan hệ là một tập hợp. Do đó, các bộ có giá trị giống nhau không bao giờ xuất hiện trong các quan hệ. Trong thực tế, việc loại bỏ các giá trị giống nhau thường mất rất nhiều thời gian. Do đó, SQL (và các ngôn ngừ truy vấn khác) cho phép xuất hiện các bộ giống nhau trong quan hệ cũng như trong kết quả truy vấn.

Trong trường hợp chúng ta muốn loại bỏ các giá trị trùng nhau trong truy vấn, chúng ta phải chèn thêm từ khóa distinct sau mệnh đề select. Chúng ta có thể viết lại truy vấn ở trên như sau:

select distinct branch-name

from loan

nếu chúng ta muốn loại bỏ các giá trị trùng nhau.

SQL cho phép chúng ta sử dựng từ khóa all để chỉ định rõ ràng là muốn hiển thị tất cả giá trị trùng nhau:

select all branch-name

from loan

Do việc hiển thị các giá trị trùng nhau là việc mặc định trong SQL, chúng ta không cần phải sử dụng từ khóa all trong các ví dụ về sau. Trong trường hợp muốn loại bỏ các giá trị trùng nhau trong kết quả truy vấn, chúng ta sử dụng từ khóa distinct. Trong hầu hết các truy vấn, distinct rất ít được sử dụng, lý do là số lượng bộ trùng nhau trong kết quả truy vấn là không quan trọng. Tuy nhiên, trong một số trường hợp, số lượng bộ trùng nhau là quan trọng, chúng ta sẽ bàn lại vấn đề nay ftrong phần 1.2.8.

Ký hiệu “*” được dùng để đại diện cho “tất cả các thuộc tính”. Do đó, việc sử dụng loan.* trong ngay sau mệnh đề select sẽ chỉ ra rằng tất cả các thuộc tính của quan hệ loan sẽ được lựa chọn. Mệnh đề select với dạng select * sẽ chỉ ra rằng tất cả các thuộc tính của tất cả các quan hệ xuất hiện trong mệnh đề from sẽ được lựa chọn.

Mệnh đề select cũng có thể chứa các biểu thức số học liên quan các toán tử +, -, * và / trên các hằng số hoặc các thuộc tính của các bộ. Ví dụ, truy vấn:

select loan-number, branch-name, amount * 100

from loan

sẽ trả về một quan hệ tương đương quan hệ loan, ngoại trừ thuộc tính amount sẽ được nhân cho 100.

SQL cũng cung cấp các kiểu dữ liệu đặc biệt và cho phép các hàm số học thực hiện trên các kiểu dữ liệu này.



1.2.2 Mệnh đề where

Chúng ta sẽ mô tả việc sử dụng mệnh đề where trong SQL. Xét truy vấn “Hãy tìm tất cả các số tài khoản có gửi tiền ở ngân hàng trong quan hệ loan tại chi nhánh Perryridge với số tiền vay mượn lớn hơn $1200”. Truy vấn này được viết dưới dạng SQL như sau:

select loan-number

from loan

where branch-name = ’Perryridge’ and amount > 1200

SQL sử dụng các toán tử logic and, or not để thực hiện phép nối mà không dùng các ký tự toán học như ∧, ∨, và ¬ trong mệnh đề where. Các toán tử của các phép nối có thể được thay thế bằng các toán tử so sánh như <, <=, >, >=, = và <>.

SQL cho phép chúng ta sử dụng các toán tử so sánh để so sánh chuỗi và các biểu thức số học, cũng như đối với các kiểu dữ liệu đặc biệt, ví dụ kiểu ngày tháng.

SQL chứa toán tử between để làm đơn giản hóa mệnh đề where khi muốn chỉ ra giá trị nằm trong khoảng nhỏ hơn hoặc bằng, lớn hơn hoặc bằng. Ví dụ , nếu chúng ta muốn biết số tài khoản vay mượn của quan hệ loan với số tiền vay mượn trong khoảng từ $90,000 đến $100,000, chúng ta có thể sử dụng từ khóa between để viết lệnh:

select loan-number

from loan

where amount between 90000 and 100000

thay thế cho lệnh:

select loan-number

from loan

where amount <= 100000 and amount >= 90000

Tương tự, chúng ta sử dụng toán tử so sánh not between để định nghĩa giá trị nằm ngoài khoảng giá trị được đưa ra.


1.2.3 Mệnh đề from

Cuối cùng, chúng ta hãy thảo luận việc sử dụng mệnh đề from. Mệnh đề from định nghĩa phép tích Đề-các của các quan hệ trong mệnh đề. Bởi vì phép kết nối tự nhiên được định nghĩa dưới dạng phép tích Đề-các, cho nên phép chọn và phép chiếu dễ dàng được mô tả dưới dạng câu lệnh SQL. Ví dụ, biểu thức đại số quan hệ dưới đây:


Πcustomer-name, loan-number, amount (borrower x loan)

dùng để truy xuất thông tin “Tìm tất cả khách hàng có tiền gửi và vay ở ngân hàng, liệt kê tên khách hàng, số tài khoản vay ngân hàng và số tiền mượn.” Trong SQL, truy vấn này có thể viết như sau:

select customer-name, borrower.loan-number, amount

from borrower, loan

where borrower.loan-number = loan.loan-number

Lưu ý rằng giống như đại số quan hệ, SQL sử dụng cú pháp relation-name.attribute-name để tránh sự nhập nhằng trong trường hợp tên thuộc tính xuất hiện trong nhiều quan hệ. Chúng ta có thể viết borrower.customer-name thay vì customername trong mệnh đề select. Tuy nhiên, bởi vì thuộc tính customer-name chỉ xuất hiện trong một quan hệ trong mệnh đề from, nên không xảy ra việc nhập nhằng dữ liệu khi chúng ta chỉ viết customer-name.

Chúng ta có thể mở rộng truy vấn trước đó và xét thêm một trường hợp phức tạp. Ví dụ, chúng ta yêu cầu người vay tiền ở chi nhánh Perryridge: “Tìm tên khách hàng, tên tài khoản vay mượn và số tiền mượn của tất cả sự vay mượn ở chi nhánh Perryridge”. Để viết truy vấn này, chúng ta cần có hai ràng buộc ở mệnh đề where và chúng được liên kết nhau qua toán tử logic and:

select customer-name, borrower.loan-number, amount

from borrower, loan

where borrower.loan-number = loan.loan-number and

branch-name = ’Perryridge’

Ngoài ra, SQL còn chứa một số phần mở rộng để thực hiện các phép kết nối tự nhiên và kết nối ngoài trong mệnh đề from. Chúng ta sẽ thảo luận về phần mở rộng này ở phần 1.10.
 
  • Like
Reactions: Kirigaya Kazuto.

Nguyễn Thánh Tiền

Mr Favoirite 2012
Thành viên
2 Tháng mười 2010
1,931
782
324
Hà Nội
cO VUA
1.2.4 Phép toán đổi tên

SQL cung cấp cơ chế cho phép đổi tên quan hệ và tên thuộc tính. Việc đổi tên được sử dụng như một mệnh đề, có dạng:

old-name as new-name

Mệnh đề as có thể xuất hiện ở mệnh đề select hoặc mệnh đề from.

Xét lại ví dụ trước đó:

select customer-name, borrower.loan-number, amount

from borrower, loan

where borrower.loan-number = loan.loan-number

Kết quả của truy vấn này là một quan hệ với các thuộc tính như sau: customer-name, loan-number, amount.

Tên của các thuộc tính trong bảng kết quả được rút trích từ tên của các thuộc tính trong quan hệ ở mệnh đề from.

Tuy nhiên, chúng ta không thể lúc nào cũng có thể rút trích tên theo cách này, vì một số lý do như sau: Thứ nhất, hai quan hệ ở mệnh đề from có thể có các thuộc tính có cùng tên với nhau, dẫn đến trường hợp bảng kết quả có cột bị trùng tên. Thứ 2, nếu chúng ta sử dụng các biểu thức số học trong mệnh đề select, kết quả của thuộc tính đó không có tên. Thứ 3, cho dù tên thuộc tính có thể rút trích từ quan hệ như ở ví dụ trước, nhưng chúng ta muốn thay đổi tên thuộc tính ở bảng kết quả. Do đó, SQL cung cấp một cách đổi tên các thuộc tính trong quan hệ kết quả.

Ví dụ, nếu chúng ta muốn tên thuộc tính loan-number sẽ được thay thể bằng loan-id, chúng ta có thể viết lại truy vấn như sau:

select customer-name, borrower.loan-number as loan-id, amount

from borrower, loan

where borrower.loan-number = loan.loan-number



1.2.5 Các biến của bộ

Mệnh đề as cũng đặc biệt được sử dụng để định nghĩa các biến của bộ. Trong SQL, một biến của bộ phải gắn với một quan hệ cụ thể. Hai biến của bộ được định nghĩa ở mệnh đề from bằng mệnh đề as. Để mô tả cho ý này, chúng tôi viết lại truy vấn “Đối với các khách hàng có tiền gửi ở ngân hàng, liệt kê tên, số tài khoản gửi và số tiền gửi” như sau:

select customer-name, T.loan-number, S.amount

from borrower as T, loan as S

where T.loan-number = S.loan-number

Lưu ý rằng chúng ta định nghĩa biến của bộ ở mệnh đề from bằng cách đặt tên biến sau tên của quan hệ mà nó thay thế với từ khoa as đặt ở giữa (từ khóa as là tùy chọn, có thể có hoặc không). Khi chúng ta viết biểu thức ở dạng relation-name.attribute-name thì relation-name có thể được thay thế bằng biến của bộ.

Các biến của bộ được sử dụng nhiều nhất khi muốn so sánh hai bộ của cùng một quan hệ. Nhắc lại rằng, trong một vài trường hợp, chúng ta có thể sử dụng phép toán đổi tên trong đại số quan hệ. Giả sử chúng ta muốn thực hiện truy vấn “Tìm tên của tất cả chi nhánh có tài sản lớn hơn tài sản của chi nhánh ở Brooklyn”. Chúng ta có thể viết biểu thức SQL như sau:

select distinct T.branch-name

from branch as T, branch as S

where T.assets > S.assets and S.branch-city = ’Brooklyn’

Quan sát ví dụ ở trên, chúng ta thấy rằng không thể sử dụng cú pháp branch.asset, bởi vì nó không thể chỉ định rõ branch ở chi nhánh nào.

SQL cho phép chúng ta sử dụng cú pháp (v1, v2, …, vn) để định nghĩa một bộ của của n giá trị v1, v2, …, vn. Các toán tử so sánh có thể dược sử dụng trên các bộ và việc sắp xếp được định nghĩa theo từ điển. Ví dụ, (a1, a2) <= (b1, b2) là đúng nếu a1 < b1 hoặc (a1 = b1) ∧ (a2 <= b2); tương tự, hai bộ bằng nhau nếu tất cả các thuộc tính của nó tương ứng bằng nhau.
 
  • Like
Reactions: Kirigaya Kazuto.

Nguyễn Thánh Tiền

Mr Favoirite 2012
Thành viên
2 Tháng mười 2010
1,931
782
324
Hà Nội
cO VUA
1.2.6 Các toán tử chuỗi
SQL chỉ rõ các chuỗi bằng cách đặt chúng trong cặp nháy đơn, ví dụ, ‘Perryridge’ mà chúng ta thấy ở ví dụ trước. Ký tự nháy đơn là một phần của chuỗi và dùng để thay thế cặp dấu ngoặc kép; ví dụ, chuỗi “It’s right” được thay bằng ‘It’s right’.
Phép toán trên chuỗi được sử dụng nhiều nhất là việc so sánh sử dụng toán tử like. Toán tử like thường đi kèm với một trong hai ký tự đặc biệt sau:
· Phần trăm (%): Ký tự % đại diện cho một chuỗi ký tự.
· Dấu gạch chân (_): Ký tự _ đại diện cho một ký tự bất kỳ.
Việc so sánh chuỗi phân biệt chữ hoa và chữ thường, nghĩa là ký tự in hoa khác với ký tự thường và ngược lại. Để minh hoặc việc so sánh chuỗi, chúng ta hãy xét các ví dụ sau:
· ‘Perry%’ sẽ trả về kết quả là các chuỗi bắt đầu bằng “Perry”.
· ‘%idge%’ sẽ trả về các chuỗi có chứa chuỗi con “idge”, ví dụ như ‘Perryridge’, ‘Rock Ridge’, ‘Mianus Bridge’ và ‘Ridgeway’.
· ‘_ _ _’ sẽ trả về bất kỳ chuỗi nào có chứa đúng 3 ký tự.
· ‘_ _ _%’ sẽ trả về bất kỳ chuỗi nào có chứa ít nhất 3 ký tự.
SQL sử dụng toán tử like để so sánh chuỗi. Xét truy vấn Tìm tên các khách hàng có địa chỉ đường chứa chuỗi ‘Main’”. Truy vấn này có thể được viết như sau:
select customer-name
from customer
where customer-street like ’%Main%’
Đối với các chuỗi có chứa ký tự đặc biệt (như %, và _ ), SQL cho phép dùng ký tự thoát. Ký tự thoát được sử dụng ngay trước ký tự đặc biệt để chỉ ra rằng ký tự đặc biệt phải được coi như ký tự thông thường. Chúng ta định nghĩa ký tự thoát cho phép so sánh like bằng cách sử dụng ký tự thoát. Để minh họa, xét các ví dụ sau có sử dụng dấu vạch chéo ngược (\) như ký tự thoát:
· Like ‘ab\%cd%’ escape ‘\’ sẽ trả về các chuỗi bắt đầu với “ab%cd”.
· Like ‘ab\\cd%’ escape ‘\’ sẽ trả về các chuỗi bắt đầu với “ab\cd”.
SQL cho phép chúng ta tìm các chuỗi không giống thay vì tìm các chuỗi giống nhau bằng cách sử dụng toán tử so sánh not like.
SQL cũng cho phép một số hàm xử lý chuỗi như nối chuỗi (sử dụng “||”), rút trích chuỗi con, tìm chiều dài của chuỗi, chuyển đổi giữa ký tự hoa và thường. SQL:1999 có hỗ trợ toán tử similar to dùng để so sánh chuỗi tố thơn toán tử like; cú pháp của các toán tử này tương tự như cú pháp sử dụng trong các biểu thức thông thường trên Linux.
 
Top Bottom