Hàm tập hợp - Aggregate functionsĐược dùng để tổng kết các giá trị của 1 cột hay 1 nhóm cột bên trong 1 bảng và cho kết quả là 1 giá trị đơn... Nhóm dữ liệu trong bảng kết quảNhững m
Trang 1Truy tìm dữ liệu trong 1CSDL
Data retrieval
Trang 2Biết cách dùng lệnh SELECT để tổ chức và nhóm dữ liệu.
Trang 3Truy vấn là gì? - Query
Truy vấn là 1 yêu cầu của người dùng để:
Truy tìm và khôi phục dữ liệu từ CSDL (Data retrieval)
Chỉnh sửa dữ liệu (Data modification)
Xoá dữ liệu (Data deletion)
Để tạo truy vấn:
Query analyzer: gõ lệnh trực tiếp
Enterprise Manager: nhấp phải chuột tại bảng cần xem, chọn lệnh open\Query-> cửa
sổ trợ giúp xây dựng truy vấn
Trang 4Query Analyzer
Trang 5Enterprise Manager queries
Trang 6Cửa số xây dựng truy vấn Query Builder
Trang 8Lệnh SELECT
Cú pháp chung:
SELECT [ALL|DISTINCT] select_list
[ TOP n [ PERCENT ] [ WITH TIES ] ]
[INTO[[database.]owner.]table_name] FROM[[[database.]owner.]table_name|
view_name|UDF]
[WHERE search_conditions]
[GROUP BY aggregate_free_expression] [HAVING search_conditions]
[ORDER BY table_or_view_and_column] [COMPUTE row_aggregate(column_name)] [BY column_name]]
Trang 9column_alias: là tên gọi khác thay thế cho tên cột trong bảng kết quả.
Trang 12FROM aliases
Sử dụng alias thay cho tên bảng hay tên
view để tránh phải gõ nhiều và tránh nhầm lẫn
Ví dụ:
SELECT a.OrderID, a.OrderDate,
b CompanyName FROM Orders a, Customers b
WHERE a.CustomerID= b.CustomerID
Trang 13TOP n [PERCENT] [WITH TIES]
hay n% của các hàng của bảng kết quả được xuất ra ngoài
vào bảng kết quả gốc nếu các hàng này có cùng giá trị trong cột ORDER BY với hàng cuối cùng của n hàng đầu tiên được xác định
Ví dụ: liệt kê 3 hoá đơn có cước phí cao nhất
SELECT top 3 with ties OrderID, Freight from Orders order by Freight DESC
Nếu hàng thứ tư có cùng cước phí (freight) với hàng thứ ba trong bảng kết quả thì sao???
Trang 14Thứ tự ưu tiên : NOT, AND, OR
Các toán tử số học có độ ưu tiên cao hơn
toán tử luận lý
Các toán tử được bao trong cặp ngoặc đơn
sẽ có độ ưu tiên cao hơn tất cả các toán tử khác
Ví dụ: 3+10/5 + 8 % 3*16-10/2 ???
Trang 15WHERE (Type ='mod_cook' OR
Type='business') AND Price>$10
Trang 16Các toán tử so sánh (Comparison operators)
!< Not less than
>= Greater than or equal to
<= Less than or equal to
Trang 17Toán tử miền - Range
Operators
value BETWEEN value1 AND value2
Toán tử miền BETWEEN AND được dùng để đánh giá xem value có nằm trong miền giá trị
từ value1 đến value2 hay không?
Ví dụ 1:
SELECT Title from Titles
WHERE price BETWEEN 2000 AND 5000
Ví dụ 2:
SELECT Title from Titles
WHERE (price >= 2000) AND (price <=5000)
Trang 18Toán tử liệt kê - List
Operators
Value IN (value1, value2, value3,…)
Toán tử IN dùng để xác định xem value có
phải là 1 trong các giá trị nằm trong danh sách các giá trị value1, value2, value3,…
Trang 19Ký hiệu đại diện -
Trang 20Ký hiệu đại diện - Wildcards
Trang 21where country = 'USA'
order by city, region
Trang 22Hàm tập hợp - Aggregate functions
Được dùng để tổng kết các giá trị của
1 cột hay 1 nhóm cột bên trong 1 bảng
và cho kết quả là 1 giá trị đơn.
Trang 23Hàm tập hợp - Aggregate functions
Trang 25Chuyển đổi kiểu dữ liệu
Data type conversions
Việc đổi kiểu dữ liệu là cần thiết khi:
Cần chuyển dữ liệu từ nơi này sang nơi khác
mà nguồn và đích không cùng kiểu nhau.
So sánh dữ liệu khác loại nhau
Các kiểu chuyển đổi:
1 Chuyển đổi ngầm định (Implicit conversions)
2 Chuyển đổi tường minh (Explicit conversions)
Trang 26Chuyển đổi kiểu dữ liệu
Data type conversions
Chuyển đổi ngầm định - xảy ra tự động Hầu hết việc chuyển đổi dữ liệu này xảy ra mà
không cần sự can thiệp của người dùng
Chuyển đổi tường minh - yêu cầu phải có
lệnh chuyển đổi
Không cho phép chuyển đổi - một số kiểu dữ liệu không cho phép chuyển đổi giữa chúng
Trang 27Lệnh CAST và CONVERT
CAST và CONVERT được dùng để chuyển đổi tường minh từ 1 kiểu dữ liệu này sang kiểu dữ liệu khác Chúng được dùng khi chuyển đổi ngầm định không được hỗ trợ
Lệnh CAST có cú pháp dễ dùng nhất nhưng cũng có nhiều hạn chế hơn
Lệnh CONVERT thì linh hoạt hợn nhưng
không tích hợp với SQL-92
Trang 28Lệnh CAST và CONVERT
CAST (expression AS data_type)
CONVERT(data_type[(length)], expression [,style])
◦ Data_type : kiểu dữ liệu đích
◦ Expression : biểu thức cần chuyển đổi kiểu
◦ Style: tham số tuỳ chọn dùng để xác định các định dạng khác nhau khi dữ liệu datetime hay smalldatetime được chuyển đổi thành dạng ký tự.
Trang 29Một số giá trị của style
Khi chuyển đổi từ datetime/smalldatetime thành kiểu character
Năm có 2 chữ
số Two-digit
year
Năm có 4 chữ số Four-digit year
Trang 30V í dụ
Dùng lệnh CAST
USE pubs
SELECT * FROM titles WHERE
CAST(ytd_sales AS char(20)) LIKE '3%'
Use CONVERT
USE pubs
SELECT * FROM titles WHERE
CONVERT(char(20), ytd_sales) LIKE '3%'
Trang 31Ví dụ chuyển đổi ngày giờ
Trang 32Date and time functions
DATEDIFF (datepart, date1,
date2) Tính hiệu giữa 2 thành phần ngày
DATENAME (datepart, date) Trả về 1 thành phần của
ngày dưới dạng chuỗi
DATEPART (datepart, date) Trả về 1 thành phần của
ngày dưới dạng số nguyên GETDATE () Trả về ngày giờ hiện hành
Trang 33Thành phần ngày (Datepart) và các ký hiệu
Trang 34Ví dụ các hàm ngày giờ
SELECT OrderID,DATEDIFF (yy, Ord_Date,
getdate()) FROM Sales
Liệt kê các hoá đơn và cho biết hoá đơn đó đã bán được bao nhiêu năm
SELECT Title_Id, Month = DATENAME (mm,
PubDate), Year =DATENAME (yy,PubDate)
FROM Titles
Liệt kê mã sách cùng với tháng, năm đã xuất bản sách đó
Trang 35Ví dụ các hàm ngày giờ
SELECT cCollegeCode,
RecruitmentStartDate, 'Proposed Deadline' =
DATEADD(dd, 10,
dRecruitmentStartDate) FROM CampusRecruitment
Danh sách mã các trường cao đẳng đang được xét tuyển dụng cùng với
Trang 36Mathematical functions
CEILING
Trang 37Mathematical functions
Trang 39String functions
Trang 40String functions
Trang 41String functions
Trang 42String functions
Trang 43SELECT STR
(123.45,6,2)
Returns '123.45‘.It converts numeric data to character data where the length is the total length, including the decimal point, the sign, the digits, and the paces and the decimal is the number of places to the right of the decimal point.
Trang 44Ví dụ về chuỗi
Dùng các hàm về chuỗi tách ‘Nguyễn Văn Hai’ thành họ, họ lót và tên
SELECT LEFT(‘Nguyễn Văn Hai’,5) ‘Nguyễn’
SELECT SUBSTRING(‘Nguyễn Văn Hai’,8,3)
‘Văn’
SELECT RIGHT(‘Nguyễn Văn Hai’,3) ‘Hai’
Trang 46System functions
Trang 47System functions
Trang 50Ví dụ các hàm gộp trong lệnh select
SELECT sum(Freight) from dbo.Orders
Tính tổng cước phí chuyên chở của tất cả hoá đơn
SELECT count(OrderID) from dbo.Orders
Đếm số hoá đơn
SELECT
SUM(UnitPrice*Quantity*(1-Discount)) FROM dbo.[Order Details]
Tính doanh số bán hàng
Trang 51Nhóm dữ liệu trong bảng kết quả
Những mệnh đề dùng để nhóm dữ trong bảng kết quả:
GROUP BY: tổng hợp bảng kết quả theo nhóm bằng cách dùng các hàm gộp
COMPUTE và COMPUTE BY: mệnh đề COMPUTE trong lệnh SELECT được dùng để phát ra các hàng tổng hợp bằng cách dùng hàm gộp Mệnh đề COMPUTE BY được dùng
để tổng hợp thêm các hàng kết quả theo cột
Trang 52Mệnh đề Group by
[ GROUP BY [ ALL ] group_by_expression [ , n
] [ WITH { CUBE | ROLLUP } ] ]
ALL: bảng kết quả sẽ chứa tất cả các nhóm kể
cả những nhóm không thỏa mãn điều kiện lọc trong trong mệnh đề WHERE, những nhóm
không thoả điều kiện sẽ có giá trị null Không thể dùng ALL với các toán tử CUBE hay
ROLLUP
group_by_expression: biểu thức dùng để xác
định cột được nhóm
Trang 53Ví dụ
SELECT Type, Advance = SUM (Advance) FROM Titles WHERE Type IN ('business', 'mod_cook', 'trad_cook') GROUP BY Type
Trang 54Ví dụ
SELECT Type, Advance = SUM (Advance) FROM Titles WHERE Type IN ('business', 'mod_cook', 'trad_cook') GROUP BY ALL Type
Trang 55Ví dụ
SELECT Type,'Publisher ID' = Pub_Id,
Average = AVG(Price)
FROM Titles
GROUP BY Type, Pub_Id
Trang 56Toán tử CUBE
Toán tử cube được dùng để phân tích theo nhiều chiều Mỗi cột trong mệnh đề GROUP BY được
xem là 1 chiều (dimension), bảng kết qủa sẽ
chứa tất cả các tổ hợp giá trị có thể có theo
nhiều chiều.
Mệnh đề SELECT nên chứa tất cả các cột có
trong biểu thức GROUP BY
Trang 57Ví dụ với toán tử cube
Type Publisher ID Average
Trang 58Toán tử ROLLUP
Ngoài những hàng thông thường được cung
cấp bởi GROUP BY, các hàng tổng hợp sẽ được đưa vào bộ kết quả Các nhóm được tổng hợp theo thứ tự phân cấp, từ mức thấp nhất đến mức cao nhất Phân cấp nhóm được xác định theo thứ tự các cột được xác định trong mệnh
đề GROUP BY
Ví dụ: SELECT Type,Pub_id, 'Sum' =
sum(Ytd_Sales) FROM Titles
GROUP BY Type,Pub_id with rollup
Trang 61Mệnh đề COMPUTE
Mệnh đề COMPUTE để phát ra các hàng tổng hợp
[BY column_name [, column_name] ]
Trang 62COMPUTE & COMPUTE BY
Khi COMPUTE BY được dùng: có 2 bộ kết quả cho mỗi nhóm
◦ Tập hợp các hàng chi tiết cho mỗi nhóm
◦ Một hàng chứa tổng con (subtotal) cho
mỗinhóm
Khi COMPUTE được dùng, có 2 bộ kết quả:
◦ Bộ kết quả chứa các hàng chi tiết của mỗi nhóm
◦ Bộ kết quả thứ hai chỉ có 1 hàng chứa giá trị tổng (total) của hàm tổng hợp.
Trang 63Ví dụ
USE pubs
SELECT type, price, advance
FROM titles ORDER BY type
COMPUTE SUM(price), SUM(advance)
SELECT type, price, advance
FROM titles ORDER BY type
COMPUTE SUM(price), avg(price),
SUM(advance) by type
Trang 64Một số quy luật khi dùng Compute và
compute by
Tất cả các cột được dùng trong mệnh đề
COMPUTE phải có mặt trong mệnh đề
SELECT
Khi mệnh đề COMPUTE BY được dùng thì
ORDER BY cũng phải được dùng tên cột hay biểu thức
Các hàm tổng hợp khác nhau có thể được dùng cho cùng một cột trong mệnh đề
COMPUTE BY
Trang 65Một số quy luật khi dùng Compute và
Trang 66Một số quy luật khi dùng Compute và
compute by
Ví dụ: khi dùng Mệnh đề ORDER BY
ORDER BY Type, Price, Advance
Thì các mệnh đề COMPUTE BY sau đều hợp
Trang 67Ví dụ của mệnh đề Compute
SELECT Type, Advance
FROM TitlesORDER BY TypeCOMPUTE AVG (advance) BY Type
Trang 68So sánh COMPUTE và GROUP BY
Mệnh đề GROUP BY tạo ra chỉ một hàng cho mỗi nhóm Mệnh đề SELECT chỉ chứa các cột dùng để nhóm và các hàm tổng hợp
Mệnh đề COMPUTE tạo ra nhiều bộ kết quả:
◦ Một dạng của bộ kết quả chứa tất cả các hàng của mỗi nhóm
◦ Một dạng khác chứa giá trị tổng hợp cho mỗi nhóm hay tổng chung cho cả lệnh.
◦ Mệnh đề Select chỉ chứa các biểu thức thay vì các cột dùng để nhóm hay các hàm tổng hợp
Trang 69GROUP BY và HAVING
Có thể hạn chế các nhóm trong bảng kết quả bằng mệnh đề HAVING
Chỉ sau khi dữ liệu đã được nhóm và tổng hợp , điều kiện trong mệnh đề HAVING mới được
áp dụng Chỉ các nhóm thoả mãn điều kiện mới xuất hiện trong bảng kết quả.
Không thể dùng 1 cột mà nó không tham gia vào hàm gộp của mệnh đề SELECT hay của mệnh mệnh đề GROUP BY
Trang 70◦ Sau đó mệnh đề HAVING sẽ được áp dụng cho các nhóm Chỉ những nhóm thoả mãn điều kiện HAVING mới được xuất ra bảng kết quả
Trang 71Sử dụng mệnh đề HAVING và WHERE
SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10