Sử dụng các truy vấn nâng cao để so sánh dữ liệu Jessica Cao, Chuyên viên phát triển các công cụ đào tạo, IBM Bruce Creighton, Chuyên viên lập kế hoạch các phần kỹ năng, IBM Pat Moffatt, Giám đốc Chương trình quản lý thông tin, Sáng kiến học đường, IBM Tóm tắt: Hướng dẫn này mô tả các truy vấn để so sánh dữ liệu trong một cơ sở dữ liệu IBM® DB2®. Điều này được thực hiện bằng các biểu thức CASE hoặc các truy vấn con. ...
Hướng dẫn SQL & XQuery cho IBM DB2, Phần 5: So sánh liệu Sử dụng truy vấn nâng cao để so sánh liệu Jessica Cao, Chuyên viên phát triển công cụ đào tạo, IBM Bruce Creighton, Chuyên viên lập kế hoạch phần kỹ năng, IBM Pat Moffatt, Giám đốc Chương trình quản lý thơng tin, Sáng kiến học đường, IBM Tóm tắt: Hướng dẫn mô tả truy vấn để so sánh liệu sở liệu IBM® DB2® Điều thực biểu thức CASE truy vấn Hướng dẫn Phần loạt hướng dẫn SQL & XQuery cho IBM DB2 Trước bạn bắt đầu Về loạt Loạt hướng dẫn dạy chủ đề SQL từ đến nâng cao chủ đề XQuery Nó cách diễn đạt câu hỏi nghiệp vụ thường gặp truy vấn sở liệu sử dụng câu truy vấn SQL hay câu truy vấn XQuery Những người phát triển ứng dụng người quản trị sở liệu sử dụng hướng dẫn để nâng cao kỹ truy vấn sở liệu Các thành viên tham gia sáng kiến học đường IBM sử dụng loạt hướng dẫn phần chương trình giảng dạy sở liệu họ Tất ví dụ dựa Aroma, sở liệu mẫu chứa liệu doanh thu sản phẩm cà phê chè bán cửa hàng khắp nước Mỹ Mỗi ví dụ gồm có ba phần: Một câu hỏi kinh doanh dạng ngôn ngữ thường ngày Một nhiều ví dụ truy vấn , biểu diễn SQL hay Xquery Một bảng kết trả từ sở liệu Hướng dẫn thiết kế phép học viên học tập ngôn ngữ SQL XQuery Cũng học khác, việc bổ sung thêm tập thực hành quan trọng Dữ liệu định nghĩa bảng tạo điều kiện thuận lợi cho tập thực hành Đối với sinh viên sử dụng tài liệu phần khoá học, nhận từ thầy hướng dẫn dẫn để kết nối tới sở liệu Aroma tìm hiểu khác biệt hướng dẫn cài đặt máy cục Hướng dẫn viết cho DB2 Express-C UNIX®, Linux® Windows® (trước gọi Viper) Về hướng dẫn Hướng dẫn thảo luận truy vấn dùng để so sánh liệu sở liệu DB2 IBM Nó bắt đầu cách minh họa vấn đề mà người viết truy vấn phải đối phó: cách sử dụng SQL để trả bảng tính hay báo cáo "tổng hợp" tập hợp kết tiêu chuẩn, xếp theo thứ tự thẳng đứng khó đọc Vấn đề giải biểu thức CASE truy vấn phụ Giải pháp CASE, giới thiệu đầu tiên, cách đơn giản ngắn gọn để so sánh nhóm giá trị tương tự Tiếp theo trình bày vài ví dụ mệnh đề FROM truy vấn phụ danh sách chọn lựa Các truy vấn phụ có thêm giá trị chỗ vừa so sánh liệu từ nhóm khác vừa gồm tính tốn giá trị so sánh, ví dụ phần trăm đóng góp thời hạn cho Hướng dẫn mô tả truy vấn phụ tuyên bố điều kiện mệnh đề WHERE, có ích cho truy vấn so sánh đơn giản Phần cuối mơ tả thuộc tính ALL, EXISTS, SOME ANY Các thuộc tínhnày dùng để biểu diễn điều kiện kết truy vấn phụ Kết nối tới sở liệu Bạn cần kết nối tới sở liệu trước sử dụng câu lệnh SQL để truy vấn hay xử lý liệu Lệnh CONNECT kết hợp kết nối sở liệu với tên người sử dụng Thông qua người hướng dẫn tìm tên sở liệu bạn cần nối tới Đối với loạt này, tên sở liệu aromadb Để kết nối tới sở liệu aromadb, gõ lệnh sau vào xử lý dòng lệnh DB2: CONNECT TO aromadb USER userid USING password Thay "userid" "password" số ID mật người sử dụng mà bạn nhận từ thầy hướng dẫn Nếu máy khơng hỏi userid password cần gõ vào lệnh sau đây: CONNECT TO aromadb Thông điệp sau báo cho bạn biết tạo kết nối thành công: Database Connection Information Database server = DB2/NT 9.0.0 SQL authorization ID = USERID Local database alias = AROMADB Khi kết nối được, bạn bắt đầu sử dụng sở liệu So sánh liệu câu hỏi SQL Câu hỏi So sánh doanh thu cà phê đóng gói cửa hàng vùng phía Tây năm 2004 sao? Ví dụ truy vấn SELECT store_name, prod_name, SUM(dollars) AS sales FROM aroma.market a, aroma.store b, aroma.period c, aroma.product d, aroma.class e, aroma.sales f WHERE a.mktkey = b.mktkey AND b.storekey = f.storekey AND c.perkey = f.perkey AND d.classkey = e.classkey AND d.classkey = f.classkey AND d.prodkey = f.prodkey AND region like 'West%' AND year = 2004 AND class_type = 'Pkg_coffee' GROUP BY store_name, prod_name ORDER BY store_name, prod_name; Kết STORE_NAME PROD_NAME SALES Beaches Brew Aroma Roma 3483.50 Beaches Brew Cafe Au Lait 3129.50 Beaches Brew Colombiano 2298.25 Beaches Brew Demitasse Ms 4529.25 Beaches Brew Expresso XO 4132.75 Beaches Brew La Antigua 4219.75 Beaches Brew Lotta Latte 3468.00 Beaches Brew NA Lite 4771.00 Beaches Brew Veracruzano 4443.00 Beaches Brew Xalapa Lapa 4304.00 Cupertino Coffee Supply Aroma Roma 4491.00 Cupertino Coffee Supply Cafe Au Lait 4375.50 Cupertino Coffee Supply Colombiano 2653.50 Cupertino Coffee Supply Demitasse Ms 3936.50 Cupertino Coffee Supply Expresso XO 4689.25 Cupertino Coffee Supply La Antigua 2932.00 Cupertino Coffee Supply Lotta Latte 5146.00 Cupertino Coffee Supply NA Lite 4026.00 Cupertino Coffee Supply Veracruzano 3285.00 Cupertino Coffee Supply Xalapa Lapa 5784.00 Instant Coffee Aroma Roma 3485.25 Instant Coffee Cafe Au Lait 3599.50 Instant Coffee Colombiano 3321.75 Instant Coffee Demitasse Ms 5422.25 Instant Coffee Expresso XO 2851.00 Instant Coffee La Antigua 2937.25 Instant Coffee Lotta Latte 4783.50 Instant Coffee NA Lite 3740.00 Instant Coffee Veracruzano 4712.00 Instant Coffee Xalapa Lapa 3698.00 Một truy vấn so sánh đơn giản Bạn liệt kê doanh thu nhóm sản phẩm cửa hàng cụ thể lệnh SELECT đơn giản, định dạng bảng kết làm cho giá trị khó so sánh Ví dụ, tập hợp kết phần cho thấy cà phê La Antigua bán vài cửa hàng vùng phía tây, số khó tách Loại liệu dễ so sánh nhiều định dạng bảng tính Có hai cách để tạo báo cáo bảng tính, hay báo cáo "tổng hợp": sử dụng biểu thức CASE hay truy vấn phụ Các ví dụ tiếp sau hướng dẫn minh họa hai phương pháp viết truy vấn so sánh Về truy vấn Ví dụ truy vấn trả số doanh thu năm 2004 sản phẩm cà phê đóng gói bán cửa hàng vùng phía tây, định dạng liệu kết làm cho trở nên khó so sánh số theo sản phẩm, theo cửa hàng với Sử dụng biểu thức CASE Câu hỏi So sánh doanh thu cà phê đóng gói cửa hàng vùng phía Tây năm 2004 nào? Ví dụ truy vấn SELECT prod_name, SUM(CASE WHEN store_name = 'Beaches Brew' then dollars else end) AS Beaches, SUM(CASE WHEN store_name = 'Cupertino Coffee Supply' then dollars else end) AS Cupertino, SUM(CASE WHEN store_name = 'Roasters, Los Gatos' then dollars else end) AS RoastLG, SUM(CASE WHEN store_name = 'San Jose Roasting Company' then dollars else end) AS SJRoastCo, SUM(CASE WHEN store_name = 'Java Judy''s' then dollars else end) AS JavaJudy, SUM(CASE WHEN store_name = 'Instant Coffee' then dollars else end) AS Instant FROM aroma.market a, aroma.store b, aroma.period c, aroma.product d, aroma.class e, aroma.sales f WHERE a.mktkey = b.mktkey AND b.storekey = f.storekey AND c.perkey = f.perkey AND d.classkey = e.classkey AND d.classkey = f.classkey AND d.prodkey = f.prodkey AND region LIKE 'West%' AND year = 2004 AND class_type = 'Pkg_coffee' GROUP BY prod_name ORDER BY prod_name; Kết PROD_NAMEBEACHESCUPERTINOROASTLGSJROASTCOJAVAJUDYINSTANT Aroma Roma 3483.50 4491.00 4602.00 4399.25 3748.25 3485.25 Cafe Au Lait 3129.50 4375.50 4199.00 3620.00 4864.50 3599.50 Colombiano 2298.25 2653.50 4205.00 3530.75 3509.00 3321.75 Demitasse Ms 4529.25 3936.50 4347.75 5699.00 6395.25 5422.25 Expresso XO 4132.75 4689.25 4234.50 3811.00 5012.25 2851.00 La Antigua 4219.75 2932.00 3447.50 4323.00 2410.25 2937.25 Lotta Latte 3468.00 5146.00 4469.50 5103.50 4003.00 4783.50 NA Lite 4771.00 4026.00 3250.00 2736.00 4791.00 3740.00 Veracruzano 4443.00 3285.00 4467.00 3856.00 4510.00 4712.00 Xalapa Lapa 4304.00 5784.00 3906.00 3645.00 3182.00 3698.00 Một giải pháp để so sánh liệu: biểu thức CASE Một cách hiệu ngắn gọn để hiển thị giá trị so sánh theo định dạng bảng tính dễ đọc sử dụng biểu thức CASE danh sách chọn lựa Mỗi phép tính CASE đánh giá biểu thức rõ cung cấp giá trị khác nhau, phụ thuộc vào điều kiện định có đáp ứng hay khơng Cú pháp CASE Nói chung, bạn xây dựng truy vấn so sánh CASE cách rõ ràng buộc toàn miền mà kết sinh mệnh đề WHERE truy vấn truy vấn ngồi Sau đó, bạn phân chia kết thành tập với biểu thức CASE danh sách lựa chọn: aroma.sales l WHERE u.storekey = l.storekey AND q.classkey = l.classkey AND q.prodkey = l.prodkey AND e.perkey = l.perkey AND qtr = 'Q1_05' AND prod_name LIKE 'Lotta Latte%' AND city like 'San J%' GROUP BY q.prod_name, e.month, e.year, u.city; Kết PROD_NAME MONTH SALES_05 SALES_04 Lotta Latte FEB 3213.50 4239.50 Lotta Latte JAN 1611.00 3195.00 Lotta Latte MAR 2510.50 2980.50 Các tham khảo chéo với biểu thức Các tham khảo chéo truy vấn phụ không hạn chế tới tên cột đầy đủ; chúng biểu thức Ví dụ, biểu thức sau tham khảo chéo hợp lệ: period.year-1 (previous year) period.quarter-1 (previous quarter) Loại tham khảo chéo tổng quát hóa làm đơn giản hóa việc thiết kế cơng cụ ứng dụng phía khách Về truy vấn Truy vấn trả doanh thu Lotta Latte hàng tháng San Jose ba tháng năm 2005 lẫn 2004 Giải pháp tương quan kết mong đợi có chứa liệu tháng khác năm Mệnh đề FROM truy vấn gán tên tương quan cho tất bảng có liên kết với nhau: FROM aroma.store u, aroma.product q, aroma.period e, aroma.sales l Truy vấn phụ sau gắn việc thực với việc thực truy vấn dựa vào điều kiện sau mệnh đề WHERE: d.month = e.month d.year = e.year-1 p.prod_name = q.prod_name t.city = u.city Do truy vấn lấy hàng nên giá trị cột truy vấn cha mẹ thay đổi, điều kiện tương quan truyền thay đổi tới truy vấn phụ Mối tham khảo chéo tới năm trước có dạng year-1 làm tổng quát hóa truy vấn phụ cách loại bỏ giá trị không đổi (2004) Muốn thay đổi truy vấn để báo cáo theo thời hạn năm khác, cần thay đổi ràng buộc năm truy vấn Các lưu ý cách dùng Mỗi có thể, tổng quát hóa truy vấn phụ có tương quan giảm thiểu tương tác người sử dụng cách dùng tham khảo chéo dạng biểu thức Tính tốn tỷ lệ phần trăm q năm Câu hỏi Các tổng số doanh thu hàng tháng quý năm 2004 sản phẩm bán theo túi bảng San Jose bao nhiêu? Tỷ lệ phần trăm doanh thu tháng so với quý so với năm bao nhiêu? Ví dụ truy vấn SELECT pj.prod_name, dj.month, SUM(dollars) AS mon_sales_04, DEC(100 * DEC(SUM(dollars))/ (SELECT SUM(si.dollars) FROM aroma.store ri, aroma.sales si, aroma.product pi, aroma.period di WHERE si.storekey = ri.storekey AND si.classkey = pi.classkey AND si.prodkey = pi.prodkey AND si.perkey = di.perkey AND di.qtr = dj.qtr AND di.year = dj.year AND pi.prod_name = pj.prod_name AND pi.pkg_type = pj.pkg_type AND ri.city = rj.city), 7, 2) AS pct_qtr1, DEC(100 * DEC(SUM(dollars))/ (SELECT SUM(si.dollars) FROM aroma.store ri, aroma.sales si, aroma.product pi, aroma.period di WHERE si.storekey = ri.storekey AND si.classkey = pi.classkey AND si.prodkey = pi.prodkey AND si.perkey = di.perkey AND di.year = dj.year AND pi.prod_name = pj.prod_name AND pi.pkg_type = pj.pkg_type AND ri.city = rj.city), 7, 2) AS pct_yr FROM aroma.store rj, aroma.sales sj, aroma.product pj, aroma.period dj WHERE sj.storekey = rj.storekey AND sj.classkey = pj.classkey AND sj.prodkey = pj.prodkey AND sj.perkey = dj.perkey AND rj.city = 'San Jose' AND dj.year = 2004 AND dj.qtr = 'Q1_04' AND pkg_type = 'One-pound bag' GROUP BY pj.prod_name, dj.month, dj.qtr, dj.year, pj.pkg_type, rj.city ORDER BY pj.prod_name, pct_qtr1 desc; Kết PROD_NAME MONTH MON_SALES_04 PCT_QTR1 PCT_YR Aroma Roma FEB 688.75 39.87 8.72 Aroma Roma JAN 594.50 34.42 7.53 Aroma Roma MAR 442.25 25.61 5.60 Cafe Au Lait MAR 742.00 40.61 10.27 Cafe Au Lait JAN 600.50 32.84 8.31 Cafe Au Lait FEB 484.50 26.49 6.70 Tính tốn với truy vấn phụ danh sách lựa chọn Các tỷ lệ phần trăm hàng tháng so với quý, năm hay kỳ hạn khác tính tốn với truy vấn phụ danh sách lựa chọn Truy vấn lấy số doanh thu hàng tháng hai truy vấn phụ lấy số doanh thu hàng quý hàng năm Các tỷ lệ phần trăm hàng tháng cần tính tốn đơn giản: tỷ số doanh thu hàng tháng so với quý doanh thu hàng tháng so với năm Về truy vấn Ví dụ truy vấn tính tốn tỷ lệ phần trăm doanh thu hàng tháng so với quý doanh thu hàng tháng so với năm cho sản phẩm cà phê chọn bán San Jose quý năm 2004 Sau tính toán tỷ lệ phần trăm, truy vấn xếp bảng kết theo sản phẩm tỷ lệ phần trăm hàng quý theo thứ tự giảm dần Sử dụng truy vấn phụ mệnh đề WHERE Câu hỏi Trong ngày tháng Sáu năm 2005 số doanh thu Lotta Latte cửa hàng hạt Chicago thấp số doanh thu trung bình hàng ngày sản phẩm hạt tháng Sáu 2004? Ví dụ truy vấn SELECT prod_name, district, date, dollars AS sales_05 FROM aroma.market a, aroma.store b, aroma.sales c, aroma.product d, aroma.period e WHERE a.mktkey = b.mktkey AND b.storekey = c.storekey AND d.classkey = c.classkey AND d.prodkey = c.prodkey AND e.perkey = c.perkey AND prod_name like 'Lotta%' AND district like 'Chic%' AND year = 2005 AND month = 'JUN' AND dollars < (SELECT AVG(dollars) FROM aroma.market a, aroma.store b, aroma.sales c, aroma.product d, aroma.period e WHERE a.mktkey = b.mktkey AND b.storekey = c.storekey AND d.classkey = c.classkey AND d.prodkey = c.prodkey AND e.perkey = c.perkey AND prod_name like 'Lotta%' AND district like 'Chic%' AND year = 2004 AND month = 'JUN') ORDER BY date; Kết PROD_NAME DISTRICT DATE SALES_05 Lotta Latte Chicago Jun 7, 2005 76.50 Lotta Latte Chicago Jun 10, 2005 59.50 Lotta Latte Chicago Jun 16, 2005 42.50 Lotta Latte Chicago Jun 17, 2005 76.50 Lotta Latte Chicago Jun 29, 2005 110.50 Về truy vấn Truy vấn trả số doanh thu Lotta Latte cửa hàng hạt Chicago năm 2005 cho ngày có doanh thu thấp số doanh thu trung bình hàng ngày Lotta Latte thành phố năm 2004 Truy vấn phụ ví dụ vơ hướng – tạo giá trị Sau truy vấn phụ tính tốn số đơla trung bình cho ngày Chicago năm 2004, giá trị trung bình sử dụng ràng buộc tất hàng truy vấn trả Chỉ số năm 2005 thấp so với trung bình năm 2004 hiển thị tập kết quả; số trung bình tự khơng thể hiển thị trừ truy vấn phụ di chuyển vào danh sách lựa chọn hay mệnh đề FROM Các lưu ý cách dùng Thứ tự lơgíc việc xử lý truy vấn bắt buộc ràng buộc mệnh đề WHERE máy chủ áp dụng sau bảng mệnh đề FROM nối trước tính tốn với hàm tập hợp AVG SUM, vân vân Vì thế, bạn khơng thể sử dụng số hàm điều kiện tìm kiếm đơn giản mệnh đề WHERE Sử dụng thuộc tính so sánh Câu hỏi Sản phẩm ghi nhận có tổng doanh thu hàng ngày cao Hartford, Connecticut, tháng Giêng 2006? Ví dụ truy vấn SELECT prod_name, date, dollars FROM aroma.store a, aroma.sales b, aroma.product c, aroma.period d WHERE a.storekey = b.storekey AND c.prodkey = b.prodkey AND c.classkey = b.classkey AND d.perkey = b.perkey AND year = 2006 AND city = 'Hartford' AND month = 'JAN' AND dollars >= ALL (SELECT dollars FROM aroma.product a, aroma.sales b, aroma.period c, aroma.store d WHERE a.prodkey = b.prodkey AND a.classkey = b.classkey AND c.perkey = b.perkey AND d.storekey = b.storekey AND year = 2006 AND city = 'Hartford' AND month = 'JAN'); Kết PROD_NAME NA Lite DATE 2006-01-23 DOLLARS 414.00 Về truy vấn Ví dụ truy vấn trả tên sản phẩm ghi nhận có tổng doanh thu hàng ngày cao Hartford, Connecticut, tháng Giêng 2006 ngày tháng cụ thể tổng số ghi nhận Truy vấn viết lại để trả tổng số thấp thay toán tử lớn (>=) toán tử nhỏ (