[Hệ quản trị cơ sở dữ liệu] Một số nâng cao trong SQL (phần 1)

Mệnh đề/Toán tử UNION trong SQL được sử dụng để kết hợp kết quả của hai hoặc nhiều lệnh SELECT mà không trả về bất cứ bản sao nào của bản ghi.
Để sử dụng UNION, mỗi lệnh SELECT phải có cùng số cột đã chọn, cùng số biểu thức của các cột, cùng kiểu dữ liệu, và chúng có cùng thứ tự, nhưng chúng không cần phải có cùng độ dài.

Cú pháp

Cú pháp cơ bản của mệnh đề UNION trong SQL như sau:
SELECT cot1 [, cot2 ]
FROM bang1 [, bang2 ]
[WHERE dieu_kien]

UNION

SELECT cot1 [, cot2 ]
FROM bang1 [, bang2 ]
[WHERE dieu_kien]
Tại đây, dieu_kien đã cho có thể là bất kỳ biểu thức nào dựa theo yêu cầu của bạn.

Ví dụ

Giả sử có hai bảng, bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Bảng MUONSACH có các bản ghi sau:
+-----+---------------------+-------------+--------+
|STT  | NGAY                | SINHVIEN_ID | SOTIEN |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   320 |
| 100 | 2009-10-08 00:00:00 |           3 |   250 |
| 101 | 2009-11-20 00:00:00 |           2 |   280 |
| 103 | 2008-05-20 00:00:00 |           4 |   290 |
+-----+---------------------+-------------+--------+
Bây giờ, kết hợp hai bảng này trong lệnh SELECT như sau:
SQL> SELECT  ID, TEN, SOTIEN, NGAY
     FROM SINHVIEN
     LEFT JOIN MUONSACH
     ON SINHVIEN.ID = MUONSACH.SINHVIEN_ID
UNION
     SELECT  ID, TEN, SOTIEN, NGAY
     FROM SINHVIEN
     RIGHT JOIN MUONSACH
     ON SINHVIEN.ID = MUONSACH.SINHVIEN_ID;
Ví dụ trên sẽ cho kết quả:
+------+----------+--------+---------------------+
| ID   | TEN     | SOTIEN | NGAY                |
+------+----------+--------+---------------------+
|    1 | Hoang   |   NULL | NULL                |
|    2 | Viet   |   280 | 2009-11-20 00:00:00 |
|    3 | Thanh  |   320 | 2009-10-08 00:00:00 |
|    3 | Thanh  |   250 | 2009-10-08 00:00:00 |
|    4 | Nhan |   290 | 2008-05-20 00:00:00 |
|    5 | Huong   |   NULL | NULL                |
+------+----------+--------+---------------------+

Mệnh đề UNION ALL trong SQL

Toán tử UNION ALL được sử dụng để kết hợp nhiều kết quả của hai lệnh SELECT bao gồm cả các bản sao của các hàng.
Các qui tắc áp dụng cho UNION cũng áp dụng cho toán tử UNION ALL.

Cú pháp

Cú pháp cơ bản của UNION ALL là như sau:
SELECT cot1 [, cot2 ]
FROM bang1 [, bang2 ]
[WHERE dieu_kien]

UNION ALL

SELECT cot1 [, cot2 ]
FROM bang1 [, bang2 ]
[WHERE dieu_kien]
Ở đây, dieu_kien đã cho có thể là bất kỳ biểu thức đã cung cấp nào dựa theo yêu cầu của bạn.

Ví dụ

Giả sử có hai bảng, bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Bảng MUONSACH có các bản ghi sau:
+-----+---------------------+-------------+--------+
|STT  | NGAY                | SINHVIEN_ID | SOTIEN |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   320 |
| 100 | 2009-10-08 00:00:00 |           3 |   250 |
| 101 | 2009-11-20 00:00:00 |           2 |   280 |
| 103 | 2008-05-20 00:00:00 |           4 |   290 |
+-----+---------------------+-------------+--------+
Bây giờ, kết hợp hai bảng trên trong lệnh SELECT như sau:
SQL> SELECT  ID, TEN, SOTIEN, NGAY
     FROM SINHVIEN
     LEFT JOIN MUONSACH
     ON SINHVIEN.ID = MUONSACH.SINHVIEN_ID
