<< Chapter < Page | Chapter >> Page > |
SQL cũng có cho phép các so sánh<SOME,>= SOME,<= SOME, = SOME,<>SOME
"Tìm tất cả các tên của các chi nhánh có tài sản lớn hơn tài sản của bất kỳ chi nhánh nào đóng tại Brooklyn"
SELECT Branch_name
FROM Branch
WHERE Assets>ALL (SELECT Assets
FROM Branch
WHERE Branch_citty = 'Brooklyn')
SQL cũng cho phép các phép so sánh:<ALL,<= ALL,>ALL,>= ALL, = ALL,<>ALL.
"Tìm chi nhánh có số cân đối trung bình lớn nhất"
SQL không cho phép hợp thành các hàm tính gộp, như vậy MAX(AVG (...)) là không được phép. Do vậy, ta phải sử dụng câu vấn tin con như sau:
SELECT Branch_name
FROM Account
GROUP BY Branch_name
HAVING AVG (Balance)>= ALL (SELECT AVG (balance)
FROM Account
GROUP BY Branch_name)
"tìm tất cả các khách hàng có cả vay lẫn tài khoản ở ngân hàng"
SELECT Customer_name
FROM Borrower
WHERE EXISTS (SELECT *
FROM Depositor
WHERE Depositor.Customer_name = Borrower.Customer_name)
Cấu trúc EXISTS trả lại giá trị true nếu quan hệ kết quả của câu vấn tin con không rỗng. SQL cũng cho phép sử dụng cấu trúc NOT EXISTS để kiểm tra tính không rỗng của một quan hệ.
"Tìm tất cả các khách hàng có tài khoản tại mỗi chi nhánh đóng tại Brooklyn"
SELECT DISTINCT S.Customer_name
FROM Depositor AS S
WHERE NOT EXISTS( ( SELECT Branch_name
FROM Branch
WHERE Branch_city = 'Brooklyn')
EXCEPT
( SELECT R.branch_name
FROM Depositor AS T, Account AS R
WHERE T.Acoount_number = R.Account_number
AND S.Customer_name = T.Customer_name) )
SQL đưa vào cấu trúc UNIQUE để kiểm tra việc có bộ trùng trong quan hệ kết quả của một câu vấn tin con.
"Tìm tất cả khách hàng chỉ có một tài khoản ở chi nhánh Perryridge"
SELECT T.Customer_name
FROM Depositor AS T
WHERE UNIQUE (SELECT R.Customer_name
FROM Account, Depositor AS R
WHERE T.Customer_name = R.Customer_name AND
R.Account_number = Account.Acount_number ANDAccount.Branch_name = 'Perryridge')
Ta có thể thử sự tồn tại của các bộ trùng trong một vấn tin con bằng cách sử dụng cấu trúc NOT UNIQUE
"Tìm tất cả các khách hàng có ít nhất hai tài khoản ở chi nhánh Perryridge"
SELECT DISTINCT T.Customer_name
FROM Account, Depositor AS T
WHERE NOT UNIQUE ( SELECT R.Customer_name
FROM Account, Depositor AS R
WHERE T.Customer_name=R.Customer_name
ANDR.Account_number = Account.Account_number
AND Account.Branch_name = 'Perryridge')
UNIQUE trả lại giá rị false khi và chỉ khi quan hệ có hai bộ trùng nhau. Nếu hai bộ t1, t2 có ít nhất một trường null, phép so sánh t1 = t2 cho kết quả false. Do vậy UNIQUE có thể trả về giá trị true trong khi quan hệ có nhiều bộ trùng nhau nhưng chứa trường giá trị null !
SQL92 cho phép một biểu thức vấn tin con được dùng trong mệnh đề FROM. Nếu biểu thức như vậy được sử dụng, quan hệ kết quả phải được cho một cái tên và các thuộc tính có thể được đặt tên lại (bằng mệnh đề AS)
Ví dụ câu vấn tin con:
(SELECT Branch_name, AVG(Balance)
FROM Account
GROUP BY Branch_name)
AS result (Branch_name, Avg_balace)
Sinh ra quan hệ gồm tên của tất cả các chi nhánh, và số cân đối trung bình tương ứng. Quan hệ này được đặt tên là result với hai thuộc tính Branch_name và Avg_balance.
Notification Switch
Would you like to follow the 'Hệ quản trị cơ sở dữ liệu' conversation and receive update notifications?