<< 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.
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.
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')
"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
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.
Notification Switch
Would you like to follow the 'Hệ quản trị cơ sở dữ liệu' conversation and receive update notifications?