UNION ALL
     SELECT  ID, TEN, SOTIEN, NGAY
     FROM SINHVIEN
     RIGHT JOIN MUONSACH
     ON SINHVIEN.ID = MUONSACH.SINHVIEN_ID;
Ví dụ trên sẽ cho kết quả:
+------+----------+--------+---------------------+
| ID   | TEN     | SOTIEN | NGAY                |
+------+----------+--------+---------------------+
|    1 | Hoang   |   NULL | NULL                |
|    2 | Viet   |   280 | 2009-11-20 00:00:00 |
|    3 | Thanh  |   320 | 2009-10-08 00:00:00 |
|    3 | Thanh  |   250 | 2009-10-08 00:00:00 |
|    4 | Nhan |   290 | 2008-05-20 00:00:00 |
|    5 | Huong   |   NULL | NULL                |
|    3 | Thanh  |   320 | 2009-10-08 00:00:00 |
|    3 | Thanh  |   250 | 2009-10-08 00:00:00 |
|    2 | Viet   |   280 | 2009-11-20 00:00:00 |
|    4 | Nhan |   290 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+
Ngoài ra, có hai mệnh đề khác (hoặc toán tử) mà khá tương tự như mệnh đề UNION, bạn truy cập link để tìm hiểu chúng:
  • Mệnh đề INTERSECT trong SQL: được sử dụng để kết hợp hai lệnh SELECT, nhưng trả về các hàng chỉ từ lệnh SELECT đầu tiên mà là đồng nhất với một hàn trong lệnh SELECT thứ hai.
  • Mệnh đề EXCEPT trong SQL : kết hợp hai lệnh SELECT và trả về các hàng từ lệnh SELECT đầu tiên mà không được trả về bởi lệnh SELECT thứ hai.
Giá trị NULL trong SQL là khái niệm được sử dụng để biểu diễn một giá trị bị khuyết thiếu. Một giá trị NULL trong một bảng là một giá trị trong một trường và bị bỏ trống.
Một trường với một giá trị NULL là một trường không có giá trị nào. Nó là thực sự quan trọng để hiểu rằng một giá trị NULL là khác một giá trị 0 (zero value) hoặc một trường mà chứa các dấu cách.

Cú pháp

Cú pháp cơ bản của NULL trong khi tạo một bảng là:
SQL> CREATE TABLE SINHVIEN(
   ID   INT              NOT NULL,
   TEN VARCHAR (20)     NOT NULL,
   TUOI  INT              NOT NULL,
   KHOAHOC  CHAR (25) ,
   HOCPHI   DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);
Ở đây, ràng buộc NOT NULL xác định rằng cột nên luôn luôn chấp nhận một giá trị tường minh của kiểu dữ liệu đã cho. Có hai cột mà chúng ta đã không sử dụng NOT NULL, nghĩa là những cột này có thể là NULL.
Một trường với một giá trị NULL là đã bị bỏ trống trong khi tạo bản ghi.

Ví dụ

Giá trị NULL có thể tạo các vấn đề trong khi chọn lựa dữ liệu, tuy nhiên, bởi vì khi so sánh với một giá trị không biết với bất kỳ giá trị nào khác, kết quả là luôn luôn chưa biết trước và không được bao trong các kết quả cuối cùng.
Bạn phải sử dụng các toán tử IS NULL hoặc IS NOT NULL để kiểm tra một giá trị NULL.
Xét bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4       |
|  2 | Viet    |  19 | DTVT      | 3     |
|  3 | Thanh   |  18 | KTDN      |  4      |
|  4 | Nhan    |  19 | CK        |      |
|  5 | Huong   |  20 | TCNH      |        |
+----+---------+-----+-----------+---------+
Sau đây là cách sử dụng của toán tử IS NOT NULL trong SQL:
SQL> SELECT  ID, TEN, TUOI, KHOAHOC, HOCPHI
     FROM SINHVIEN
     WHERE HOCPHI IS NOT NULL;
