Chủ Nhật, 19 tháng 7, 2015

Bài 04: THAO TÁC VỚI DỮ LIỆU BẰNG INSERT, UPDATE, DELETE

Sau khi học xong bài học này, các bạn sẽ biết cách:
  • -          Nhập dữ liệu vào bảng.
  • -          Thay đổi dữ liệu trong bảng.
  • -          Xóa 1 dòng trong bảng.
  • -          Điều khiển phiên làm việc


Thêm một dòng mới vào bảng

         Có 2 loại câu lệnh SQL:

  • -          Data Manupulation Language: Đây là câu lệnh dùng để tao tác với dữ liệu như INSERT, UPDATE, DELETE.
  • -          Data Definition Language: Đây là những câu lệnh để tạo ra các đối tượng như bảng, view, chỉ mục (index). Ví dụ: CREATE TABLE, CREATE INDEX, ALTER TABLE.

Note: Một giao dịch (transaction) là một tập hợp các câu lệnh DML, được bắt đầu khi người dùng chạy một câu lệnh DML bất kỳ và kết thúc khi người dùng gõ câu lệnh COMMIT hoặc ROLL BACK. Giải thích một cách hình tượng hơn: Bạn ra chợ mua một con cá giá 30.000 Đ, thì tiền trong túi bạn sẽ chuyển vào túi người bán hàng, đó gọi là một giao dịch. Vậy giao dịch này bao gồm 2 câu lệnh DML: 1. Update tài khoản của bạn trừ 30.000Đ. 2.Update tài khoản của người bán hàng thêm 30.000 Đ.
Cách thêm một dòng mới vào bảng có cú pháp như sau:

INSERT INTO  table [(column [, column...])]
VALUES        (value [, value...]);

Trong đó:
Table: tên bảng cần chèn dữ liệu
Column: Danh sách các cột sẽ chứa giá trị mới chèn vào
Value: Giá trị tương ứng cho các cột vừa được liệt kê bên trên

Ví dụ 1: Insert dữ liệu vào  tất cả các cột
INSERT INTO departments
VALUES (70, 'Public Relations', 100, 1700);

Ví dụ 2: Insert dữ liệu vào một số cột được chỉ định
INSERT INTO departments(department_id,
       department_name, location_id)
VALUES (70, 'Public Relations',1700);

Ví dụ 3: Insert dữ liệu kết hợp sử dụng hàm
INSERT INTO employees (employee_id,
                 first_name, last_name,
                 email, phone_number,
                 hire_date, job_id, salary,
                 commission_pct, manager_id,
                 department_id)
VALUES           (113,
                 'Louis', 'Popp',
                 'LPOPP', '515.124.4567',
                 SYSDATE, 'AC_ACCOUNT', 6900,
                 NULL, 205, 110);

Ví dụ 4: Insert dữ liệu ngày tháng
INSERT INTO employees
VALUES      (114,
             'Den', 'Raphealy',
             'DRAPHEAL', '515.127.4561',
             TO_DATE('FEB 3, 1999', 'MON DD, YYYY'),
             'SA_REP', 11000, 0.2, 100, 60);



Copy dữ liệu từ một bảng khác
Bạn có thể copy dữ liệu từ một bảng khác có sẵn bằng câu lệnh INSERT kết hợp với SELECT
INSERT INTO sales_reps(id, name, salary, commission_pct)
  SELECT employee_id, last_name, salary, commission_pct
  FROM   employees
  WHERE  job_id LIKE '%REP%';

Như trong ví dụ bên trên, chúng ta đã insert dữ liệu từ bảng employees sang bảng sales_reps. Có một số chú ý khi sử dụng cách copy này:
-          Không sử dụng từ khóa VALUES.
-          Những cột sẽ được INSERT dữ liệu phải khớp với những cột được liệt kê sau mệnh đề SELECT.

Thay đổi dữ liệu trong bảng
Bảng Employees



Update 1 dòng có sẵn trong bảng



Ở ví dụ bên trên, chúng ta đã thay đổi 3 Department_ID của 3 người từ 60 sang 80
Cú pháp của câu lệnh UPDATE
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];

Trong cú pháp này:
Table:      Bảng muốn cập nhật dữ liệu
Column:                 Cột muốn thay đổi dữ liệu
Condition: Những cột nào thỏa mãn điều kiện này sẽ được cập nhật.

Ví dụ 1: Update những dòng thỏa mãn điều kiện employee_id = 113
UPDATE employees
SET    department_id = 50
WHERE  employee_id = 113;

Ví dụ 2: Update tất cả các dòng trong bảng

UPDATE    copy_emp
SET       department_id = 110;


Bạn có thể kết hợp với câu lệnh SELECT với câu lệnh UPDATE như sau
Ví dụ 3: Sửa trường job_id, salary của nhân viên có employee_id = 113 sao cho giống với job_id và salary của nhân viên có employee_id=205

UPDATE   employees
SET      job_id  = (SELECT  job_id
                    FROM    employees
                    WHERE   employee_id = 205),
         salary  = (SELECT  salary
                    FROM    employees
                    WHERE   employee_id = 205)
