2.Loại bỏ trùng lặp
Có bao nhiêu nhà cung cấp khác nhau hiện được thể hiện trong bảng INVENTRY? Một phép liệt kê đơn giản (SELECT) sẽ không hiệu quả lắm nếu bảng chứa vài ngàn hàng và chúng ta phải chọn lọc ra một cách thủ công các mã của nhà cung cấp. Máy mắn là, mệnh đề DISTINCT của SQL được thiết kế để đưa ra một danh sách các giá trị khác nhau. Chẳng hạn, lệnh
SELECT DISTINCT V_CODE
FROM INVENTRY;
sẽ chỉ đưa ra các mã (V_CODE) nhà cung cấp khác nhau được tìm thấy trong bảng INVENTRY:
V_CODE
|
21344
21231
24288
23119
21225
|
3.Các hàm số học SQL
SQL sẽ thực hiện các tóm tắt toán học khác nhau cho bạn, như đếm số hàng thỏa mãn một điều kiện đã cho nào đó, tìm các giá trị lớn nhất và nhỏ nhất của một thuộc tính đã cho nào đó, cộng các giá trị trong một cột đã cho, tính trung bình các giá trị trong một cột đã cho... Các hàm được chỉ ra trong bảng 3.6.
Bảng 3.6 Các hàm số học SQL
Hàm
|
Kết quả thực hiện
|
COUNT
|
Số hàng bao hàm thuộc tính đã mô tả
|
MIN
|
Giá trị thuộc tính nhỏ nhất
|
MAX
|
Giá trị thuộc tính lớn nhất
|
AVG
|
Trung bình số học ứng với thuộc tính đã mô tả
|
SUM
|
Tổng tất cả các giá trị của thuộc tính đã chọn
|
COUNT. Vì COUNT được thiết kế để đếm số “gí trị” cụ thể của thuộc tính, nó thường được dùng kết hợp với mệnh đề DISTINCT. Chẳng hạn, trả lời cho câu hỏi Có bao nhiêu nhà cung cấp khác nhau hiện được tìm thấy trong bảng INVENTRY? chúng ta có thể dùng lệnh
SELECT COUNT (DISTINCT V_CODE)
FROM INVENTRY;
sẽ đưa ra kết quả
Nói cách khác, bảng chứa năm mã nhà cung cấp khác nhau.
Tất cả các hàm số học đều có thể được dùng kết hợp với các điều kiện được chỉ ra. Giả sử bạn được yêu cầu đưa ra câu trả lời cho bài toán sau:
Tìm số mặt hàng trong bảng INVENTRY mà giá của chúng nhỏ hơn hoặc bằng 10.00USD.
Câu trả lời được cho bởi dòng lệnh
SELECT COUNT(DISTINCT V_CODE)
FROM INVENTRY
WHERE PRICE <= 10.00;
Dãy lệnh này sẽ đưa ra kết quả
(Khảo sát bảng INVENTRY ta thấy rằng bảng chứa năm số V_CODE khác nhau – 21344, 21231, 24288, 23119 và 21225 – trong đó có ba số ứng với các sản phẩm mà giá của chúng nhỏ hơn hoặc bằng 10.00USD.)
Dấu hoa thị (*) vẫn được dùng như một kí tự thay thế để tất cả các bản ghi thỏa mãn điều kiện đã mô tả. Trả lời câu hỏi
Có bao nhiêu hàng trong bảng INVENTRY chứa sản phẩm ứng với PRICE nhỏ hơn hoặc bằng 10.00USD?
dùng dãy lệnh
SELECT COUNT(*)
FROM INVENTRY
WHERE PRICE <= 10.00;
để đưa ra câu trả lời đúng
(Khảo sát nội dung bảng INVENTRY ta thấy rằng có bốn hàng thoả mãn điều kiện đã chỉ ra.)
MAX và MIN. Các hàm MAX và MIN sẽ giúp chúng ta tìm câu trả lời cho các ài toán như
Tìm giá lớn nhất trong bảng INVENTRY.
Tìm giá nhỏ nhất trong bảng INVENTRY.
Câu trả lời đúng cho bài toán thứ nhất được tạo ra bởi
SELECT MAX(PRICE)
FROM INVENTRY;
Dãy lệnh này sẽ đưa ra kết quả
Câu trả lời đúng cho bài toán thứ hai được tạo ra bởi
SELECT MIN(PRICE)
FROM INVENTRY;
Dãy lệnh này sẽ đưa ra kết quả
Các hàm số học cũng có thể được dùng với các hạn chế lôgic phức tạp hơn. Tuy nhiên, bạn phải nhớ rằng các hàm số học chỉ đưa ra một giá trị duy nhất trên tất cả các giá trị được tìm thấy trong bảng: giá trị lớn nhất duy nhất, giá trị nhỏ nhất duy nhất, tổng đếm duy nhất hoặc giá trị trung bình duy nhất. Thường dễ quên các cảnh báo đơn giản này. Chẳng hạn, chúng ta cùng khảo sát câu hỏi
Sản phẩm nào có giá cao nhất?
Mặc dù câu hỏi này khác đơn giản, dãy lệnh SQL
SELECT P_CODE, P_DESCRIPT, PRICE
FROM INVENTRY
WHERE PRICE = MAX(PRICE);
sẽ không đưa ra các kết quả mong muốn vì
SELECT đưa ra một danh sách nhiều giá trị giá.
Phép so sánh với MAX(PRICE) xảy ra quá muộn trong dãy lệnh; các giá trị PRICE đã được lấy ra từ bảng trước khi hàm MAX(PRICE) có thể được khớp vào phép so sánh.
Do đó, để trả lời câu hỏi, bạn phải duyệt các mục với một hạn chế giá trị duy nhất bằng cách sử dụng một thủ tục được gọi là vấn tin lồng nhau. Như tên của nó đã chỉ rõ, vấn tin lồng nhau là vấn tin trong vấn tin. Trong trường hợp này, vấn tin lồng nhau gồm hai phần:
vòng trong, được thực hiện trước.
vòng ngoài, được thực hiện sau. (Vòng ngoài thường là SELECT đầu tiên được gặp trong dãy lệnh.)
Dùng dãy lệnh dưới đây như một ví dụ, lưu ý rằng vòng trong trước hết tìm giá trị giá lớn nhất, được lưu trong bộ nhớ. Vì bây giờ vòng ngoài có một giá trị để so sánh từng giá trị PRICE với nó nên câu vấn tin được thực hiện đúng đắn.
SELECT P_CODE, P_DESCRIPT, PRICE
FROM INVENTRY
WHERE PRICE = (SELECT MAX(PRICE)
FROM INVENTRY);
Như mong muốn, dãy lệnh trên đưa ra kết quả
P_CODE
|
P_DESCRIPT
|
PRICE
|
89-WRE-Q
|
Houselite chain saw, 16in
|
256.99
|
AVG. Hàm AVG tương tự như các hàm MIN và MAX, có cùng các hạn chế tính toán. Một giá trị PRICE trung bình duy nhất có thể được tạo ra bằng cách dùng lệnh
SELECT AVG(PRICE)
FROM INVENTRY;
để đưa ra kết quả
Một danh sách theo thứ tự giá giảm dần của tất cả các sản phẩm có giá lớn hơn giá trị trung bình có thể được tạo ra bởi
SELECT *
FROM INVENTRY
WHERE PRICE > (SELECT AVG(PRICE)
FROM INVENTRY)
ORDER BY PRICE DESC;
Kết quả đưa ra như sau:
P_CODE
|
P_DESCRIPT
|
STOCK_DATE
|
ON_HAND
|
MIN_QUANT
|
PRICE
|
V_CODE
|
89-WRE-Q
|
Houselite chain saw, 16in
|
08/11/1991
|
11
|
5
|
256.99
|
24288
|
|
2232/QTY
|
B&D jigsaw, 12in, blade
|
11/26/1990
|
8
|
3
|
109.92
|
24288
|
|
2232/QWE
|
B&D jigsaw, 8in, blade
|
11/26/1990
|
6
|
3
|
99.87
|
24288
|
|
SUM. Hàm SUM tính tổng cho một thuộc tính đã chỉ ra nào đó, theo bất cứ điều kiện nào bạn áp đặt. Chẳng hạn, nếu bạn muốn tìm giá trị tổng cộng của tất cả các sản phẩm theo thống kê, bạn có thể dùng
SELECT SUM(ON_HAND*PRICE)
FROM INVENTRY;
vì giá trị tổng cộng là tích của số sản phẩm hiện có và giá của nó.
Chia sẻ với bạn bè của bạn: |