Ví dụ trên sẽ cho kết quả:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4       |
|  2 | Viet    |  19 | DTVT      | 3     |
|  3 | Thanh   |  18 | KTDN      |  4      |
+----+----------+-----+-----------+----------+
Sau đây là cách sử dụng của toán tử IS NULL trong SQL:
SQL> SELECT  ID, TEN, TUOI, KHOAHOC, HOCPHI
     FROM SINHVIEN
     WHERE HOCPHI IS NULL;
Ví dụ trên sẽ cho kết quả:
+----+----------+-----+-----------+----------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+----------+-----+-----------+----------+
|  4 | Nhan    |  19 | CK        |      |
|  5 | Huong   |  20 | TCNH      |        |
+----+----------+-----+-----------+----------+
Bạn có thể thay đổi tên tạm thời cho một bảng hoặc một cột bởi cung cấp một tên khác, được biết đến như là alias (bí danh).
Sự sử dụng của Table alias (bí danh bảng) nghĩa là thay tên một bảng trong một lệnh SQL cụ thể. Việc thay tên này là sự thay đổi tạm thời và tên bảng thực sự không thay đổi trong Database.
Column alias (bí danh cột) được sử dụng để thay tên tạm thời cho một cột trong bảng để đáp ứng mục đích của một truy vấn SQL cụ thể.

Cú pháp

Cú pháp của Table alias (bí danh bảng) là như sau:
SELECT cot1, cot2....
FROM ten_bang AS ten_alias
WHERE [dieu_kien];
Cú pháp của Column alias (bí danh cột) là như sau:
SELECT ten_cot AS ten_alias
FROM ten_bang
WHERE [dieu_kien];

Ví dụ

Giả sử có hai bảng, bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Bảng MUONSACH có các bản ghi sau:
+-----+---------------------+-------------+--------+
|STT  | NGAY                | SINHVIEN_ID | SOTIEN |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   320 |
| 100 | 2009-10-08 00:00:00 |           3 |   250 |
| 101 | 2009-11-20 00:00:00 |           2 |   280 |
| 103 | 2008-05-20 00:00:00 |           4 |   290 |
+-----+---------------------+-------------+--------+
Đây là cách sử dụng của Table alias (bí danh bảng) trong SQL:
SQL> SELECT S.ID, S.TEN, S.TUOI, M.SOTIEN 
        FROM SINHVIEN AS S, MUONSACH AS M
        WHERE  S.ID = M.SINHVIEN_ID;
Ví dụ trên sẽ cho kết quả:
+----+----------+-----+--------+
| ID | TEN     | TUOI | SOTIEN |
+----+----------+-----+--------+
|  3 | Thanh  |  18 |   320 |
|  3 | Thanh  |  18 |   250 |
|  2 | Viet   |  19 |   280 |
|  4 | Nhan |  19 |   290 |
+----+----------+-----+--------+
Sau đây là cách sử dụng của Column alias (bí danh cột) trong SQL:
SQL> SELECT  ID AS SINHVIEN_ID, TEN AS SINHVIEN_TEN
     FROM SINHVIEN
     WHERE HOCPHI IS NOT NULL;
