Giới thiệu về ngôn ngữ SQL (phần 2) Posts and Telecommunications Institute of Technology-PTIT 1 Ví dụ về CSDL 2 Ngôn ngữ thao tác dữ liệu DML của SQL • Ngôn ngữ thao tác dữ liệu của SQL có thể được chia ra làm hai phần tách riêng nhưng vẫn chung nhau ở một số phạm vi nào đó. Hai phần này là các câu lệnh DML không truy vấn và các câu lệnh truy vấn dữ liệu. • Ngôn ngữ thao tác không truy vấn cho phép bạn thêm dữ liệu vào bảng (INSERT), sửa đổi dữ liệu (UPDATE), xoá dữ liệu từ các bảng (DELETE) và thực hiện những thay đổi vĩnh viễn (COMMIT) và huỷ những thay đổi (tới một mức độ nào đó với ROLLBACK). • Các câu lệnh truy vấn DML chắc chắn bao gồm câu lệnh đơn SELECT với rất nhiều các mệnh đề lựa chọn khác nhau.
Chúng ta sẽ xem xét các câu lệnh không truy vấn của DML trước. • Tóm tắt các câu lệnh DML của SQL được mô tả trong bảng dưới sau. 3 Tóm tắt các câu lệnh DML của SQL Câu lệnh hoặc lựa chọn Mô tả INSERT Chèn thêm một (các) hàng vào trong một bảng Lựa chọn các thuộc tính từ các hàng trong một hoặc nhiều bảng hoặc SELECT khung nhìn WHERE Hạn chế việc lựa chọn các hàng dựa trên một biểu thức điều kiện GROUP BY Gộp nhóm các hàng đã được chọn ra dựa trên một hoặc nhiều thuộc tính HAVING Hạn chế sự lựa chọn các hàng để gộp nhóm dựa trên một điều kiện ORDER BY Xếp thứ tự các hàng được chọn UPDATE Sửa đổi giá trị thuộc tính của một hoặc nhiều hàng của một bảng DELETE Xoá một hoặc nhiều hàng từ một bảng COMMIT Lưu trữ vĩnh viễn những thay đổi về dữ liệu ROLLBACK Phục hồi dữ liệu về những giá trị ban đầu của chúng Các phép toán so sánh =, <, >, <=, >=, <> Được sử dụng trong các biểu thức điều kiện Các phép toán logic AND, OR, NOT Được sử dụng trong các biểu thức điều kiện 4 Tóm tắt các câu lệnh DML của SQL (cont.) Câu lệnh hoặc lựa chọn Mô tả Các phép toán đặc biệt được sử dụng trong các biểu thức điều kiện Kiểm tra xem các giá trị của một thuộc tính có nằm trong một khoảng BETWEEN xác định IS NULL Kiểm tra xem giá trị của một thuộc tính có là trống / hoặc có giá trị không Kiểm tra xem giá trị của một thuộc tính có giống với một kiểu chuỗi ký tự LIKE cho truớc Kiểm tra xem giá trị của một thuộc tính có nằm trong / hoặc không nằm IN / NOT IN trong một danh sách các giá trị nào đó EXISTS / NOT EXISTS Kiểm tra xem một truy vấn con có trả về hàng dữ liệu nào không Hạn chế các giá trị tới những giá trị duy nhất, hay loại bỏ những giá trị DISTINCT trùng lặp Các hàm thống kê được sử dụng với SELECT để trả về những giá trị tổng hợp trên các cột COUNT Trả về số lượng các hàng với các giá trị không rỗng cho một cột nào đó Trả về giá trị nhỏ nhất của một thuộc tính được tìm thấy trong một cột MIN nào đó Trả về giá trị lớn nhất của một thuộc tính được tìm thấy trong một cột MAX nào đó SUM Trả về tổng của tất cả các giá trị của một cột nào đó AVG Trả về giá trị trung bình của tất cả c ác giá trị của một cột nào đó 5 Thêm các bản ghi vào bảng • SQL dùng câu lệnh INSERT để thêm dữ liệu mới vào một bảng. • Cú pháp của câu lệnh này như sau: INSERT INTO tablename VALUES (value1, value 2, .value n); 6 Ví dụ - thêm các bản ghi vào bảng • Thêm hai bản ghi mới vào bảng VENDOR chúng ta cần thực hiện hai câu lệnh SQL dưới đây: INSERT INTO VENDOR VALUES (21225, ‘Bryson, Inc.’, ‘Smithson’, ‘615’, ‘223-3234’, ‘TN’, ‘Y’); INSERT INTO VENDOR VALUES (21226, ‘SuperLoo, Inc.’, ‘Flushing’, ‘904’, ‘215-8995’, ‘FL’, ‘N’); 7 Ví dụ - Thêm bản ghi có thuộc tính rỗng • Nếu một thuộc tính của một bản ghi không có giá trị (hay có giá trị là null) bạn sẽ sử dụng cú pháp sau đây để thêm một hàng vào bảng: INSERT INTO PRODUCT VALUES (‘23114-AA’, ‘Sledge hammer, 12 lb.05, NULL); Lệnh này chèn bản ghi này vào bảng PRODUCT 8 Ví dụ - Thêm bản ghi có thuộc tính rỗng • Trong các trường hợp có nhiều hơn một thuộc tính nhận giá trị rỗng, thay vì khai báo các thuộc tính là NULL trong lệnh INSERT, ta chỉ cần mô tả các thuộc tính cần có giá trị nhập, không cần quan tâm tới các thuộc tính rỗng.
• Việc này được thực hiện bằng cách liệt kê tên của các thuộc tính mà giá trị của chúng được đưa vào bên trong dấu ngoặc đơn ngay sau tên của bảng. • Xét ví dụ dưới đây, giả sử rằng chỉ P_CODE và P_DESCRIPT cần nhập giá trị vào trong bảng PRODUCT. Hai cách nhập sau đây đều đúng: INSERT INTO PRODUCT VALUES (‘23114-AA’, ‘Sledge hammer, 12 lb.’, NULL, NULL, NULL, NULL, NULL, NULL); -or- INSERT INTO PRODUCT(P_CODE, P_DESCRIPT) VALUES(‘23114-AA’, ‘Sledge hammer, 12 lb.’); 9 Xóa các bản ghi khỏi bảng • SQL cho phép dễ dàng xóa một bản ghi ra khỏi bảng bằng lệnh DELETE. • Cú pháp của lệnh DELETE là: DELETE FROM tablename [WHERE conditionlist ]; • Để xoá một bản ghi từ một bảng dựa trên giá trị của khoá chính, bạn có thể sử dụng câu lệnh như sau: DELETE FROM PRODUCT WHERE P_CODE = ‘23114-AA’; 10 Xóa các bản ghi khỏi bảng (cont.) • Lệnh DELETE cũng được dùng để xóa nhiều bản ghi ra khỏi bảng.
– Ví dụ bạn muốn xoá các sản phẩm từ bảng PRODUCT mà giá trị P_MIN =5. Để thực hiện điều này bạn có thể dùng câu lệnh: DELETE FROM PRODUCT WHERE P_MIN = 5; • DELETE là một câu lệnh hướng tập hơp. Có nghĩa là điều kiện ở câu lệnh WHERE là có thể có hoặc không, nếu điều kiện đó không được chỉ rõ thì tất cả các hàng của bảng sẽ được xoá! 11 Cập nhật dữ liệu cho các bản ghi trong bảng • Để thay đổi dữ liệu trong bảng, ta dùng lệnh UPDATE. • Cú pháp của lệnh UPDATE như sau: UPDATE tablename SET columnname = expression [, columnname = expression ] [ WHERE conditionlist ]; • Lưu ý rằng điều kiện WHERE là không bắt buộc trong câu lệnh UPDATE.
Nếu không có điều kiện WHERE, thì câu lệnh UPDATE sẽ được thực hiện trên tất cả các bản ghi của bảng đó. 12 Cập nhật dữ liệu cho các bản ghi trong bảng (cont.) • Ví dụ, bạn muốn thay đổi P_INDATE từ 13/12/2003 thành 18/1/2004 trong hàng thứ hai của bảng PRODUCT. Bạn cần sử dụng giá trị của khoá chính 13- Q2/P2 để xác định đúng hàng trong bảng cần thay đổi, câu lệnh tương ứng như sau: UPDATE PRODUCT SET P_INDATE = ’18-Jan-2004’ WHERE P_CODE = ’13-Q2/P2’; • Nếu có nhiều hơn một thuộc tính cần được thay đổi trong một bản ghi, các câu lệnh UPDATE sẽ được phân cách nhau bởi dấu phảy: UPDATE PRODUCT SET P_INDATE = ’18-JAN-2004’, P_PRICE = 16.99, P_MIN = 10 WHERE P_CODE = ’13-Q2/P2’; 13 Lưu các thay đổi trong bảng • Mọi thay đổi được thực hiện tới nội dung của bảng sẽ không được lưu trữ một cách vật lý trong một bảng vật lý (là một tệp trong hệ thống) cho tới khi một câu lệnh COMMIT được thực thi. • Thông thường, nếu hệ thống mất điện trong quá trình cập nhật một bảng (hoặc một cơ sở dữ liệu nói chung) trước khi câu lệnh COMMIT được thực thi, tất cả các thay đổi bạn thực hiện trước đó sẽ bị mất.
Những hệ thống phức tạp hơn sẽ có khả năng phục hồi dữ liệu sau những sự cố như vậy. Với các hệ thống máy tính cá nhân thì nên sử dụng bộ lưu điện UPS để hạn chế sự cố này! • Cú pháp của lệnh COMMIT như sau: COMMIT [ tablename ]; -or- COMMIT; //saves all changes made in any modified tables 14 Phục hồi nội dung của bảng • Nếu bạn chưa sử dụng câu lệnh COMMIT để lưu trữ vĩnh viễn những thay đổi trong CSDL, bạn có thể phục hồi cơ sở dữ liệu về trạng thái trước đó (kết quả của lần cuối thực hiện câu lệnh COMMIT) bằng việc sử dụng câu lệnh ROLLBACK. • ROLLBACK phục hồi lại những thay đổi được thực hiện và trả lại dữ liệu những giá trị cũ của nó trước khi những thay đổi này được thực hiện. • Cú pháp của câu lệnh ROLLBACK như sau: ROLLBACK; • MS Access không hỗ trợ câu lệnh ROLLBACK.
Một số hệ quản trị CSDL như Oracle tự động COMMIT những thay đổi dữ liệu khi thực hiện các câu lệnh DDL, vì vậy ROLLBACK sẽ không có tác dụng đối với những hệ thống loại này. • ROLLBACK sẽ phục hồi tất cả những thay đổi kể từ lệnh COMMIT cuối cùng. Nghĩa là, thâm chí những thay đổi mà bạn không muốn phục hồi cũng sẽ được khôi phục lại với giá trị cũ nếu chưa một câu lệnh COMMIT nào được thực thi. 15 Cập nhật dữ liệu nâng cao • Để thêm dữ liệu vào các cột có sẵn, ta sử dụng lệnh UPDATE trong SQL.
Lệnh UPDATE chỉ cập nhật dữ liệu trong cột có sẵn. • Ví dụ, để thêm giá trị ‘2’ vào cột P_SALECODE tại dòng 4 của bảng PRODUCT_2, ta dùng lệnh UPDATE kết hợp với giá trị khóa chính của dòng đó. Câu lệnh sau thực hiện việc này. UPDATE PRODUCT_2 SET P_SALECODE = ‘2’ WHERE P_CODE = ‘1546-QQ2’; Kết quả trước và sau câu lệnh được thể hiện ở các slides tiếp theo.
16 Cập nhật dữ liệu nâng cao (cont.) Giá trị P_SALECODE trước khi cập nhật 17 Cập nhật dữ liệu nâng cao (cont.) Giá trị của P_SALECODE sau cập nhật 18 Cập nhật dữ liệu nâng cao (cont.) • Các giá trị tiếp theo có thể được thêm vào theo cùng một cách thức: xác định vị trí thêm vào bằng khóa chính (P_CODE) và tên cột dữ liệu (P_SALECODE). • Bảng dữ liệu kết quả ở trang trước có thể được tạo ra bởi câu lệnh SQL sau: UPDATE PRODUCT_2 SET P_SALECODE = ‘1’ WHERE P_CODE IN (‘2232/QWE’, ‘2232/QTY’); 19 Cập nhật dữ liệu nâng cao (cont.) • Mặc dù chuỗi lệnh UPDATE ở phần trước cho phép nhập dữ liệu vào các ô cụ thể trong bảng, quá trình thực hiện về bản chất rất phức tạp. May mắn là có các phương pháp thực hiện tốt hơn. • Nếu ta có mối liên hệ giữa các giá trị cần nhập với các dữ liệu có sẵn thì có thể dùng đó để gán các giá trị mới vào vị trị thích hợp.
• Ví dụ, nếu ta cần cho mã bán hàng (P_SALECODE) vào bảng dựa trên các giá trị của P_INDATE như sau: – Nếu P_INDATE nhỏ hơn 25/12/2003, thì P_SALECODE = 2 – Nếu P_INDATE nằm giữa 16/1/2004 và 10/2/2004, thì P_SALECODE =1 20 Cập nhật dữ liệu nâng cao (cont.