Câu lệnh SELECT nâng cao kết hợp cùng các hàm tổng hợp dữ liệu
- 27-05-2022
- Toanngo92
- 0 Comments
Mục lục
Các hàm tổng hợp dữ liệu
Đôi khi, các nhà phát triển cũng có thể yêu cầu thực hiện phân tích trên các hàng, chẳng hạn như đếm hàng, đáp ứng các tiêu chí cụ thể hoặc tóm tắt tổng doanh số cho tất cả các đơn đặt hàng. Hàm tổng hợp cho phép thực hiện nó.
Vì các hàm tổng hợp trả về một giá trị duy nhất, chúng có thể được sử dụng trong các trạng thái CHỌN trong đó một biểu thức được sử dụng, chẳng hạn như mệnh đề SELECT, HAVING và ORDER BY. Các hàm tổng hợp bỏ qua NULLS, ngoại trừ khi sử dụng COUNT (*).
Các hàm tổng hợp trong danh sách SELECT sẽ không có tên cột, có thể muốn sử dụng mệnh đề AS để đặt tên cột.
Hàm tổng hợp là một mệnh đề SELECT hoạt động trên tất cả các hàng được chuyển đến giai đoạn SELECT. Nếu không có mệnh đề GROUP BY, tất cả các hàng sẽ được tóm tắt.
Một số hàm tổng hợp:
Tên hàm | Cú pháp | Mô tả |
AVG | AVG(<expression>) | Tính tooán trung bình tất cả giá trị số không NULL trong cột |
COUNT hoặc COUNT_BIG | COUNT(*) hoặc COUNT(<expression>) | Khi (*) được sử dụng, hàm này đếm tất cả các hàng, bao gồm những hàng có NULL. Hàm đếm tất cả các hàng, bao gồm những hàng có NULL. Hàm trả về số lượng hàng không phải NULL cho cột khi một cột được chỉ định là . Giá trị trả về của hàm COUNT là int. Giá trị trả về của COUNT_BIG là big_int |
MAX | MAX(<expression>) | Trả về số lớn nhất, ngày / giờ gần đây nhất hoặc chuỗi xuất hiện gần đây nhất. |
MIN | MIN(<expression>) | Trả về số nhỏ nhất, ngày giờ xa nhất hoặc chuỗi xuất hiện đầu tiên |
SUM | SUM(<expression>) | Tính tổng tất cả các giá trị không NULL trong cột.. |
Ví dụ:
SELECT AVG([UnitPrice]) AS AvgUnitPrice, MIN([OrderQty]) AS MinQty, MAX([UnitPriceDiscount]) AS MaxDiscount FROM Sales.SalesOrderDetail;
Khi sử dụng tổng hợp trong mệnh đề SELECT, tất cả các cột khác biệt trong danh sách SELECT phải được sử dụng làm đầu vào cho một hàm tổng hợp hoặc phải được tham chiếu trong mệnh đề GROUP BY. Không thành công, sẽ có lỗi xảy ra.
Ví dụ truy vấn sẽ trả về lỗi:
SELECT SalesOrderID,AVG(UnitPrice) AS AvgPrice FROM Sales.SalesOrderDetail;
Lỗi trả ra:
Column 'Sales.SalesOrderDetail.SalesOrderID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Để fix lỗi này, chỉ cần bỏ cột SalesOrderID trong câu SELECT.
Bên cạnh việc sử dụng các hàm tổng hợp với dữ liệu số, có thể sử dụng với dữ liệu date, time, character.
Ví dụ sử dụng MIN và MAX để lấy ra orderdate gần nhất và xa nhất
SELECT MIN(OrderDate) AS Earliest, MAX(OrderDate) AS Lastest FROM Sales.SalesOrderHeader
Tổng hợp không gian
SQL Server cung cấp một số phương pháp giúp tổng hợp hai mục dữ liệu hình học hoặc địa lý riêng lẻ.
Phương thức | Mô tả |
STUnion | Trả về một đối tượng đại diện cho sự kết hợp của một đối tượng hình học / địa lý với một đối tượng hình học / địa lý khác. |
STIntersection | Trả về một đối tượng đại diện cho giaođiểm giữa một đối tượng hình học / địa lý với một đối tượng hình học / địa lý khác |
STConvexHull | Trả về một aobject đại diện cho phần lồi của một đối tượng hình học / địa lý. Một tập hợp các điểm được gọi là lồi nếu với hai điểm bất kỳ, toàn bộ đoạn được chứa trong tập hợp đó. Bao lồi của một tập hợp các điểm là tập lồi nhỏ nhất chứa tập hợp. Đối với bất kỳ tập hợp điểm nào đã cho, chỉ có một vỏ lồi. |
Ví dụ:
SELECT geometry::Point(251,1,4326).STUnion(geometry::Point(252,2,4236));
Ví dụ 2:
DECLARE @City1 geography
SET @City1=geography::STPolyFromText('POLYGON((175.3 -41.5,183.3 -37.9,172.8 -34.6,175.3 -41.5))',4326)
DECLARE @City2 geography
SET @City2=geography::STPolyFromText('POLYGON((169.3 -46.6,174.3 -41.6,172.5 -40.7,166.3 -45.8,169.3 -46.6))',4326)
DECLARE @CombinedCity geography=@City1.STUnion(@city2)
SELECT @CombinedCity
Một số hàm tổng hợp không gian
Union Aggregate
Nó thực hiện phép toán hợp nhất trên một tập hợp các đối tượng hình học. Nó kết hợp nhiều đối tượng không gian thành một đối tượng không gian duy nhất, loại bỏ ranh giới bên trong, nếu có.
Ví dụ:
SELECT Geography::UnionAggregate (SpatialLocation) AS AVGLocation
FROM Person.Address
WHERE City='London';
Envelope Aggregate
Ví dụ:
SELECT Geography::EnvelopeAggregate(SpatialLocation) AS Location FROM Person.Address WHERE City='London'
Convex Hull Aggregate
Ví dụ:
SELECT Geography::ConvexHullAggregate(SpatialLocation) AS Location FROM Person.Address
WHERE City='London'
Bài tập
Tạo database QuanlyNhanKhau
Tạo bảng QuanHuyen
Column | Datatype | Constraint | Description |
MaQH | INT IDENTITY(1,1) | NOT NULL | Mã quận huyện |
TenQH | NVARCHAR(100) | Tên quận huyện |
Tạo bảng DuongPho
Column | Datatype | Constraint | Description |
DuongID | INT | NOT NULL | Mã đươờng |
MaQH | INT | NOT NULL | Mã quận huyện |
TenDuong | NVARCHAR(MAX) | NOT NULL | Tên Đường |
NgayDuyet | DATETIME | NOT NULL | Ngày duyệt tên |
Tạo bảng NhaTrenPho
Column | Datatype | Constraint | Description |
NhaID | INT | NOT NULL | Mã nhà |
DuongID | INT | NOT NULL | Mã đường |
ChuHo | NVARCHAR(50) | NULL | Chủ hộ |
DienTich | MONEY | NULL | Diện tích |
SoNhanKhau | int | số nhân khẩu |
Tạo ràng buộc cho các bảng:
Primary key
Constraint Name | Table | Applied Column |
PK_QuanHuyen | QuanHuyen | MaQH |
PK_DuongPho | DuongPho | DuongID |
PK_NhaTrenPho | NhaTrenPho | NhaID |
Foreign key
Constraint Name | Referencing Table | Foreign Key column | Referrenced Table | Referenced Column |
FK_NhaTrenPho_DuongPho | NhaTrenPho | DuongID | DuongPho | DuongID |
FK_DuongPho_QuanHuyen | DuongPho | MaQH | QuanHuyen | MaQH |
Ràng buộc CHECK:
Constraint Name | Table | Applied Columns | Data Annomalies |
CK_DuongPho_NgayDuyenTen | DuongPho | NgayDuyetTen | NgayDuyetTen > 02/09/1945 và NgayDuyetTen > current_date |
Nhập lệu vào bảng thông tin sau:
Lưu ý, khi nhập dữ liệu datetime, có thể sử dụng chuỗi 'yyyy-mm-dd' hoặc CONVERT(DATETIME,CAST('dd/mm/yyy' AS DATETIME),113)
QuanHuyen:
MaQH | TenQH |
1 | Ba Đình |
2 | Hoàng Mai |
DuongPho:
DuongId | MaQH | TenDuong | NgayDuyetTen(dd/mm/yyyy) |
1 | 1 | Trường Chinh | 19/10/1946 |
2 | 1 | Tây Sơn | 30/12/1998 |
3 | 2 | Chùa Bộc | 21/09/1975 |
NhaTrenPho:
NhaID | DuongID | ChuHo | DienTich | SoNhanKhau |
1 | 1 | Toàn Ngô Vĩnh | 100 | 4 |
2 | 1 | Lê Văn A | 20 | 12 |
3 | 2 | Nguyễn Thị B | 40 | 1 |
Sửa bảng (ALTER TABLE) DuongPho, cột [TenDuong] từ 'Chùa Bộc' thành 'Thái Hà'
Bài tập ôn luyện 2:
1. Tạo một file có tên Lab3.sql.
2. Tạo một cơ sở dữ liệu đặt tên là DBLab3.
3. Tạo 4 bảng sau đó chèn dữ liệu vào theo các bước sau:
- Bước 1: Tạo 4 bảng.
- Bước 2: Áp đặt các ràng buộc (constraint) khóa chính và khóa ngoại lên các bảng như mô tả dưới đây (chú ý: sử dụng câu lệnh alter table để đặt các ràng buộc).
- Bước 3: Chèn dữ liệu vào các bảng.
Customer (Lưu mã(cID), tên(cName), tuổi(cAge) và giới tính(cGender) của khách hàng).
cID (int primary key) |
cName (VarChar (25)) |
cAge (tinyint) |
cGender (bit) |
1 |
Elisha Cuthbert |
26 |
0 |
2 |
Cristiano Ronaldo |
23 |
1 |
3 |
Gemma Atkinson |
24 |
0 |
4 |
Maria Sharapova |
22 |
Null |
Orders (Lưu mã hóa đơn(oID), mã khách hàng(cID) và ngày khởi tạo hóa đơn(oDate)).
oID (int primary key) |
cID (int) (foreign key tham chiếu tới cID của Customer) |
oDate (Date) |
1 |
1 |
3/21/2008 |
2 |
2 |
3/23/2008 |
3 |
1 |
3/16/2008 |
Product (Lưu mã(pID), tên(pName) và giá của các sản phẩm(pPrice)).
pID (int primary key) |
pName (varchar(25)) |
pPrice (int) |
1 |
Washing Machine |
3 |
2 |
Fridge |
5 |
3 |
Air Conditioner |
7 |
4 |
Electric Fan |
1 |
5 |
Electric Cooker |
2 |
OrderDetail (Lưu mã hóa đơn(oID), mã sản phẩm(pID) và số lượng sản phẩm(odQTY) trong hóa đơn).
oID (int) (foreign key tham chiếu tới oID của Order) |
pID (int) (foreign key tham chiếu tới pID của Product) |
odQTY (int)
|
1 |
1 |
3 |
1 |
3 |
7 |
1 |
4 |
2 |
2 |
1 |
1 |
3 |
1 |
8 |
2 |
5 |
4 |
2 |
3 |
3 |
4. Hiển thị danh sách các hóa đơn (chú ý: danh sách phải được sắp xếp theo trường oDate).
5. Hiển thị danh sách khách hàng gồm tên và ký tự đầu tiên của tên.
6. Hiển thị những sản phẩm có giá cao nhất.
7. Hiển thị những sản phẩm có giá thấp nhất.
8. Hiển thị danh sách sản phẩm gồm tên và giá kết hợp trong 1 cột như sau:
‘Price of ’ + pName + ‘ is ’ + pPrice.
9. Tạo một bảng đặt tên là ‘Top3Product’ , bảng này chứa 3 sản phẩm có giá cao nhất gồm tên và giá của sản phẩm.
Gợi ý: Bạn nên dùng câu lệnh SELECT với INTO để tạo bảng mới.
10. Hiển thị những khách hàng mà tên có độ dài 15 ký tự.
11. Hiển thị tất cả các sản phẩm có chuỗi ‘Electric’ ở trong pName.
12. Hiển thị ngày giờ hiện tại và ngày giờ hiện tại cộng thêm 5000 phút.
13. Xóa tất cả các khóa ngoại.
14. Xóa tất cả các khóa chính.
15. Xóa tất cả các bảng.
16. Xóa cơ sở dữ liệu.
Bài tập ôn luyện 3:
1. Tạo một file SQL có tên Lab4.sql.
2. Tạo một Cơ sở dữ liệu (CSDL) có tên DBLab4.
3. Tạo 03 bảng như sau:
- Bảng Customers lưu trữ thông tin về khách hàng gồm các cột MaKhach (PK), Ten, SoDienThoai.
- Bảng Items lưu trữ thông tin về hàng hóa gồm các cột MaHang (PK), Ten, SoLuong, DonGia.
- Bảng CustomerItem lưu trữ thông tin về những sản phẩm đã được bán mua gồm các cột MaKhach, MaHang, SoLuongMua, trong đó PK nằm trên 2 cột MaKhach và MaHang, FK1 nằm trên cột MaKhach, FK2 nằm trên cột MaHang.
4. Nhập các thông tin sau vào bảng Items:
Tên sản phẩm |
Số lượng |
Đơn giá (nghìn đồng) |
---|---|---|
Tu lanh |
5 |
3500 |
Ti vi |
2 |
3000 |
Dieu hoa |
1 |
8000 |
Quat da |
5 |
1700 |
May giat |
3 |
5000 |
5. Tách lọc và nhập thông tin sau vào hai bảng Customers và CustomerItem:
Tên khách hàng |
Số điện thoại |
Hàng đã mua |
Số lượng mua |
---|---|---|---|
Dinh Truong Son |
1234567 |
Tu lanh |
4 |
Dinh Truong Son |
1234567 |
May giat |
1 |
Mai Thanh Minh |
1357999 |
Ti vi |
1 |
Nguyen Hong Ha |
2468888 |
Dieu hoa |
1 |
Nguyen Hong Ha |
2468888 |
Tu lanh |
1 |
6. Hiển thị tổng số tiền mà cửa hàng đã thu được từ các khách hàng trên.
7. Hiển thị tên, số tiền đã mua của người khách hàng đã trả tiền cho cửa hàng nhiều nhất.
8. Kiểm tra xem người khách có số điên thoại 2468888 có mua mặt hàng Tủ lạnh không, nếu có mua thì hiện ra dòng chữ 'Có mua', ngược lại hiện ra dòng chữ 'Không mua'.
9. Tính tổng số hàng hóa và tổng tiền còn lại trong kho (số còn lại bằng tổng số trừ đi số đã bán).
10. Hiển thị danh sách 3 mặt hàng bán chạy nhất(số lượng bán nhiều nhất).
11. Hiển thị tất cả các mặt hàng mà chưa bán được một sản phẩm nào.
12. Hiển thị danh sách những người mua nhiều hơn một mặt hàng.
13. Hiển thị danh sách những người mua hàng có số lượng nhiều hơn một cái.
14. Hiển thị tên khách hàng, tổng số tiền mua hàng của từng khách và hiển thị cột Level với giá trị điền vào cột này theo tiêu chí sau: Nếu tổng số tiền mua hàng của từng khách < 5000 thì điền giá trị là 'Level1', từ 5000 đến < 10000 thì điền giá trị là 'Level2', >=10000 thì điền giá trị là 'V.I.P'.
Bài tập ôn luyện 4:
1. Tạo một file có tên Lab5.sql.
2. Tạo một CSDL có tên DBLab5.
3. Tạo ba bảng như sau (Sinh viên tự áp dụng kiểu dữ liệu cho mỗi cột cho hợp lý):
- Bảng Student(RN,Name,Age,Gender).
- Bảng Subject(sID, sName).
- Bảng StudentSubject(RN,sID,Mark,Date).
4. Đặt khóa chính (PK) cho các bảng:
- Bảng Student PK nằm trên cột RN.
- Bảng Subject PK nằm trên cột sID.
- Bảng StudentSubject PK nằm trên hai cột (RN,sID).
5. Đặt ràng buộc để trường Mark chỉ nhận các giá trị trong đoạn [0,10].
6. Đặt ràng buộc khóa ngoại giữa 2 bảng Student(RN) và StudentSubject(RN).
7. Đặt ràng buộc khóa ngoại giữa 2 bảng Subject(sID) và StudentSubject(sID).
8. Nhập dữ liệu vào bảng để thể hiện thông tin sau:
- Học viên Mỹ Linh đạt điểm 8 môn SQL vào ngày 7/28/2005.
- Học viên Đàm Vĩnh Hưng đạt điểm 3 môn LGC vào ngày 7/29/2005.
- Học viên Kim Tử Long đạt điểm 9 môn HTML vào ngày 7/31/2005.
- Học viên Tài Linh đạt điểm 5 môn SQL vào ngày 7/30/2005.
- Học viên Mỹ Lệ đạt điểm 10 môn CF vào ngày 7/19/2005.
- Học viên Ngọc Oanh đạt điểm 9 môn SQL vào ngày 7/25/2005.
9. Cập nhật giới tính cho các học viên:
- Mỹ Linh, Tài Linh, Mỹ Lệ là 0.
- Kim Tử Long là 1.
10. Nhập thêm các môn học sau vào bảng Subject: Core Java và VB.Net.
11. Hiển thị tất cả các môn học mà chưa có học viên nào nhận điểm.
12. Hiển thị danh sách tất cả các môn học, với điểm cao nhất mà học viên đạt được với môn học đó, môn nào chưa có điểm thì để trống (Null) phần điểm.
13. Hiển thị tên môn học mà có nhiều hơn một điểm.
14. Hiển thị những thông tin sau về học viên: RN, sID, Name, Age, Gender, sName, Mark, Date. Lưu ý là đối với trường Gender hiển thị Male thay cho 1, Female thay cho 0 và Unknow thay cho Null.
15. Tạo các Index trên các cột sau: Cột Name của bảng Student, cột sName của bảng Subjects, cột (RN,sID) của bảng StudentSubject.
16. Tạo một bảng tên là Top3 với các cột (RN, Name, Mark, sName, Date) với dữ liệu gồm chỉ 3 dòng có điểm cao nhất, cột Rank sẽ chứa số thứ tự từ 1 đến 3(dòng đầu tiên là 1, dòng thứ 2 là 2 và dòng thứ 3 là 3), còn cột Date sẽ nhận giá trị là ngày cập nhật thông tin.
17. Hiển thị danh sách toàn bộ các học sinh giỏi (Học sinh giỏi là những người có điểm trung bình lớn hơn 8.0 và không có điểm nào dưới 5).
18. Hiển thị danh sách toàn bộ các học sinh khá (Học sinh khá là những người có điểm trung bình lớn hơn 6.5 và chỉ có tối đa 1 điểm dưới 5, và điểm này không được dưới 3).