Ví dụ trên sẽ cho kết quả:
+-------------+---------------+
| SINHVIEN_ID | SINHVIEN_TEN |
+-------------+---------------+
|           1 | Hoang        |
|           2 | Viet        |
|           3 | Thanh       |
|           4 | Nhan      |
|           5 | Huong        |
+-------------+---------------+
Chỉ mục (Index) là bảng tra cứu đặc biệt mà Database Search Engine có thể sử dụng để tăng nhanh thời gian và hiệu suất thu thập dữ liệu. Hiểu đơn giản, một chỉ mục là một con trỏ tới dữ liệu trong một bảng. Một chỉ mục trong một Database là tương tự như một chỉ mục trong Mục lục của cuốn sách.
Ví dụ, nếu bạn muốn tham chiếu tất cả các trang trong một cuốn sách về một chủ đề nào đó, đầu tiên bạn nghĩ ngay đến mục lục của nó, mà liệt kê tất cả các chương, chủ đề theo thứ tự và sau đó được tham chiếu tới một hoặc nhiều trang cụ thể.
Một chỉ mục giúp tăng tốc các truy vấn SELECT và các mệnh đề WHERE, nhưng nó làm chậm việc dữ liệu nhập vào, với các lệnh UPDATE và INSERT. Các chỉ mục có thể được tạo hoặc xóa mà không ảnh hưởng tới dữ liệu.
Tạo một chỉ mục bởi sử dụng lệnh CREATE INDEX, mà cho phép bạn đặt tên cho chỉ mục, xác định bảng và cột hoặc các cột nào để lập chỉ mục, và để chỉ dẫn chỉ mục là theo thứ tự tăng dần hoặc giảm dần.
Các chỉ mục cũng có thể là duy nhất, tương tự như ràng buộc UNIQUE, trong đó chỉ mục ngăn ngừa các bản sao của các bản ghi trong cột hoặc việc tổ hợp của các cột có chỉ mục.

Lệnh CREATE INDEX trong SQL

Cú pháp cơ bản của lệnh CREATE INDEX trong SQL là như sau:
CREATE INDEX ten_chi_muc ON ten_bang;

Single-Column Index trong SQL

Chỉ mục cho một cột đơn là một chỉ mục được tạo dựa trên chỉ một cột trong bảng. Cú pháp cơ bản là:
CREATE INDEX ten_chi_muc
ON ten_bang (ten_cot);

Unique index trong SQL

Unique index được sử dụng không chỉ để tăng hiệu suất, mà còn cho mục đích toàn vẹn dữ liệu. Một Unique index không cho phép bất kỳ bản sao giá trị nào được chèn vào trong bảng. Cú pháp cơ bản là:
CREATE UNIQUE INDEX ten_chi_muc
on ten_bang (ten_cot);

Composite Index trong SQL

Composite Index là một chỉ mục cho hai hoặc nhiều cột trong một bảng. Cú pháp cơ bản của nó như sau:
CREATE INDEX ten_chi_muc
on ten_bang (cot1, cot2);
Việc tạo một Single-column index hoặc một Composite index tùy thuộc vào sự cân nhắc của bạn về các cột bạn có thể sử dụng thường xuyên trong mệnh đề WHERE của một truy vấn như là các điều kiện lọc.
Nếu chỉ có một cột được sử dụng, thì lựa chọn tốt nhất là Single-column index. Nếu có hai hoặc nhiều cột được sử dụng thường xuyên trong mệnh đề WHERE như là các bộ lọc, thì dạng chỉ mục Composite index là lựa chọn tối ưu.

Implicit Index trong SQL

Implicit Index (có thể hiểu là chỉ mục ngầm định) là chỉ mục mà được tạo tự động bởi Database Server khi một đối tượng được tạo. Các chỉ mục được tạo tự động cho các ràng buộc Primary key và các ràng buộc Unique.

Lệnh DROP INDEX trong SQL

Một chỉ mục có thể bị xóa bởi sử dụng lệnh DROP INDEX trong SQL. Bạn nên cẩn thận trong khi xóa một chỉ mục, bởi vì khi đó hiệu suất có thể chậm hơn hoặc không được cải thiện.
Cú pháp cơ bản của lệnh DROP INDEX là như sau:
DROP INDEX ten_chi_muc;
Bạn có thể tìm hiểu về Ràng buộc INDEX trong SQL để theo dõi các ví dụ về chỉ mục.

Khi nào nên tránh sử dụng chỉ mục trong SQL?

