<< Chapter < Page Chapter >> Page >

Sự tồn tại của các giá trị null cũng làm phức tạp việc sử lý các toán tử tính gộp. Giả sử một vài bộ trong quan hệ Loan có các giá trị null trên trường Amount. Ta xét câu vấn tin sau:

SELECT SUM(Amount)

FROM LOAN

Các giá trị được lấy tổng trong câu vấn tin bao hàm cả các trị null. Thay vì tổng là null, SQL chuẩn thực hiện phép tính tổng bằng cách bỏ qua các giá trị input là null.

Nói chung, các hàm tính gộp tuân theo các quy tắc sau khi xử lý các giá trị null: Tất cả các hàm tính gộp ngoại trừ COUNT(*) bỏ qua các giá trị input null. Khi các giá trị nul bị bỏ qua, tập các giá trị input có thể là rõng. COUNT() của một tập rỗng được định nghĩa là 0. Tất cả các hàm tính gộp khác trả lại giá trị null khi áp dụng trên tập hợp input rỗng.

Các câu vấn tin con lồng nhau (nested subqueries)

SQL cung cấp một cơ chế lòng nhau của các câu vấn tin con. Một câu vấn tin con là một biểu thức SELECT-FROM-WHERE được lồng trong một caau vấn tin khác. Các câu vấn tin con thường được sử dụng để thử quan hệ thành viên tập hợp, so sánh tập hợp và bản số tập hợp.

Quan hệ thành viên tập hợp (set relationship)

SQL đưa vào các phép tính quan hệ các phép toán cho phép thử các bộ có thuộc một quan hệ nào đó hay không. Liên từ IN thử quan hệ thành viên này. Liên từ NOT IN thử quan hệ không là thành viên.

"Tìm tất cả các khách hàng có cả vay lẫn một tài khoản tại ngân hàng"

Ta đã sử dụng INTERSECTION để viết câu vấn tin này. Ta có thể viết câu vấn tin này bằng các sử dụng IN như sau:

SELECT DISTINCT Customer_name

FROM Borrower

WHERE Customer_name IN (SELECT Customer_name

FROM Depositor)

Ví dụ này thử quan hệ thành viên trong một quan hệ một thuộc tính. SQL92 cho phép thử quan hệ thành viên trên một quan hệ bất kỳ.

"Tìm tất cả các khách hàng có cả vay lãn một tài khoản ở chi nhánh Perryridge"

Ta có thể viết câu truy vấn như sau:

SELECT DISTINCT Customer_name

FROM Borrower, Loan

WHERE Borrower. Loan_number = Loan.Loan_number AND

Branch_name = 'Perryridge'AND

(Branch_name. Customer_name IN

(SELECT Branch_name, Customer_name

FROM Depositor, Account

WHEREDepositor.Account_number= Account.Account_number )

"Tìm tất cả các khách hàng có vay ngân hàng nhưng không có tài khoản tại ngân hàng"

SELECT DISTINCT Customer_name

FROM borrower

WHERE Customer_name NOT IN (SELECT Customer_name

FROM Depositor)

Các phép toán IN và NOT IN cũng có thể được sử dụng trên các tập hợp liệt kê:

SELECT DISTINCT Customer_name

FROM borrower

WHERE Customer_name NOT IN ('Smith', 'Jone')

So sánh tập hợp (set comparision)

"Tìm tên của tất cả các chi nhánh có tài sản lớn hơn ít nhất một chi nhánh đóng tại Brooklyn"

SELECT DISTINCT Branch_name

FROM Branch AS T, Branch AS S

WHERE T.assets>S.assets AND S.branch_city = 'Brooklyn'

Ta có thể viết lại câu vấn tin này bằng cách sử dụng mệnh đề"lớn hơn ít nhất một"trong SQL

  • SOME :

SELECT Branch_name

FROM Branch

WHERE Assets>SOME (SELECT Assets

FROM Branch

WHERE Branch_city ='Brooklyn')

Câu vấn tin con

( SELECT Assets

FROM Branch

WHERE Branch_city ='Brooklyn')

sinh ra tập tất cả các Assets của tất cả các chi nhánh đóng tại Brooklyn. So sánh>SOME trong mệnh đề WHERE nhận giá trị đúng nếu giá trị Assets của bộ được xét lớn hơn ít nhất một trong các giá trị của tập hợp này.

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Hệ quản trị cơ sở dữ liệu. OpenStax CNX. Jul 31, 2009 Download for free at http://cnx.org/content/col10838/1.1
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Hệ quản trị cơ sở dữ liệu' conversation and receive update notifications?

Ask