C ƢƠN 2 NGÔN NGỮ TRUY VẤN Ơ SỞ DỮ LIỆU QUAN HỆ VÀ
2.1.2. Câu truy vấn SQL
Cây cú pháp trừu tƣợng1 (Abstract syntax tree – AST) cho phép xây dựng các cấu trúc của mã cho bất kỳ ngôn ngữ với ngữ pháp: các nút AST mang nhãn có thể chứa giá trị là các từ khóa, các đối tƣợng, các biến, hằng số và bất kỳ yếu tố ngôn ngữ trong khi cây cấu trúc cho phép để trừu tƣợng đi những ngôn ngữ khái niệm về phạm vi hoặc phụ thuộc. AST là định dạng máy có thể đọc mã cú pháp cụ thể, và có thể gán với tri thức tìm ẩn hoặc theo ngữ cảnh từ ngữ pháp.
Tất cả các nút AST đƣợc gán với một trong những lớp trừu tƣợng của ngôn ngữ là biểu thức, toán tử, hàm, câu lệnh, danh mục, đối tƣợng.
Hình 2.1. Các nút con của nút AST
Tập hợp các câu lệnh truy vấn SQL đƣợc chia ra thành các nhóm với những mục đích nhƣ sau:
- Kiểm soát truy cập: GRANT, REVOKE - Quản lý phiên làm việc: CONNECT, SET - Định nghĩa dữ liệu: CREATE, ALTER, DROP
- Thao tác dữ liệu: UPDATE, SELECT, INSERT, DELETE - Quản lý giao dịch: COMMIT, ROLLBACK, LOCK TABLE - Câu lệnh nhập xuất
- Câu lệnh thủ tục: CALL
Câu lệnh SQL đƣợc phân đoạn theo các mệnh đề, đƣợc đại diện bằng thuộc
1
tính. Hình 2.2 là tất cả các thuộc tính phụ của sql:clause.
Hình 2.2. Thuộc tính phụ của sql:clause
Một số mệnh đề đƣợc ràng buộc các câu lệnh cụ thể, đƣợc biểu diễn với các rdfs:domain của các thuộc tính. Các mệnh đề khác mang tính tổng quát có thể đƣợc sử dụng trong các loại câu lệnh khác nhau. Ví dụ: mệnh đề FROM có thể đƣợc sử dụng trong câu lệnh SELECT và DELETE.
Các vị từ SQL là những biểu thức và tập hợp biểu thức kết hợp với các toán tử logic, đƣợc đánh giá là các phép toán sử dụng trong mệnh đề WHERE và HAVING và điều kiện JOIN của mệnh đề FROM.
Hình 2.3. Vị từ của SQL
Toán tử SQL là những biểu tƣợng đại diện cho một hành động đƣợc thực hiện trên một hoặc nhiều biểu thức, và cũng bao gồm các kí hiệu nhƣ toán tử null có đánh giá phụ thuộc vào nội dung câu lệnh cục bộ.
Hình 2.4. Toán tử SQL
Hàm SQL là một phần quan trọng nhất của SQL, gồm các hàm tập hợp, các lớp trừu tƣợng đặc trƣng cho các hàm tùy thuộc vào loại dữ liệu mà họ xử lý và kết quả trả lại.
Hình 2.5. Hàm trong SQL
Cuối cùng là danh sách danh mục các đối tƣợng có thể đƣợc thao tác trong câu truy vấn, bằng cách tham khảo chúng với định danh của nó.
Hình 2.6. Danh mục các đối tượng
Những định danh có thể đƣợc gọi là đủ điều kiện, ví dụ cột “name” trong bảng “customers” từ giản đồ “operations” đƣợc đề cập đến trong SQL sử dụng các toán tử thành viên „.‟, kết quả operations.customers.name đƣợc gán là nhận dạng riêng biệt của nó.
a. Câu lệnh SELECT
Trong tất cả các câu lệnh, SELECT là câu lệnh trung tâm của SQL. Nó là nền tảng của sức mạnh và phức tạp nhất trong ngôn ngữ truy vấn. Sử dụng SELECT kết hợp với các từ khóa và các mệnh đề khác để tìm kiếm và xem thông tin từ các bảng của cơ sở dữ liệu. Gần nhƣ bất kỳ câu hỏi liên quan đến ai, cái gì, ở đâu, khi nào,… đều có thể đƣợc trả lời bằng SELECT. Miễn sao có một cơ sở dữ liệu đƣợc thiết kế đúng cách và dữ liệu thích hợp, thì có thể nhận đƣợc câu trả lời chính xác.
Một câu lệnh SELECT bao gồm một số từ khóa khác nhau, đƣợc gọi là mệnh đề. Định nghĩa câu lệnh SELECT bằng cách sử dụng các cấu hình khác nhau của
các mệnh đề này để lấy thông tin theo yêu cầu. Ngoài ra, mỗi mệnh đề có một hoặc nhiều từ khóa đại diện cho yêu cầu hoặc giá trị tùy chọn. Những giá trị này đƣợc sử dụng bởi các mệnh đề để giúp lấy các thông tin theo yêu cầu của câu lệnh SELECT. Hình là sơ đồ đơn giản của câu lệnh SELECT và các mệnh đề của nó.
Hình 2.7. Sơ đồ của câu lệnh SELECT
Ý nghĩa của các mệnh đề trong câu lệnh SELECT:
SELECT: là mệnh đề chính của câu lệnh SELECT. Đƣợc dùng để xác định các cột mong muốn trong kết quả truy vấn. Các cột đƣợc rút ra từ các bảng hoặc đƣợc chỉ định trong mệnh đề FROM. Có thể sử dụng chức năng tổng hợp, biểu thức toán học.
FROM: là mệnh đề quan trọng thứ hai trong câu lệnh SELECT. Dùng mệnh đề FROM để xác định bảng chứa các cột đã đƣợc liệt kê trong mệnh đề SELECT.
WHERE: là mệnh đề bắt buộc khi sử dụng để lọc các hàng trả về bởi mệnh đề FROM. Theo sau từ khóa WHERE là một biểu thức, sử dụng toán tử tiêu chuẩn nhƣ toán tử so sánh, toán tử logic,…
GROUP BY: khi sử dụng hàm tập hợp trong mệnh đề SELECT để tạo thông tin tóm tắt, sử dụng mệnh đề GROUP BY để chia thông tin thành các nhóm riêng biệt. Hệ thống cơ sở dữ liệu sử dụng bất kỳ cột hoặc danh sách các cột sau từ khóa GROUP BY để nhóm cột.
HAVING: mệnh đề HAVING lọc kết quả của hàm tập hợp trong nhóm thông tin. Nó tƣơng tự mệnh đề WHERE, theo sau từ khóa HAVING là một biểu thức logic.
Cú pháp chung của câu lệnh SELECT có dạng: SELECT [ALL | DISTINCT][TOP n] danh_sách_ch ọn [INTO tên_bảng_mới] FROM danh_sách_bảng/khung_nhìn [WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING điều_kiện] [ORDER BY cột_sắp_xếp]
[COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]]
Điều cần lƣu ý đầu tiên đối với câu lệnh này là các thành phần trong câu lệnh SELECT nếu đƣợc sử dụng phải tuân theo đúng thứ tự nhƣ trong cú pháp. Nếu không, câu lệnh sẽ đƣợc xem là không hợp lệ.
Câu lệnh SELECT đƣợc sử dụng để tác động lên các bảng dữ liệu và kết quả của câu lệnh cũng đƣợc hiển thị dƣới dạng bảng, tức là một tập hợp các dòng và các cột (ngoại trừ trƣờng hợp sử dụng câu lệnh SELECT với mệnh đề COMPUTE).
Ví dụ: Dƣới đây hiển thị tên khách hàng và địa chỉ các khách hàng hiện có.
select customername, gender, address from customers
* Danh sách chọn trong câu lệnh SELECT
Danh sách chọn trong câu lệnh SELECT đƣợc sử dụng để chỉ định các trƣờng, các biểu thức cần hiển thị trong các cột của kết quả truy vấn. Các tr ƣờng, các biểu thức đƣợc chỉ định ngay sau từ khoá SELECT và phân cách nhau bởi dấu phẩy. Sử dụng danh sách chọn trong câu lệnh SELECT bao gồm các trƣờng hợp sau:
- Chọn tất cả các cột: Nhƣ đã nói trong chƣơng 1, chúng ta dùng dấu * trong câu lệnh Select để hàm ý chọn hết tất cả các cột. Trong trƣờng hợp này, các cột đƣợc hiển thị trong kết quả truy vấn sẽ tuân theo thứ tự mà chúng đã đƣợc tạo ra khi bảng đƣợc định nghĩa.
- Chọn một số cột cụ thể: Trong trƣờng hợp cần chỉ định cụ thể các cột cần hiển thị trong kết quả truy vấn, ta chỉ định danh sách các t ên cột trong danh sách chọn. Thứ tự của các cột trong kết quả truy vấn tuân theo thứ tự của các trƣờng trong danh sách chọn.
Ví dụ:
Select CUSTOMERNAME, ADDRESS From Customers
Lƣu ý: Nếu truy vấn đƣợc thực hiện trên nhiều bảng/khung nhìn và trong các bảng/khung nhìn có các trƣờng trùng tên thì tên của những trƣờng này nếu xuất hiện trong danh sách chọn phải đƣợc viết dƣới dạng:
tên_bảng.tên_trƣờng Thay đổi tiêu đề các cột:
Trong kết quả truy vấn, tiêu đề của các cột mặc định sẽ là tên của các trƣờng tƣơng ứng trong bảng. Tuy nhiên, để các tiêu đề trở nên thân thiện hơn, ta có thể đổi tên các tiêu đề của các cột. Để đặt tiêu đề cho một cột nào đó, ta sử dụng cách viết:
tiêu_đề_cột = tên_trƣờng hoặc tên_trƣờng AS tiêu_đề_cột hoặc tên_trƣờng tiêu_đề_cột
Ví dụ:
select [ Mã khách hàng] = Customerid, customername as [Tên khách hàng], address [Địa chỉ] from Customers
* Sử dụng cấu trúc CASE…WHEN:
Cấu trúc CASE đƣợc sử dụng trong danh sách chọn nhằm thay đổi kết quả của truy vấn tuỳ thuộc vào các trƣờng hợp khác nhau. Cấu trúc này có cú pháp nhƣ sau:
CASE biểu_thức
WHEN biểu_thức_kiểm_tra THEN kết_quả [ ... ]
[ELSE kết_quả_của_else] END
hoặc: CASE
WHEN điều_kiện THEN kết_quả [ ... ]
[ELSE kết_quả_của_else] END
Ví dụ: Câu lệnh SQL dƣới đây sẽ hiện thị giới tính của khách hàng tùy theo giá trị thực đƣợc lƣu trong CSDL. Nếu giá trị trong CSDL là FALSE-> hiện thị giới tính NỮ, nếu giá trị là TRUE-> hiện thị giới tính NAM.
select CUSTOMERNAME, ADDRESS, case GENDER
when 1 then 'NAM' else N'NỮ' end as [GIỚI TÍNH]
Câu lệnh trên cũng có thể viết nhƣ sau:
select CUSTOMERNAME, ADDRESS, case when GENDER = 1 then 'NAM' else N'NỮ'
end as [GIỚI TÍNH] from customers
b. Câu lệnh INSERT
Câu lệnh INSERT gồm có 2 phiên bản chính. Phiên bản đầu tiên bao gồm từ khóa VALUES và danh sách các giá trị muốn thêm một hàng mới vào một bảng xác định trong cơ sở dữ liệu. Phiên bản thứ hai cho phép ngƣời dùng sử dụng một mệnh đề SELECT để lấy dữ liệu từ một bảng để chèn vào bảng đích.
Chèn thêm giá trị
Mặc dù SQL đƣợc thiết kế chủ yếu để làm việc với các bộ dữ liệu, phần lớp thời gian sẽ sử dụng INSERT để thêm duy nhất một hàng dữ liệu vào một trong các bảng. Cách đơn giản nhất để thêm một hàng vào bảng là sử dụng câu lệnh INSERT với mệnh đề VALUES.
Hình 2.8. Sơ đồ cú pháp của câu lệnh INSERT sử dụng mệnh đề VALUES
Nhƣ sơ đồ cú pháp, câu lệnh bắt đầu với từ khóa INSERT INTO. Tiếp theo chỉ định tên của bảng muốn thêm hàng. Nếu cung cấp giá trị cho tất cả các cột, có thể bỏ qua việc liệt kê danh sách các tên cột. Cuối cùng là từ khóa chỉ định VALUES, và các giá trị cách nhau bằng dấu phẩy nằm trong dấu ngoặc tròn, với các giá trị có trình tự giống nhƣ trình tự của danh sách tên cột. Nếu muốn hệ thống cơ sở dữ liệu sử dụng các giá trị mặc định đã đƣợc định nghĩa cho một cột, sử dụng từ khóa DEFAULT, để cung cấp giá trị Null, sử dụng từ khóa NULL.
Chèn thêm dữ liệu sử dụng SELECT
Đƣợc dùng chèn một tập hợp các hàng vào cơ sở dữ liệu bằng cách sử dụng biểu thức SELECT trong vị trí của mệnh đề VALUES. Bởi vì một biểu thức SELECT trả về các dòng giá trị từ một hoặc nhiều bảng.
Hình 2.9. Sơ đồ cú pháp câu lệnh INSERT sử dụng biểu thức SELECT
Biến thể này của câu lệnh INSERT tƣơng tự nhƣ câu lệnh INSERT tổng quát. Sau từ khóa INSERT INTO là tên của bảng muốn thêm dữ liệu. Nếu biểu thức SELECT trả về cùng số cột và thứ tự nhƣ trong bảng đích, có thể bỏ qua việc liệt kê danh sách tên cột. Cuối cùng là biểu thức SELECT trả về các dòng giá trị cần thêm vào trong bảng đích.
Có hai dạng cú pháp cho lệnh INSERT INTO trong SQL nhƣ sau:
INSERT INTO TABLE_TEN (cot1, cot2, cot3,...cotN)] VALUES (giatri1, giatri2, giatri3,...giatriN);
Ở đây, cot1, cot2,...cotN là tên các cột trong bảng mà bạn muốn chèn dữ liệu.
Bạn có thể không cần xác định tên các cột trong truy vấn SQL nếu bạn đang thêm các giá trị cho tất cả cột của bảng đó. Nhƣng bạn nên đảm bảo thứ tự của các giá trị là giống nhƣ thứ tự các cột trong bảng. Cú pháp của lệnh INSERT INTO này nhƣ sau:
Ví dụ
Các lệnh dƣới đây sẽ tạo 2 bản ghi trong bảng SINHVIEN:
INSERT INTO SINHVIEN (ID,TEN,TUOI,KHOAHOC,HOCPHI)VALUES (1, 'Hoang', 21, 'CNTT', 4.0 );
INSERT INTO SINHVIEN (ID,TEN,TUOI,KHOAHOC,HOCPHI)VALUES (2, 'Viet', 19, 'DTVT', 3.0 );
Bạn có thể tạo thêm một bản ghi trong bảng SINHVIEN bởi sử dụng cú pháp thứ hai nhƣ sau:
INSERT INTO SINHVIEN
VALUES (5, 'Huong', 20, 'TCNH', 5.0 );
Chèn dữ liệu vào một bảng bởi sử dụng bảng khác
Bạn có thể chèn dữ liệu vào một bảng thông qua một lệnh SELECT bởi sử dụng bảng khác mà có một tập hợp các trƣờng, là cần thiết để chèn dữ liệu cho bảng đầu tiên. Dƣới đây là cú pháp:
INSERT INTO ten_bang_dau_tien [(cot1, cot2, ... cotN)] SELECT cot1, cot2, ...cotN
FROM ten_bang_thu_hai [WHERE dieu_kien];
c. Câu lệnh UPDATE
Câu lệnh SELECT cho phép lấy bộ dữ liệu từ các bảng. Câu lệnh UPDATE cũng làm việc với bộ dữ liệu, nhƣng sử dụng nó để thay đổi giá trị của một hoặc nhiều cột và trong một hoặc nhiều hàng. Để thay đổi một giá trị trong một cột, chỉ cần gán một biểu thức cho cột đó. Câu lệnh UPDATE đơn giản hơn nhiều so với câu lệnh SELECT, với ba mệnh đề: UPDATE, SET, và một tùy chọn với mệnh đề WHERE nhƣ trong sơ đồ phía dƣới.
Hình 2.10. Sơ đồ cấu trúc câu lệnh UPDATE
Sau từ khóa UPDATE, xác định tên của bảng muốn cập nhật. Sau từ khóa SET là một hoặc nhiều mệnh đề đƣợc gán giá trị mới cho một cột trong bảng. Sử dụng tùy chọn mệnh đề WHERE để hạn chế các hàng sẽ đƣợc cập nhật trong bảng đích. Theo Hình , các giá trị có thể gán cho một cột trong mệnh đề SET có thể là một biểu thức có giá trị.
Hình 2.11. Sơ đồ cấu trúc của giá trị biểu thức trong câu lệnh UPDATE
Giá trị của biểu thức có thể đƣợc gán bằng chữ hoặc biểu thức giá trị có chứa một giá trị bằng chữ, toán tử, danh sách tên cột trong mệnh đề SET.
Cú pháp cơ bản của truy vấn UPDATE với mệnh đề WHERE nhƣ sau: UPDATE ten_bang
SET cot1 = giatri1, cot2 = giatri2...., cotN = giatriN WHERE [dieu_kien];
Ví dụ: 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.0 || 3 | Thanh | 18 | KTDN | 4 || 4 | Nhan | 19 | CK | 4.5 || 5 | Huong | 20 | TCNH | 5 |+----+---+---+--- ---+---+
Ví dụ sau sẽ cập nhật KHOAHOC cho một sinh viên có ID là 4.
SQL> UPDATE SINHVIEN
SET KHOAHOC = 'TTCK'WHERE ID = 4;
Nếu bạn muốn sửa đổi tất cả giá trị các cột là KHOAHOC và HOCPHI trong bảng này, bạn không cần sử dụng mệnh đề WHERE và khi đó truy vấn UPDATE sẽ nhƣ sau:
SQL> UPDATE SINHVIEN
SET KHOAHOC = 'CNTT', HOCPHI = 4;
d. Câu lệnh DELETE
Câu lệnh DELETE làm việc với bộ dữ liệu theo hàng, giúp loại bỏ tất cả các hàng từ bảng đích. Câu lệnh DELETE chỉ có ba từ khóa: DELETE, FROM và WHERE. Cấu trúc nhƣ Hình :
Hình 2.12. Sơ đồ cấu trúc câu lệnh DELETE
Câu lệnh DELETE là một câu lệnh nguy hiểm khi thực hiện câu truy vấn. Nếu không có mệnh đề WHERE, câu lệnh sẽ loại bỏ tất cả các hàng trong bảng đích.
Cú pháp của câu lệnh này nhƣ sau: DELETE FROM tên_bảng
[FROM danh_sách_bảng] [WHERE điều_kiện]
Trong câu lệnh này, tên của bảng cần xoá dữ liệu đƣợc chỉ định sau DELETE FROM. Mệnh đề WHERE trong câu lệnh đƣợc sử dụng để chỉ định điều kiện đối với các dòng dữ liệu cần xoá. Nếu câu lệnh DELETE không có mệnh đề WHERE thì toàn bộ các dòng dữ liệu trong bảng đều bị xoá.
Ví dụ
DELETE FROM sinhvien
WHERE noisinh LIKE „%HCM%‟
Xoá dữ liệu khi điều kiện liên quan đến nhiều bảng
Nếu điều kiện trong câu lệnh DELETE liên quan đến các bảng không phải là bảng cần xóa dữ liệu, ta phải sử dụng thêm mệnh đề FROM và sau đó là danh sách tên các bảng đó. Trong trƣờng hợp này, trong mệnh đề WHERE ta chỉ định thêm điều kiện nối giữa các bảng.
Sử dụng truy vấn con trong câu lệnh DELETE
Một câu lệnh SELECT có thể đƣợc lồng vào trong mệnh đề WHERE trong câu lệnh DELETE để làm điều kiện cho câu lệnh tƣơng tự nhƣ câu lệnh UPDATE.