Mặc dù các chỉ mục nhằm mục đích để nâng cao hiệu suất của Database, nhưng đôi khi, bạn nên tránh dùng chúng. Dưới đây là một số điểm bạn cần xem xét để quyết định có nên sử dụng chỉ mục hay không:
  • Các chỉ mục không nên được sử dụng trong các bảng nhỏ.
  • Bảng mà thường xuyên có các hoạt động update, insert.
  • Các chỉ mục không nên được sử dụng trên các cột mà chứa một số lượng lớn giá trị NULL.
  • Không nên dùng chỉ mục trên các cột mà thường xuyên bị sửa đổi.
Một view là không gì khác ngoài môt lệnh SQL mà được lưu giữ trong Database với một tên liên kết. Một view thực sự là một thành phần của một bảng trong form của một truy vấn SQL đã được định nghĩa trước.
Một view có thể chứa tất cả các hàng của một bảng hoặc các hàng đã được chọn từ một bảng. Một view có thể được tạo từ một hoặc nhiều bảng, phụ thuộc vào truy vấn SQL đã viết để tạo một view.
View, về bản chất giống các Virtual Table (bảng ảo), cho phép người dùng thực hiện:
  • Cấu trúc dữ liệu theo cách mà người dùng tìm thấy tính tự nhiên hoặc tính trực quan.
  • Giới hạn truy cập tới dữ liệu để mà một người dùng có thể thấy và (đôi khi) sửa đổi một cách chính xác nhưng gì họ cần.
  • Tổng kết dữ liệu từ các bảng đa dạng để tạo các bản báo cáo.

Tạo View trong SQL

View được tạo bởi sử dụng lệnh CREATE VIEW. Các view có thể được tạo từ một bảng đơn, nhiều bảng hoặc từ view khác.
Để tạo một view, người dùng phải được trao quyền hệ thống thích hợp theo trình triển khai cụ thể.
Cú pháp cơ bản của lệnh CREATE VIEW trong SQL là như sau:
CREATE VIEW ten_view AS
SELECT cot1, cot2.....
FROM ten_bang
WHERE [dieu_kien];
Bạn có thể bao nhiều bảng trong lệnh SELECT theo cách tương tự như bạn sử dụng chúng trong truy vấn SELECT thông thường.

Ví dụ

Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Bây giờ là một ví dụ để tạo một view từ bảng này. View này sẽ được sử dụng để có TEN và TUOI của sinh viên:
SQL > CREATE VIEW SINHVIEN_VIEW AS
SELECT TEN, TUOI
FROM  SINHVIEN;
Bây giờ, bạn có thể truy vấn SINHVIEN_VIEW theo cách tương tự bạn truy vấn một bảng thực sự. Sau đây là ví dụ:
SQL > SELECT * FROM SINHVIEN_VIEW;
Ví dụ trên sẽ cho kết quả:
+----------+-----+
| TEN     | TUOI |
+----------+-----+
| Hoang   |  21 |
| Viet   |  19 |
| Thanh  |  18 |
| Nhan |  19 |
| Huong   |  20 |
+----------+-----+

WITH CHECK OPTION trong SQL

WITH CHECK OPTION là một tùy chọn của lệnh CREATE VIEW. Mục đích của WITH CHECK OPTION là để bảo đảm rằng tất cả UPDATE và INSERT thỏa mãn các điều kiện trong định nghĩa view.
Nếu chúng không thỏa mãn các điều kiện, thì UPDATE và INSERT trả về một lỗi.
Ví dụ sau tạo cùng một view là SINHVIEN_VIEW với WITH CHECK OPTION.
CREATE VIEW SINHVIEN_VIEW AS
SELECT TEN, TUOI
FROM  SINHVIEN
WHERE TUOI IS NOT NULL
WITH CHECK OPTION;
Trong trường hợp này, WITH CHECK OPTION nên từ chối bất kỳ giá trị NULL nào trong cột TUOI của view, bởi vì view được định nghĩa bởi dữ liệu mà không có giá trị NULL trong cột TUOI.

Cập nhật một View trong SQL

Một view có thể được cập nhật dưới các điều kiện cụ thể sau:
  • Mệnh đề SELECT không thể chứa từ khóa DISTINCT.
  • Mệnh đề SELECT không thể chứa các hàm tổng.
  • Mệnh đề SELECT không thể chứa các hàm tập hợp.
  • Mệnh đề SELECT không thể chứa các toán tử tập hợp.
  • Mệnh đề SELECT không thể chứa một mệnh đề ORDER BY.
  • Mệnh đề FROM không thể chứa nhiều bảng.
  • Mệnh đề WHERE không thể chứa các truy vấn phụ.
  • Truy vấn không thể chứa GROUP BY hoặc HAVING.
  • Các cột được ước lượng không thể bị cập nhật.
  • Tất cả các cột NOT NULL từ bảng ban đầu phải được bao trong view để cho truy vấn INSERT vận hành.
Vì thế, nếu một view thỏa mãn tất cả các qui tắc trên, thì bạn có thể cập nhật một view. Sau đây là ví dụ cập nhật TUOI của Hoang.
SQL > UPDATE SINHVIEN_VIEW
      SET TUOI = 20
      WHERE TEN='Hoang';
Cuối cùng, bảng SINHVIEN ban đầu được cập nhật và theo đó view được cập nhật. Bây giờ, thử truy vấn bảng ban đầu, và lệnh SELECT sẽ cho kết quả:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  20 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+

Chèn các hàng vào trong một View trong SQL

Các hàng dữ liệu có thể được chèn vào trong một view. Các qui tắc áp dụng cho lệnh UPDATE cũng sẽ được áp dụng cho lệnh INSERT trong SQL.
Ở đây, chúng ta không thể chèn các hàng vào trong SINHVIEN_VIEW bởi vì chúng ta không được bao gồm tất cả cột NOT NULL trong view này. Chúng ta có thể chèn các hàng vào trong một view theo cách tương tự khi bạn chèn chúng vào trong một bảng.

Xóa hàng từ một View trong SQL

Các hàng dữ liệu có thể bị xóa từ một view. Các qui tắc áp dụng cho lệnh UPDATE và lệnh INSERT cũng sẽ được áp dụng cho lệnh DELETE trong SQL.
Ví dụ sau sẽ xóa một hàng có TUOI = 18.
SQL > DELETE FROM SINHVIEN_VIEW
      WHERE TUOI = 18;
Cuối cùng, một hàng trong bảng SINHVIEN ban đầu sẽ bị xóa và kết quả tương tự với chính view đó. Bây giờ, thử truy vấn bảng ban đầu, và lệnh SELECT sẽ cho kết quả:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+

Xóa View trong SQL

Rõ ràng là, khi bạn đã có một view, và việc không cần thiết sử dụng view này nữa thì điều cần làm là xóa chúng đi. Cú pháp cơ bản để xóa view trong SQL như sau:
DROP VIEW ten_view;
Ví dụ sau để xóa SINHVIEN_VIEW từ bảng ban đầu.
DROP VIEW SINHVIEN_VIEW;
Mệnh đề HAVING trong SQL cho bạn khả năng để xác định các điều kiện để lọc nhóm kết quả nào sẽ xuất hiện trong kết quả cuối cùng.
Mệnh đề WHERE đặt các điều kiện trên các cột đã lựa chọn, trong khi mệnh đề HAVING đặt các điều kiện trên các nhóm đã được tạo bởi mệnh đề GROUP BY.

Cú pháp

Sau đây là vị trí của mệnh đề HAVING trong một truy vấn SQL.
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Mệnh đề HAVING phải theo sau mệnh đề GROUP By trong một truy vấn và cũng phải đặt trước mệnh đề ORDER BY nếu được sử dụng. Dưới đây là cú pháp của lệnh SELECT với mệnh đề HAVING.
SELECT cot1, cot2
FROM bang1, bang2
WHERE [ cac_dieu_kien ]
GROUP BY cot1, cot2
HAVING [ cac_dieu_kien ]
ORDER BY cot1, cot2

Ví dụ

Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Ví dụ sau sẽ hiển thị bản ghi mà có điều kiện là COUNT (tuoi) >= 2.
SQL > SELECT ID, TEN, TUOI, KHOAHOC, HOCPHI
FROM SINHVIEN
GROUP BY TUOI
HAVING COUNT(TUOI) >= 2;
Transaction trong SQL là một đơn vị công việc được thực hiện bởi một Database. Transaction là đơn vị hoặc dãy công việc được thực hiện theo một thứ tự logic và hợp lý, có thể được thao tác bởi người dùng hoặc bởi một Database program.
Một transaction là một sự lan truyền của một hoặc nhiều thay đổi tới Database. Ví dụ, nếu bạn đang tạo một bản ghi hoặc cập nhật một bản ghi hoặc xóa một bản ghi từ một bảng, thì bạn đang thực hiện transaction trên bảng đó. Nó là quan trọng để điều khiển các transaction để bảo đảm toàn vẹn dữ liệu và để xử lý các Database Error.
Thực tế, bạn sẽ tập hợp nhiều truy vấn SQL vào trong một nhóm và sẽ thực thi tất cả truy vấn này cùng với nhau như là một phần của một transaction.

Property của Transaction trong SQL

Transaction có 4 property chuẩn, thường được tham chiếu bởi tên lược danh là ACID:
  • Atomicity: bảo đảm rằng tất cả hoạt động bên trong đơn vị công việc được hoàn thành một cách thành công; nếu không, transaction bị ngừng ở điểm thất bại, và các hoạt động trước được trao trả về trạng thái trước đó.
  • Consistency: bảo đảm rằng Database thay đổi một cách chính xác trạng thái theo một transaction đã được ký thác thành công.
  • Isolation: cho các transaction khả năng hoạt động một cách độc lập và không liên quan đến nhau.
  • Durability: bảo đảm rằng kết quả hoặc tác động của một transaction, mà đã được ký thác, vẫn còn tồn tại trong trường hợp hệ thống thất bại.

Điều khiển transaction trong SQL

Trong SQL, có các lệnh sau được sử dụng để điều khiển transaction:
  • COMMIT: để lưu các thay đổi.
  • ROLLBACK: để quay trở lại trạng thái trước khi có thay đổi.
  • SAVEPOINT: tạo các điểm (point) bên trong các nhóm transaction để ROLLBACK, tức là để quay trở lại điểm trạng thái đó.
  • SET TRANSACTION: đặt một tên cho một transaction.
Các lệnh điều khiển transaction chỉ được sử dụng với các lệnh INSERT, UPDATE và DELETE. Chúng không thể được sử dụng trong khi tạo và xóa bảng, bởi vì những hoạt động này được ký thác tự động trong Database.

Lệnh COMMIT trong SQL

Lệnh COMMIT là lệnh điều khiển transaction được sử dụng để lưu các thay đổi đã được triệu hồi bởi một transaction tới Database.
Lệnh COMMIT lưu giữ tất cả transaction trong Database từ lệnh COMMIT hoặc ROLLBACK cuối cùng.
Cú pháp cơ bản của lệnh COMMIT là như sau:
COMMIT;

Ví dụ

Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Ví dụ sau sẽ xóa các bản ghi từ bảng mà có tuoi = 19 và sau đó COMMIT các thay đổi vào trong Database.
SQL> DELETE FROM SINHVIEN
     WHERE TUOI = 19;
SQL> COMMIT;
Trong kết quả thu được, hai hàng của bảng sẽ bị xóa và lệnh SELECT sẽ cho kết quả sau:
+----+----------+-----+-----------+----------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+----------+-----+-----------+----------+

Lệnh ROLLBACK trong SQL

Lệnh ROLLBACK là lệnh điều khiển transaction được sử dụng để trao trả transaction về trạng thái trước khi có các thay đổi mà chưa được lưu tới Database.
Lệnh ROLLBACK chỉ có thể được sử dụng để undo các transaction từ lệnh COMMIT hoặc ROLLBACK cuối cùng được thông báo.
Cú pháp cơ bản của lệnh ROLLBACK như sau:
ROLLBACK;