WHERE    employee_id    =  113;

Xóa dữ liệu trên bảng

Có 2 cách để xóa dữ liệu trên bảng:
  • -          Delete
  • -          Truncate

Câu lệnh DELETE dùng để xóa 1 hay nhiều row trên một bảng, còn câu lệnh TRUNCATE chỉ có thể xóa toàn bộ bảng. Bù lại tốc độ của câu lệnh TRUNCATE nhanh hơn DELETE nhiều .
Ngoài ra, do câu lệnh TRUNCATE là một câu lệnh DDL (Data Definition Language) nên khi đã thực hiện rồi, bạn rất khó để phục hồi lại dữ liệu, còn câu lệnh DELETE là câu lệnh DML (Data Manipulation Language) nên bạn có thể phục hồi lại dữ liệu bằng câu lệnh ROLLBACK ( với điều kiện sau khi gõ xong câu lệnh DELETE, bạn chưa gõ COMMIT)

Cú pháp của câu lệnh DELETE
DELETE [FROM]   table
[WHERE      condition];

Ví dụ 1: Xóa dòng được chỉ định trong điều kiện WHERE
DELETE FROM departments
 WHERE  department_name = 'Finance';

1 row deleted

Ví dụ 2: Xóa tất cả bảng
DELETE FROM  copy_emp;

22 rows deleted

Cú pháp của câu lệnh TRUNCATE
TRUNCATE TABLE table_name;

Ví dụ:
TRUNCATE TABLE copy_emp;

Thế nào là Giao dịch (Transaction)
Như tôi đã nói ở phần trên, một giao dịch được bắt đầu từ lúc chúng ta chạy một câu lệnh DML và kết thúc khi chúng ta gõ câu lệnh ROLL BACK hoặc COMMIT. Giao dịch sinh ra để đảm bảo tính đúng đắn dữ liệu.
Ví dụ: Khi mẹ bạn chuyển tiền cho bạn, tức là đã có 2 thao tác thay đổi trong CSDL, một là tài khoản của mẹ bạn bị trừ , hai là tài khoản của bạn được cộng. Nếu trong quá trình thực hiện giao dịch, hệ thống gặp trục trặc, nếu chỉ có 1 trong 2 thao tác được phục hồi thì tính đúng đắn của dữ liệu sẽ bị mất. Vậy là mẹ bạn sẽ bị mất tiền hoặc bạn tự nhiên sẽ có tiền mà tài khoản của mẹ bạn không bị trừ!.Cho nên phải là toàn bộ giao dịch phải bị hủy để đảm bảo tính đúng đắn của dữ liệu.
Tôi vừa đề cập đến 2 câu lệnh COMMIT và ROLLBACK, vậy chúng là gì?
Đầu tiên, chúng được sử dụng để kết thúc một giao dịch. Sử dụng COMMIT khi chúng ta đã chắc chắn những thay đổi chúng ta thực hiện trong giao dịch là chính xác, còn sử dụng ROLLBACK khi chúng ta lỡ tay thay đổi nhầm dữ liệu và muốn loại bỏ giao dịch vừa tiến hành sai.

ROLLBACK và SAVEPOINT



Các bạn có thể tạo ra nhiều điểm SAVEPOINT trong giao dịch để có thể quay lại điểm SAVEPOINT đó khi cần bằng câu lệnh ROLLBACK. Trong ví dụ trên, bạn tạo ra 2 điểm check point A và B.  Nếu bạn chỉ gõ câu lệnh ROLLBACK không, thì tất cả các câu lệnh trong giao dịch sẽ bị hủy bỏ. Nếu bạn gõ câu lệnh ROLLBACK to SAVEPOINT B thì câu lệnh INSERT sẽ bị loại bỏ. Còn nếu bạn gõ câu lệnh ROLLBACK to SAVEPOINT A thì  2 câu lệnh INSERT và 1 câu lệnh UPDATE sẽ bị hủy.
Nói chung, một giao dịch có những điểm lưu ý sau:
-          Trạng thái trước của dữ liệu trước khi giao dịch thực hiện có thể phục hồi được (bằng câu lệnh ROLLBACK)
-          Người dùng hiện tại trên giao dịch có thể nhìn thấy dữ liệu mình vừa thay đổi, nhưng những người dùng khác không thể nhìn thấy dữ liệu của một giao dịch chưa COMMIT được.
-          Khi một người dùng cập nhật vào dữ liệu trong một giao dịch, thì người dùng khác khi cố gắng thay đổi dữ liệu đó sẽ phải chờ cho đến khi người dùng trước kết thúc giao dịch.
-          Sau khi kết thúc giao dịch, dữ liệu sẽ được ghi vào Database, trạng thái trước của dữ liệu sẽ bị ghi đè vào.
-          Sau khi kết thúc giao dịch, tất cả người dùng sẽ nhìn thấy dữ liệu mới được cập nhật trong giao dịch, và các SAVEPOINT cũng bị xóa bỏ

  Chào thân ái và hẹn các bạn ở các bài học tiếp theo

  Duydx
( Chuyên gia cao cấp Orafocus Group
   http://orafocus.com.vn


4 nhận xét: