Truy tìm dữ liệu trong 1CSDLData retrieval
Trang 2Mục tiêu
Biết cách sử dụng các mệnh đề của lệnh SELECT để xem và tìm dữ liệu trong 1
Biết cách dùng các hàm hệ thống (T-SQL functions) để xem và khôi phục thông tin từ CSDL.
Biế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 ] ]
[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 9Mệnh đề select_list
< select_list > ::= { *
| { table_name | view_name |
table_alias }.*
| { column_name | expression} [ [ AS ] column_alias ]
| column_alias = expression } [ , n ]
column_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)
=Equal to
<>Not equal to!=Not equal to>Greater than
!>Not greater than<Less than
!<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 - Wildcards
% 1 chuỗi với số ký tự tuỳ ý
[] 1 ký tự được xác định nằm trong []
[^]Bất kỳ ký tự nào ngoại trừ các ký tự nằm trong [^]
Trang 20Ký hiệu đại diện - Wildcards
Phone link
‘212%’Tất cả số phone có mã vùng là 212Name like
‘_an’Tên có 3 ký tự với tận cùng là an như Jan, Nan, hay Tan Name like
‘[BC]one’Tên chỉ có thể là Bone hay Cone Phone like
‘[^2]12%’Tất cả các số phone với mã vùng có 3 chữ số, chữ số đầu tiên khác 2, 2 chữ số còn lại phải là 12
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
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ờ thành chuỗi
Xem thông tin các hoá đơn với ngày theo dạng dd/mm/yyyy
SELECT OrderID, CONVERT(char,OrderDate,103) FROM dbo.Order
Xem thông tin các hoá đơn với ngày theo dạng mm/dd,yy
SELECT OrderID, CONVERT(char,OrderDate,1) FROM dbo.Order
Trang 32Date and time functions
DATEADD(datepart, number, date).
Cộng 1 số vào 1 thành phần của ngày
DATEDIFF(datepart, date1,
date2)Tính hiệu giữa 2 thành phần ngàyDATENAME(datepart, date)Trả về 1 thành phần của
ngày dưới dạng chuỗiDATEPART(datepart, date)Trả về 1 thành phần của
ngày dưới dạng số nguyênGETDATE()Trả về ngày giờ hiện hành
Trang 33Thành phần ngày (Datepart) và các ký hiệu
Trang 34Liệ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 43Returns '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 45System functions
Các hàm hệ thống cung cấp cách để truy vấn các bảng hệ thống của SQL Server
Các hàm hệ thống cho phép biến đổi nhanh các thông tin hệ thống mà không cần viết lệnh truy vấn
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 Discount)) FROM dbo.[Order Details]
SUM(UnitPrice*Quantity*(1- 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
Type Advance
- business 25125.0000
-mod_cook 15000.0000trad_cook 19000.0000
Trang 54Ví dụ
SELECT Type, Advance = SUM (Advance) FROM Titles WHERE Type IN ('business', 'mod_cook', 'trad_cook') GROUP BY ALL Type
Type Advance - -
business 25125.0000mod_cook 15000.0000popular_comp NULL
psychology NULL
trad_cook 19000.0000UNDECIDED NULL
(6 row(s) affected)
Trang 55Ví dụ
SELECT Type,'Publisher ID' = Pub_Id,Average = AVG(Price)
FROM Titles
GROUP BY Type, Pub_Id
Trang 56Mệ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 - - -
business 0736 2.9900business 1389 17.3100
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 đề
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à compute by
Cho phép nhiều hơn 1 cột hay biểu thức có thể được dùng cho mệnh đề COMPUTE BY.
Thứ tự của các cột hay biểu thức được dùng trong mệnh đề COMPUTE BY phải phù hợp với thứ tự của các cột hay biểu thức được dùng trong mệnh đề ORDER BY.
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 lệ :
COMPUTE AVG(Advance), AVG(Price) BY Type, Price, Advance
COMPUTE AVG(Advance), AVG(Price) BY Type, Price
COMPUTE AVG(Advance), AVG(Price) 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◦Mệnh đề WHERE được áp dụng trước cho các
hàng trong bảng được truy vấn Chỉ những hàng nào thoả mãn điều kiện của mệnh đề WHERE mới được nhóm dữ liệu.
◦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