Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
234,69 KB
Nội dung
Bai-6.doc *** Trang 1 B B à à i i 6 6 (Nội dung tiếp bài 5) 1. Điều hành dữ liệu – câu lệnh SELECT Chúng ta có cả thảy 4 câu lệnh điều hành dữ liệu: SELECT, INSERT, UPDATE, và DELETE, trong đó câu lệnh SELECT có cú pháp phức tạp nhất. Để dễ hiểu, trước hết ta đi qua một số ví dụ và tiếp đó ta xét cú pháp ở dạng đầy đủ của nó. 1.1. Các ví dụ về câu lệnh SELECT VD 1. Lập danh mục Mầu và Tên thành phố đối với các phụ tùng không phải ở Paris và có trọng lượng lớn hơn 10: SELECT color, city FROM part WHERE city <> 'Paris' AND weight > 10; Kết quả: color city Red London Blue Rome Red London Red London Chú ý các dòng lặp lại. Nếu ta thay câu lệnh trên bằng SELECT DISTINCT color, city FROM part WHERE city <> 'Paris' AND weight > 10; ta sẽ được kết quả sau: color city Red London Blue Rome Đối với câu lệnh trên, kết quả không được sắp xếp. Muốn có kết quả được sắp xếp, ta thêm mệnh đề ORDER BY: Bai-6.doc *** Trang 2 SELECT DISTINCT color, city FROM part WHERE city <> 'Paris' AND weight > 10 ORDER BY color; và kết quả là: color city Blue Rome Red London VD 2. Lập danh sách số hiệu phụ tùng và trọng lượng của chúng đo theo gram (1 Pound = 454 gram) SELECT p_id, weight*454 AS weight_gram FROM part cho kết quả: p_id weight_gram P1 5448 P2 7718 P3 7718 P4 6356 P5 5448 P6 8626 Trong câu lệnh trên chú ý phần weight*454 AS weight_gram. Đây là trường hợp chỉ định cột tính toán và đặt tên cho cột đó. VD 3. Lấy toàn bộ thông tin của các nhà cung cấp SELECT * FROM supplier Kết quả: s_id sname status city S1 Smith 20 London S2 Jones 10 Paris S3 Blake 30 Paris S4 Clark 20 London S5 Adams 30 Athens Bai-6.doc *** Trang 3 VD 4. Lấy toàn bộ thông tin các nhà cung cấp và phụ tùng sao cho nơi đặt phụ tùng cũng là nơi đặt trụ sở các nhà cung cấp. SELECT supplier.*, part.p_id, part.pname, part.color, part.weight FROM supplier, part WHERE supplier.city = part.city; Kết quả là: s_id sname status city p_id pname color weight S1 Smith 20 London P1 Nut Red 12 S4 Clark 20 London P1 Nut Red 12 S2 Jones 10 Paris P2 Bolt Green 17 S3 Blake 30 Paris P2 Bolt Green 17 S1 Smith 20 London P4 Screw Red 14 S4 Clark 20 London P4 Screw Red 14 S2 Jones 10 Paris P5 Cam Blue 12 S3 Blake 30 Paris P5 Cam Blue 12 S1 Smith 20 London P6 Cog Red 19 S4 Clark 20 London P6 Cog Red 19 Chú ý rằng hai câu lệnh sau tương đương với câu lệnh trên: SELECT supplier.*, part.p_id, part.pname, part.color, part.weight FROM supplier INNER JOIN part USING (city); SELECT supplier.*, part.p_id, part.pname, part.color, part.weight FROM supplier NATURAL JOIN part; Ghi nhớ: Một cách đơn giản ta có thể nhận thấy rằng sau FROM là tích Đề các, sau WHERE là Restrict và sau SELECT là một phép chiếu (Project). Như vậy, tổ hợp SELECT-FROM-WHERE tương đương với phép chiếu của trích xuất tích Đề các. VD 5. Lập danh mục tên các cặp thành phố sao cho nhà cung cấp thuộc thành phố thứ nhất cung cấp thiết bị đặt ở thành phố thứ hai. SELECT DISTINCT supplier.city AS scity, part.city AS pcity FROM supplier INNER JOIN sp USING (s_id) INNER JOIN part USING (p_id); Bai-6.doc *** Trang 4 Kết quả là: scity pcity London London London Paris London Rome Paris London Paris Paris Chú ý rằng câu lệnh sau đây sẽ không cho kết quả đúng: SELECT DISTINCT supplier.city AS scity, part.city AS pcity FROM supplier NATURAL JOIN sp NATURAL JOIN part ; vì câu lệnh này sẽ sử dụng thêm trường city là trường để thực hiện phép toán JOIN. VD 6. Lập danh sách mã hiệu các cặp nhà cung cấp sao cho cả hai nhà cung cấp ở cùng thành phố. SELECT first.s_id AS first_id, second.s_id AS second_id FROM supplier AS first, supplier AS second WHERE first.city = second.city AND first.s_id < second.s_id; Kết quả là: first_id second_id S1 S4 S2 S3 VD 7. Lấy tổng số các nhà cung cấp SELECT COUNT(*) AS n FROM supplier; Kết quả là: n 5 Chú ý trường hợp này: gọi hàm COUNT. Hàm này là một trong các hàm tính giá trị gộp (aggregate functions): COUNT, SUM, AVG, MAX, MIN. Bai-6.doc *** Trang 5 • Nhìn chung, ta có thể đưa thêm mệnh đề DISTINCT để loại bỏ các bản ghi trùng (trừ MAX và MIN: vì mệnh đề này không có nghĩa đối với chúng) • Hàm COUNT là hàm đặc biệt, không chấp nhận đưa thêm mệnh đề DISTINCT và hàm này tính cả các giá trị NULL • Các hàm khác đều loại bỏ NULL trước khi tính • Nếu kết quả là tập hợp rỗng, hàm COUNT cho kết quả 0, còn các hàm khác cho kết quả NULL. VD 8. Lấy số lượng cao nhất và số lượng thấp nhất của phụ tùng có mã hiệu P2 SELECT MAX(qty) AS max_qty, MIN(qty) AS min_qty FROM sp WHERE p_id = 'P2'; Kết quả là: max_qty min_qty 400 200 VD 9. Lập danh sách phụ tùng gồm số hiệu và tổng số lượng trong kho SELECT p_id, SUM(qty) AS total_qty FROM sp GROUP BY p_id; Kết quả là: p_id total_qty P1 600 P2 1000 P3 400 P4 500 P5 500 P6 100 VD 10. Lập danh sách các mã phụ tùng có ít nhất 2 nhà cung cấp trở lên SELECT p_id FROM sp GROUP BY p_id HAVING COUNT(s_id) > 1; Bai-6.doc *** Trang 6 Kết quả là: p_id P1 P2 P4 P5 1.2. Sơ lược về câu lệnh SELECT SELECT [DISTINCT | ALL] select_expression, [FROM table_references [WHERE where_definition] [GROUP BY , ] [HAVING where_definition] [ORDER BY , ] Cấu trúc câu lệnh truy vấn SELECT gồm các mệnh đề chính: • SELECT • FROM • WHERE • GROUP BY HAVING • ORDER BY Chúng ta chỉ đề cập một số mệnh đề chính, vì câu lệnh SELECT có rất nhiều mệnh đêf. Các mệnh đề khác chỉ được nhắc đến khi có các ứng dụng cần thiết. Một cách tổng quan chúng ta nhận thấy: mệnh đề SELECT chỉ ra các cột cần lấy, mệnh đề FROM chỉ ra các bảng cần truy xuất, mệnh đề WHERE chỉ ra các bản ghi nào cần lấy. Chỉ có mệnh đề SELECT và FROM là bắt buộc, còn WHERE và các mệnh đề khác có thể không cần chỉ định (xem các ví dụ trên đây). 1.3. Mệnh đề SELECT SELECT [ALL|DISTINCT] select-list select-list là danh sách các cột, tách nhau bởi dấu phẩy. Các chỉ định ALL và DISTINCT không bắt buộc. DISTINCT chỉ định rằng không có các bản ghi trùng nhau. Mặc định là ALL, nghĩa là lấy tất cả, kể cả các bản ghi trùng nhau. Ký tự ‘*’ chỉ định tất cả các cột, ví dụ SELECT * FROM sp, hoặc SELECT sp.* FROM sp là lấy tất cả các cột của bảng sp. Bai-6.doc *** Trang 7 1.4. Mệnh đề FROM Mệnh đề FROM luôn luôn phải theo mệnh đề SELECT. Nó chỉ ra danh sách các bảng cần lấy, ví dụ: SELECT * FROM supplier hoặc: SELECT sp.*, city FROM sp, supplier WHERE sp.s_id=s.s_id ■ Tên tương quan Trong phần tên bảng ta có thể thay tên mới, ví dụ: SELECT s.name FROM supplier s Hoặc SELECT s.name FROM supplier AS s Tên mới được gọi là tên tương quan. 1.5. Mệnh đề WHERE Sau từ khóa WHERE là một biểu thức logic. color = 'Red' Nhìn chung, biểu thức logic có các toán hạng là các cột của bảng liên quan từ phần FROM và ngoài ra các toán hạng cũng có thể là các giá trị cụ thể. Các phép toán so sánh: • > • < • >= lớn hơn hoặc bằng • <= nhỏ hơn hoặc bằng • <> khác Các toán tử so sánh khác gồm BETWEEN, IN, LIKE và IS NULL. • BETWEEN BETWEEN: giữa: value-1 [NOT] BETWEEN value-2 AND value-3 Tương đương với: value-1 >= value-2 AND value-1 <= value-3 Bai-6.doc *** Trang 8 • IN Toán tử IN kiểm tra xem giá trị chỉ ra có thuộc một danh sách hay không: value-1 [NOT] IN ( value-2 [, value-3] ) Điều này cũng tương đương với việc kiểm tra xem value-1 có bằng value-2 hoặc bằng value-3, hay không, nó tương đương với: value-1 = value-2 [ OR value-1 = value-3 ] • LIKE Toán tử LIKE so sánh chuỗi ký tự này với chuỗi ký tự khác, trong đó có một số ký tự thay thế. Các ký tự thay thế là '%' và ký tự gạch dưới '_'. Ký tự gạch dưới thay thế một ký tự bất kỳ và ký tự phần trăm thay thế một số các ký tự bất kỳ. VD: Giá trị Chuỗi K ết quả 'abc' '_b_' True 'ab' '_b_' False 'abc' '%b%' True 'ab' '%b%' True 'abc' 'a_' False 'ab' 'a_' True 'abc' 'a%_' True 'ab' 'a% _' True Dạng thức so sánh LIKE: value-1 [NOT] LIKE value-2 [ESCAPE value-3] Các giá trị phải là chuỗi ký tự. value-2 là mẫu so sánh, value-1 là giá trị. Tùy chọn ESCAPE cho phép sử dụng ký tự kèm để biến các ký tự '%' và '_' như các ký tự bình thường. Bai-6.doc *** Trang 9 Ví dụ, tìm chuỗi x kết thúc bằng dấu phần trăm: x LIKE '%/%' ESCAPE '/' Ví dụ phức tạp hơn: y LIKE '/%//%' ESCAPE '/' là tìm chuỗi y bắt đầu bằng '%/'. Như vậy, ký tự sau ESCAPE nếu gặp lại chính bản thân nó thì cặp ký tự đó biến thành một ký tự bình thường. Toán tử NOT đương nhiên làm cho kết quả ngược lại: z NOT LIKE 'abc%' tương đương với: NOT (z LIKE 'abc%') • Toán tử IS NULL SQL không cho phép so sánh như sau: WHERE qty = NULL Ta phải sử dụng toán tử IS NULL: value-1 IS [NOT] NULL Phép tính trên kiểm tra xem value-1 có bằng NULL hay không. Toán tử NOT đương nhiên là cho kết quả ngược lại : value-1 IS NOT NULL tương đương với: NOT (value-1 IS NULL) ■ Các toán tử logic • AND predicate-1 AND predicate-2 AND cho kết quả: o True nếu cả hai toán hạng là True o False nếu một trong hai là False Bai-6.doc *** Trang 10 o NULL Nếu một trong hai toán hạng là NULL và toán hạng còn lại là True hoặc cả hai đều NULL Xem bảng giá trị của toán tử AND: AND T F NULL T T F NULL F F F F NULL NULL F NULL Toán hạng 1 Toán hạng 2 AND True True True True False False False False False False True False NULL NULL NULL NULL True NULL NULL False False True NULL NULL False NULL False • Toán tử OR predicate-1 OR predicate-2 OR cho kết quả: o True Nếu một trong hai là True o False Nếu cả hai là False o NULL Cho các trường hợp còn lại (Một trong hai toán hạng là False và toán hạng kia NULL hoặc cả hai đều NULL) Bảng giá trị OR: OR T F NULL T T T T F T F NULL NULL T NULL NULL Toán hạng 1 Toán hạng 2 OR True True True True False True False False False False True True NULL NULL NULL NULL True True NULL False NULL True NULL True False NULL NULL AND có độ ưu tiên cao hơn OR, do đó: [...]... CAST(exp-1 AS data-type) Chuyển đổi biểu thức exp-1, về kiểu date-type • COALESCE(exp-1, exp-2 [, exp-3] ) Cho exp-1 nếu không phải là null, nếu không cho exp-2 nếu nó không phải là null, Trả lại giá trị null nếu tất cả đều null • CASE exp-1 { WHEN exp-2 THEN exp-3 } [ELSE exp-4] END CASE { WHEN predicate-1 THEN exp-3 } [ELSE exp-4] END Bai -6 . doc *** Trang 14 Trường hợp 1 so sánh exp-1 với exp-2 với... trị 0 • CHAR_LENGTH(exp-1) CHARACTER_LENGTH(exp-1) Cho độ dài chuỗi ký tự exp-1 • OCTET_LENGTH(exp-1) Cho kết quả là số các byte trong chuỗi exp-1 • EXTRACT(sub-field FROM exp-1) Cho giá trị số lấy từ dữ liệu thời gian exp-1 Sub-field là một trong các từ khóa: YEAR, QUARTER, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_MINUTE Ví dụ: SELECT EXTRACT(SECOND FROM '200 5-0 3-1 0 11:37:25'); cho kết... thường: [ddd][[.]ddd][E[+ |-] ddd] • Thời gian (Datetime) Thời gian biểu diễn theo dạng thức sau: o Date 'yyyy-mm-dd' o Time 'hh:mm:ss[.fff]' o Timestamp 'yyyy-mm-dd hh:mm:ss[.fff]' 1.9 Các hàm SQL • SUBSTRING(exp-1 FROM exp-2 [FOR exp-3]) Lấy dãy ký tự từ exp-1, bắt đầu bằng exp-2 và có độ dài là exp-3, đếm bắt đầu từ 1 Nếu không chỉ định exp-3, thì toàn bộ chuỗi bắt đầu từ exp-2 đến hết sẽ được lấy... 3); cho kết quả là bcd • UPPER(exp-1) Đổi thành chư hoa • LOWER(exp-1) Đổi thành chữ thường • TRIM([LEADING|TRAILING|BOTH] [FROM] exp-1) TRIM([LEADING|TRAILING|BOTH] exp-2 FROM exp-1) Cắt các ký tự trắng bên trái, bên phải hoặc cả bên trái lẫn bên phải Mặc định là BOTH (nghĩa là cắt cả hai bên) • POSITION(exp-1 IN exp-2) Bai -6 . doc *** Trang 13 Tìm exp-1, trong exp-2 Bắt đầu đếm từ 1 Nếu không tìm thấy,... chỉ ra câu lệnh (hoặc các câu lệnh) SQL tương đương Bài tập 6. 4 – Lập danh mục mã số các nhà cung cấp phụ tùng P1 Bài tập 6. 6 – Lập danh mục chi tiết phụ tùng trong kho có số lượng từ 300 đến 750 Bài tập 6. 7 – Lập danh mục mầu của phụ tùng trong kho mua từ nhà cung cấp S1 Bài tập 6. 8 – Từ CSDL trên, hãy chọn ra các sinh viên sinh vào tháng 3 Bài tập 6. 9 – Từ CSDL trên hãy đưa ra câu lệnh SQL để liệt... Trọng lượng (g) = 5448 Blue Số lượng Max = 400 Bai -6 . doc *** Trang 21 2./ Bài tập Bài tập 6. 1 – Tìm các câu lệnh SQL tương đương cho các phép tính đại số quan hệ Restriction, phép chiếu và phép nhân Bài tập 6. 2 – SQL có câu lệnh tương đương với các phép tính đại số quan hệ EXTEND và SUMMARIZE? Nếu có, hãy chỉ ra các câu lệnh SQL tương đương Bài tập 6. 3 – SQL có hỗ trợ tương đương với phép gán của đại... các tài liệu hướng dẫn sử dụng của các HQT CSDL đó Bai -6 . doc *** Trang 18 1.17 Mệnh đề GROUP BY Mệnh đề GROUP BY phục vụ truy vấn nhóm Nếu có mệnh đề WHERE, thì mệnh đề GROUP BY phải đứng sau mệnh đề WHERE GROUP BY column-1 [ASC | DESC], [, column-2 [ASC | DESC]] Trong đó column-1 và column-2 là tên các cột dùng để nhóm Chú ý rằng column-1 và column-2, phải là tên các cột SQL92 không chấp nhận biểu... SUM(qty) P1 60 0 P2 1000 P3 400 P4 500 P5 500 P6 100 1.18 Các hàm gộp Khi truy vấn nhóm, người ta thường sử dụng các hàm gộp p_id s_id qty P1 S1 300 P1 S2 300 P2 S1 200 P2 S2 400 P2 S3 200 P2 S4 200 P3 S1 400 P4 S1 200 P4 S4 300 P5 S1 100 P5 S4 400 P6 S1 100 Nhóm theo p_id SUM(qty) Nhóm P1 60 0 Nhóm P2 1000 Nhóm P3 400 Nhóm P4 500 Nhóm P5 500 Nhóm P6 100 Bai -6 . doc *** Trang 19 Cách gọi hàm gộp: set-function... kiểu dữ liệu số: o o o TINYINT, SMALLINT, INT, BIGINT NUMERIC, DECIMAL FLOAT, DOUBLE, REAL Dấu + và – có thể là dấu của một số dương, âm Các phép toán đó cũng có thể áp dụng cho kiểu dữ liệu là thời gian, nhưng với vài điểm cần lưu ý Qui tắc cơ bản là: o o Thời gian khi cộng trừ một khoảng nào đó, sẽ ra kết quả là thời gian Thời gian trừ thời gian sẽ ra kết quả là khoảng thời gian (datetime-1 - datetime-2)... = p.p_id Bai -6 . doc *** Trang 16 Kết quả: sname Smith qty color 300 Red Smith 200 Green Smith 400 Blue Smith 200 Red Smith 100 Blue Smith 100 Red Jones 300 Red Jones 400 Green Blake 200 Green Clark 200 Green Clark 300 Red Clark 400 Blue 1.14 Liên kết ngoài (Outer Joins) Liên kết ngoài có cú pháp như sau: table-1 { LEFT | RIGHT | FULL } OUTER JOIN table-2 ON predicate-1 Trong đó predicate-1 là biểu thức . null. • CASE exp-1 { WHEN exp-2 THEN exp-3 } [ELSE exp-4] END CASE { WHEN predicate-1 THEN exp-3 } [ELSE exp-4] END Bai -6 . doc *** Trang 15 Trường hợp 1 so sánh exp-1 với exp-2 với mỗi mệnh. IS NULL. • BETWEEN BETWEEN: giữa: value-1 [NOT] BETWEEN value-2 AND value-3 Tương đương với: value-1 >= value-2 AND value-1 <= value-3 Bai -6 . doc *** Trang 8 • IN Toán tử IN kiểm. dài chuỗi ký tự exp-1. • OCTET_LENGTH(exp-1) Cho kết quả là số các byte trong chuỗi exp-1. • EXTRACT(sub-field FROM exp-1) Cho giá trị số lấy từ dữ liệu thời gian exp-1. Sub-field là một trong