Ví dụ

Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Bây giờ sử dụng lệnh ROLLBACK với lệnh xóa tuoi = 19, mà chưa được commit như sau:
SQL> DELETE FROM SINHVIEN
     WHERE TUOI = 19;
SQL> ROLLBACK;
Trong kết quả thu được, hoạt động Delete này không ảnh hưởng tới bảng và lệnh SELECT sẽ cho kết quả:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+

Lệnh SAVEPOINT trong SQL

Một SAVEPOINT là một điểm (point) trong một transaction khi bạn có thể lùi transaction về một điểm cụ thể mà không cần lùi transaction về trạng thái đầu trước khi có thay đổi đó.
Cú pháp cơ bản của lệnh SAVEPOINT như sau:
SAVEPOINT TEN_CUA_SAVEPOINT;
Lệnh này chỉ phục vụ trong việc tạo một SAVEPOINT trong các lệnh điều khiển transaction. Lệnh ROLLBACK được sử dụng để undo một nhóm các transaction.
Cú pháp để lùi về một SAVEPOINT như sau:
ROLLBACK TO TEN_CUA_SAVEPOINT;
Trong ví dụ sau, bạn muốn xóa 3 bản ghi khác nhau từ bảng SINHVIEN. Bạn muốn tạo một SAVEPOINT trước mỗi lệnh DELETE, để mà bạn có thể ROLLBACK về bất kỳ SAVEPOINT nào tại bất cứ lúc nào để trả dữ liệu thích hợp về trạng thái ban đầu của nó.

Ví dụ

Bảng SINHVIEN có các bản ghi sau:
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
Dưới đây là một dãy các hoạt động:
SQL> SAVEPOINT SP1;
Savepoint created.
SQL> DELETE FROM SINHVIEN WHERE ID=1;
1 row deleted.
SQL> SAVEPOINT SP2;
Savepoint created.
SQL> DELETE FROM SINHVIEN WHERE ID=2;
1 row deleted.
SQL> SAVEPOINT SP3;
Savepoint created.
SQL> DELETE FROM SINHVIEN WHERE ID=3;
1 row deleted.
Ở trên, có 3 hoạt động xóa diễn ra. Sau một lúc, bạn thay đổi suy nghĩ và quyết định ROLLBACK về SAVEPOINT mà bạn đã xác định là SP2. Bởi vì SP2 được tạo sau hoạt động xóa đầu tiên, do đó hai hoạt động xóa cuối cùng được undo.
SQL> ROLLBACK TO SP2;
Rollback complete.
Chú ý rằng, chỉ có hoạt động xóa đầu tiên diễn ra khi bạn rollback về SP2.
SQL> SELECT * FROM SINHVIEN;
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
4 rows selected.

Lệnh RELEASE SAVEPOINT trong SQL

Lệnh RELEASE SAVEPOINT được sử dụng để xóa một SAVEPOINT mà bạn đã tạo.
Cú pháp cơ bản của lệnh RELEASE SAVEPOINT trong SQL như sau:
RELEASE SAVEPOINT TEN_CUA_SAVEPOINT;
Một khi một SAVEPOINT đã bị xóa, bạn không thể sử dụng lệnh ROLLBACK để lùi transaction về SAVEPOINT đó nữa.

Lệnh SET TRANSACTION trong SQL

Lệnh SET TRANSACTION có thể được sử dụng để khởi tạo một Database Transaction. Lệnh này được sử dụng để xác định đặc trưng cho transaction đó.
Ví dụ, bạn có thể xác định một transaction là read only hoặc read write.
Cú pháp cơ bản của lệnh SET TRANSACTION trong SQL như sau:
SET TRANSACTION [ READ WRITE | READ ONLY ];


Mới hơn Cũ hơn

Biểu mẫu liên hệ