Như ta đã biết, mỗi biểu thức khi tính toán đều phải trả một giá nhất định về thời gian, bộ nhớ. Do đó vấn đề làm thế nào để giảm bớt thời gian tính toán, giảm bộ nhớ càng nhiều càng tốt là một vấn đề cần quan tâm. Để đạt được điều này, trước khi thực hiện các câu hỏi ta cần phải thực hiện các phép biến đổi thích hợp sao cho chi phí về bộ nhớ, thời gian tính toán của biểu thức nhận được giảm so biểu thức ban đầu. Công việc này được gọi là tối ưu hoá câu hỏi (Optimiztation). Tuy nhiên việc tối ưu hoá không nhất thiết phải tối ưu trên mọi khả năng có thể của các cách cài đặt các câu hỏi. Trong phạm vi môn học này ta chỉ quan tâm đến một số phương pháp tối ưu hoá các biểu thức quan hệ, trong đó chủ yếu quan tâm đến việc xử lý các biểu thức có liên quan đến các phép kết nối, phép tích đề các.
a) Chiến lược tối ưu cơ bản
Khi trả lời câu hỏi bằng biểu thức đại số quan hệ, có những phép toán sinh ra những quan hệ lớn như phép kết nối, phép tích đề các, ngược lại có những phép toán làm giảm kích thước quan hệ nhanh như phép chọn, phép chiếu. Vì vậy chiến lược tối ưu hoá câu hỏi cơ bản là tìm cách tổ chức lại câu hỏi để giảm bớt thời gian tính toán của biểu thức.
Ví dụ: Cho CSDL thư viện bao gồm các quan hệ sau:
SACH(MaS, TenS, NamXB, Kichthuoc, MaTG, MaNXB): Quan hệ sách.
TACGIA(MaTG, TenTG, ĐiachiTG, ĐthoaiTG)
NXB(MaNXB, TenNXB, ĐiachiNXB, ĐThoạiNXB): Quan hệ nhà XB.
DOCGIA(SotheĐG, TenDG, ĐiachiĐG, ĐthoaiĐG): Quan hệ độc giả.
MUON( SotheĐG, MaS, NgayM, NgayHentra): Quan hệ sổ mượn. Biểu thức đại số quan hệ trả lời câu hỏi: Đưa ra tên những cuốn sách của tác giả “Nguyen Van A” đã cho mượn trước ngày 10/8/2008 được viết
ΠTenS(σ (NgayM < 10/8/2008)∧(TenTG=”Nguyen Van An”)((MUON * SACH)* TACGIA))
Ta có thể đưa biểu thức đó về biểu thức tương đương sau đây với thời gian tính toán ít hơn
ΠTenS(ΠMaS(σNgayM<10/8/2008(MUON))*ΠMaS,TenS,MaTG(SACH)*ΠMaTG(σ
TenTG= ”Nguyen Van An”(TACGIA)))
b) Các chiến lược tối ưu tổng quát
Ullman đã đưa ra 6 chiến lược tổng quát sau đây để tối ưu hoá câu hỏi:
2. Tổ hợp những phép chọn với phép tích đề các thành phép kết nối.
3. Tổ hợp dãy các phép tính một ngôi như phép chọn, phép chiếu. 4. Tìm các biểu thức con chung trong một biểu thức.
5. Xử lý các tệp trước khi tính toán (Chẳng hạn sắp xếp, tạo tệp chỉ số).
6. Đánh giá trước khi thực hiện tính toán.
c) Các phép biến đổi`tương đương
Để thực hiện việc tối ưu hoá biểu thức đại số quan hệ, ta dựa vào các phép biến đổi tương đương các biểu thức. Giả sử r1, r2, r3 là các quan hệ và E1, E2 là các biểu thức chọn. Khi đó ta có các phép biến đổi tương đương sau:
(1) (r1 × r2) × r3 = r1 × (r2 × r3) (r1 * r2) * r3 = r1 * (r2 * r3)
nếu không quan tâm đến thứ tự các thuộc tính và các phép kết nối đều có nghĩa.
(2) Nếu E1, E2,..., E3 là các biểu thức điều kiện thì: σE1(σE2 ...(σEn (r)...)) = σE1 ∧ E2 ∧. . . ∧ En(r)
(3) Nếu X ⊆ Y thì ΠX (ΠY(r)) = ΠX(r)
(4) Nếu E là biểu thức chọn phát biểu trên X thì: σE (ΠX(r))=ΠX
(σE (r))
(5) Cho hai quan hệ r(U) và s(V). Nếu E1, E2 là biểu thức chọn phát biểu trên U, V tương ứng. Khi đó
σE1 ∧ E2(r * s) = σE1(r )* σE2(s) (6) σE1∧E2 (r) = σE1(r) ∩ σE2(r) σE1∨E2 (r) = σE1(r) ∪ σE2(r) (7) σE (r ∪ s) = σE (r) ∪ σE(s ) (8) σE (r- s) = σE (r) - σE (s )
(9) ΠX(r(U) × s(V))= ΠX∩U (r(U)) × ΠX∩ V (s(V)) (10) ΠX(r ∪ s)= ΠX (r) ∪ ΠX(s)
Ví dụ: Cho CSDL thư viện bao gồm các quan hệ sau:
SACH(MaS, TenS, NamXB, Kichthuoc, MaTG, MaNXB): Quan hệ sách.
TACGIA(MaTG, TenTG, ĐiachiTG, ĐthoaiTG)
NXB(MaNXB, TenNXB, ĐiachiNXB, ĐThoạiNXB): Quan hệ nhà XB.
DOCGIA(SotheĐG, TenĐG, ĐiachiĐG, ĐthoaiĐG): Quan hệ độc giả.
MUON( SotheĐG, MaS, NgayM, NgayHentra): Quan hệ sổ mượn. a) Tối ưu hoá biểu`thức đại số quan hệ sau:
ΠTenS(σ (NgayM < 10/8/2008)∧(TenTG=”Nguyen Van An”)((MUON * SACH)* TACGIA))
Trước hết ta thấy thuộc tính NgayM thuộc quan hệ MUON, thuộc tính TenTG thuộc quan hệ TACGIA nên áp dụng công thức (5) ta được
ΠTenS(σNgayM<10/8/2008(MUON)) * SACH * σTenTG= ”Nguyen Van An”(TACGIA)) Áp dụng công thức (3) ta thu được
ΠTenS(ΠMaS(σNgayM<10/8/2008(MUON))*ΠMaS,TenS,MaTG(SACH)*ΠMaTG(σ
TenTG= ”Nguyen Van An”(TACGIA)))
b) Trả lời câu hỏi sau bằng biểu thức đại số quan hệ và tối ưu hoá biểu thức đó.
Cho xem số thẻ, tên của các độc giả đã mượn sách của tác giả “Nguyen An” được xuất bản tại nhà xuất bản “Giáo dục” hoặc nhà xuất bản “KHKT”
Biểu thức đại số quan hệ:
Π{SotheĐG,TenĐG}(σ (TenTG=”Nguyen An”)∧(TenNXB=”Giao duc” ∨ TenNXB=”KHKT”)
Tối ưu hoá:
Áp dụng công thức (5) ta thu đuợc
Π{SotheĐG,TenĐG}(MUON*DOCGIA*SACH*σ(TenTG=”Nguyen An”)
(TACGIA)* σ(TenNXB=”Giao duc”)∨(TenNXB=”KHKT” ) (NXB)) Áp dụng công thức (6) ta thu đuợc
Π{SotheĐG,TenĐG}(MUON*DOCGIA*SACH * σ (TenTG=”Nguyen An”)
(TACGIA)*(σTenNXB=”Giao duc” (NXB) ∪ σTenNXB=”KHKT”(NXB))) Áp dụng công thức (3) ta có
Π{SotheĐG,TenĐG}(Π{SotheĐG, MaS}}(MUON)* Π{SotheĐG,TenĐG} (DOCGIA) * Π{MaS, MaTG, MaNXB}(SACH) * ΠMaTG(σ(TenTG=”NguyenAn”) (TACGIA)* ΠMaNXB(σTenNXB=”Giao duc” (NXB) ∪ σTenNXB=”KHKT”(NXB)))
- Có thể tiếp tục một số bước tối ưu tiếp. Tuy nhiên ta chỉ dừng lại ở đây với kết quả chấp nhận được.
CÂU HỎI VÀ BÀI TẬP
1. Cho CSDL gồm các quan hệ sau:
SV(MãSV, TênSV, Địachỉ, Nămsinh, MãKh)
CBGD(MãCB, TênCB, Môndạy, ĐThoạiCB, MãKh) KHOA(MãKh, TênKh, Vịtrí, TrKhoa, ĐThoạiKh). Tìm lời giải đại số tối ưu cho các câu hỏi sau:
a. Cho xem TênSV, Nămsinh của các sinh viên có địa chỉ ở "Hà Nội" và học khoa "CNTT"
b. Cho xem Tên, môn dạy, điện thoại của các cán bộ khoa "CNTT"
2. Cho cơ sở dữ liệu gồm các quan hệ:
SACH(MaS, TenS, NamXB, Kichthuoc, MaTG, MaNXB): Quan hệ sách.
NXB(MaNXB, TenNXB, ĐiachiNXB, ĐThoạiNXB): Quan hệ nhà XB.
DOCGIA(SotheĐG, TenĐG, ĐiachiĐG, ĐthoaiĐG): Quan hệ độc giả.
MUON( SotheĐG, MaS, NgayM, NgayHentra): Quan hệ sổ mượn. Hãy đưa ra biểu thức đại số quan hệ tối ưu trả lời các câu hỏi sau đây
a. Cho biết tên những cuốn sách xuất bản năm 2007 của tác giả “Lê Anh”.
b. Cho biết mã, tên những cuốn sách của tác giả “Lê Anh” được xuất bản tại nhà xuất bản “Giáo dục” năm 2007.
3.2. NGÔN NGỮ SQL (STRUCTURED QUERY LANGUAGE )
SQL là sản phẩm của công ty IBM San jose California USA. Ngôn ngữ SQL được phát triển từ ngôn ngữ SEQUEL (Structured English Query Language) giới thiệu năm 1976. Ngay sau khi ra đời SQL đã được ứng dụng rộng rãi trong lĩnh vực khai thác cơ sở dữ liệu quan hệ. Hiện nay, hầu hết các hệ quản trị cơ sở dữ liệu đều có cài đặt ngôn ngữ này.
SQL là ngôn ngữ phi thủ tục điển hình. Các phép toán cơ bản trong SQL là các ánh xạ được mô tả dưới dạng khối Select - From - Where. Các thuật ngữ trong CSDL quan hệ như: Quan hệ, thuộc tính, bộ được thay thế bằng các thuật ngữ như: bảng (table), cột (columm), bản ghi (record ) hay hàng (row).
Khả năng của SQL gồm:
• Định nghĩa dữ liệu: tạo cơ sở dữ liệu và cấu trúc bảng của nó, • Truy vấn dữ liệu,
• Sửa đổi dữ liệu: thêm, xoá và cập nhật.
3.2.1. Các lệnh về kiến trúc cơ sở dữ liệu a) Tạo bảng a) Tạo bảng
Cú pháp:
CREATE TABLE <Tên_bảng>
(<Tên_cột_1> <Kiểu_dữ_liệu_1> [Not null ], <Tên_cột_2> <Kiểu_dữ_liệu_2> [Not null], . . .
<Tên_cột_n> <Kiểu_dữ_liệu_n> [Not null]) PRIMARY KEY (Khóa_chính)
[UNIQUE (Khóa_dự _phòng)]
[FOREIGN KEY (Khóa_ngoài) REFERENCES
<Bảng_tham_chiếu>] [on update cascade][on delete cascade|on delete restrict]]
[CHECK(<Điều_kiện_ràng_buộc>)] Trong đó:
(1) <Tên_bảng>: Là xâu ký tự bất kỳ không trùng từ khóa, không chứa dấu cách.
(2) <Tên_cột_i> (i=1,..,n): Là xâu ký tự bất kỳ, không chứa dấu cách trống. Trong một bảng tên cột là duy nhất. Thứ tự các cột không quan trọng.
(3) <Kiểu_dữ_liệu_i> (i=1,…,n): Là kiểu dữ liệu của cột i. Kiểu dữ liệu có thể chọn một trong các loại sau:
• Char( n): Xâu ký tự có độ dài cố định n ( n <=255).
• Varchar(n): Xâu ký tự có độ dài nhỏ hơn hoặc bằng n.
• Int: Số nguyên từ: -2147483648 đến 2147483647.
• Smallint: Số nguyên từ - 32768 đến 32767.
• Numeric(n,p): Số thực với độ dài tối đa là n chữ số trong đó có p chữ số thập phân.
• Float: Số thực dạng dấu chấm động với ít nhất là n chữ số.
• Date: Kiểu ngày tháng (gồm năm, tháng, ngày).
• Time: Kiểu thời gian (gồm giờ, phút, giây).
(4) Chỉ thị Not null: Chỉ rằng cột không nhận giá trị rỗng. Ngầm định là null. Thuộc tính khóa ngầm định là Not null.
(5) Chỉ thị PRIMARY KEY (Khóa_chính): Khai báo khóa
chính của bảng. Khóa chính có thể là một cột hoặc một tập các cột.
(6)Chỉ thịUNIQUE(Khóa): Khai báo các khóa khác (khóa dự
phòng) nếu có.
(7) Chỉ thị FOREIGN KEY (Khóa_ngoài) REFERENCES
<Bảng_tham_chiếu>[(khóa)]
Khai báo các khóa ngoài của bảng. <Bảng_tham_chiếu> là bảng mà khóa_ngoài tham chiếu tới.
(8) Chỉ thị On update cascade: Cho phép cập nhật lan truyền. Tức là khi giá trị trên cột khóa chính của <bảng_tham_chiếu> thay đổi thì giá trị trên cột khóa ngoài cũng thay đổi theo.
(9) Chỉ thị On delete cascade: Cho phép xoá lan truyền. Có nghĩa là nếu các bản ghi của <bảng_tham_chiếu> bị xoá thì các bản ghi của bảng có khóa ngoài mang giá trị giống khóa chính của <bảng_tham_chiếu> cũng bị xoá theo.
(10) Chỉ thị On delete restrict: Ngăn cấm xoá. Có nghĩa là nếu tồn tại một bản ghi trong bảng có khóa ngoài mang giá trị giống khóa chính của <bảng_tham_chiếu> thì không thể xoá bản ghi này từ <bảng_tham_chiếu>.
(11) Chỉ thị CHECK(<Điều_kiện_ràng_buộc>): Đây là điều kiện mà các bản ghi trong bảng phải thỏa mãn.
Trong phần này, để tìm hiểu các câu lệnh SQL, ta sử dụng cơ sở dữ liệu BanHang gồm 5 bảng như sau:
+ Bảng MATHANG lưu trữ thông tin về những mặt hàng được bán tại cửa hàng gồm:
MaMH: Mã mặt hàng, TenMH: Tên mặt hàng, DVTinh: Đơn vị tính.
+ Bảng NHACC lưu trữ thông tin về các nhà cung cấp mặt hàng cho cửa hàng gồm:
MaNCC: Mã nhà cung cấp, TenNCC: Tên nhà cung cấp, DChiNCC: địa chỉ nhà cung cấp, DThoạiNCC: Điện thoại nhà cung cấp, TKhoanNCC: Tài khoản nhà cung cấp.
+ Bảng MH_NCC là bảng trung gian giữa MATHANG và NHACC:
MaMH: Mã mặt hàng, MaNCC: Mã nhà cung cấp, Dongia: Đơn giá nhập.
MH_NCC MaMH MaNCC Dongia NHACC MaNCC TenNCC DChiNCC DThoaiNCC TKhoanNCC MATHANG MaMH TenMH DVTinh HOADON SoHD NgayHD MaKH KHACHHANG MaKH TenKH DChiKH DThoaiKH TKhoanKH HD_MH SoHD MaMH Soluong Dongia TTien
+ Bảng KHACHHANG lưu trữ thông tin về khách hàng của cửa hàng gồm:
MaKH: Mã khách hàng, TenKH: Tên khách hàng, DChỉKH: Địa chỉ khách hàng, DThoaiKH: Điện thoại khách hàng, TKhoanKH: Tài khoản KH.
+ Bảng HOADON lưu trữ thông tin trên hoá đơn bán hàng gồm: SoHD: Số hoá đơn,
NgayHD: Ngày trên hoá đơn, MaKH: Mã khách hàng.
+ Bảng HD_MH là bảng trung gian giữa HOADON và MATHANG: SoHD: Số hoá đơn,
MaMH: Mã mặt hàng, SLuong: Số lượng, DonGia: Đơn giá, TTien: Thành tiền.
Ví dụ: Tạo các bảng trong CSDL bán hàng:
NhaCC(MaNCC,TenNCC, DChiNCC, DThoaiNCC, TKhoanNCC) MatHang(MaMH, TenMH, DVTinh)
MH_NCC(MaNCC, MaMH, DonGia)
KhachHang(MaKH, TenKH, DChiKH, DThoaiKH, TKhoanKH) HoaDon (SoHD, NgayHD, MaKH )
HD_MH(SoHD, MaMH, Soluong, DonGia, TTien)
* Tạo bảng NHACC
(MaNCC char(3) NOT NULL, TenNCC varchar(50) NOT NULL, DChiNCC varchar(50) NOT NULL, DThoaiNCC varchar (10),
TKhoanNCC varchar (20)) PRIMARY KEY (MaNCC))
* Tạo bảng MATHANG CREATE TABLE MatHang
(MaMH char(5) NOT NULL, TenMH varchar(50) NOT NULL, DVTinh varchar(10) NOT NULL) PRIMARY KEY (MaMH)
* Tạo bảng MH_NCC
CREATE TABLE MH_NCC
(MaMH char(5) NOT NULL, MaNCC char(3) NOT NULL, DonGia int NOT NULL) PRIMARY KEY (MaMH, MaNCC)
FOREIGN KEY (MaMH) REFERENCES MATHANG on update cascade on delete restrict,
FOREIGN KEY (MaNCC) REFERENCES NHACC on update cascade on delete restrict
CHECK (Dongia>0)
* Tạo bảng KHACHHANG CREATE TABLE KhachHang
(MaKH char(5) NOT NULL,
TenKH varchar(20) NOT NULL,
DiaChiKH varchar(30),
DThoaiKH varchar(10)
TKhoanKH varchar (20)) PRIMARY KEY (MaKH)
* Tạo bảng HoaDon
CREATE TABLE HoaDon
(SoHD Int NOT NULL, NgayHD Date NOT NULL, MaKH char(5) NOT NULL) PRIMARY KEY (SoHD)
FOREIGN KEY (MaKH) REFERENCES KhachHang on update cascade on delete restrict
* Tạo bảng HD_MH
CREATE TABLE HD_MH (SoHD int NOT NULL, MaMH char(5) NOT NULL , Soluong int NOT NULL,
DonGia int NOT NULL, TTien Int NOT NULL) PRIMARY KEY (SoHD, MaMH)
FOREIGN KEY (SoHD) REFERENCES HoaDon on update cascade on delete restrict,
on update cascade on delete restrict CHECK (SoLuong>0)
b) Xoá bảng
Cú pháp: DROP TABLE <Tên_bảng> Ví dụ: Xoá bảng HD_MH
DROP TABLE HD_MH c) Thêm cột của bảng Cú pháp:
ALTER TABLE <Tên_bảng> ADD <Tên_cột> <Kiểu_dữ_liệu> [NOT NULL]
Ví dụ: Thêm cột MoTaMH (mô tả mặt hàng) với kiểu dữ liệu Varchar(100) cho bảng MatHang.
ALTER TABLE MatHang ADD MoTaMH varchar(100)
Ghi chú: Khi thêm cột mới, giá trị của cột được mặc định là NULL.
d) Xoá cột của bảng Cú pháp:
ALTER TABLE <Tên_bảng> DROP <Tên_cột>
Ví dụ: Xoá cột TKhoanNCC của bảng NHCC, ta viết: ALTER TABLE NhCC DROP TKhoanNCC
3.2.2. Các lệnh cập nhật dữ liệu
a) Bổ sung bản ghi vào bảng
Để chèn thêm một bản ghi mới vào bảng, ta dùng lệnh sau:
INSERT INTO <Tên_bảng> [(danh_sách_cột)] VALUES (các_giá_trị) Ví dụ: Thêm bản ghi (‘SNY’, 'Sony’, ‘Japan’, NULL, '13.111.02.987') vào bảng NHACC.
INSERT INTO NHACC(MaNCC, TenNCC, DChiNCC, TKhoanNCC) VALUES (‘SNY’, 'Sony', 'Japan', '13.111.02.987') hoặc
INSERT INTO NHACC VALUES ('SNY', 'Sony', 'Japan', NULL, '13.111.02.987');
* Chú ý: Có thể thêm các bản ghi từ bảng khác bằng cách sử dụng mệnh đề Select thay cho VALUES (các_giá_trị):
INSERT INTO <Tên_bảng> [(danh_sách_cột)] <Câu_lệnh_select> b) Xoá bản ghi trong bảng
DELETE FROM <Tên_bảng> [WHERE <điều_kiện>]
Ví dụ: Loại bỏ mặt hàng có mã là ‘MH001’ trong bảng MATHANG
DELETE FROM MATHANG WHERE MaMH=’MH001’ c) Sửa nội dung các bản ghi trong bảng
UPDATE <Tên_bảng> SET <Tên_cột 1> = <Biểu_thức 1>, …, <Tên_cột k> = <Biểu_thức k> [WHERE <Điều_kiện>]
Trong đó:
- <Tên_bảng> là tên của bảng có bản ghi cần thay đổi nội dung, - <Tên_cột i> (i=1,..,k) là các cột cần thay giá trị bởi các <Biểu_thức i> tương ứng.
Ví dụ: Đổi địa chỉ của nhà cung cấp có mã 'IBM' thành ‘Thanh xuan - Ha Noi’.
UPDATE NHACC SET DChiNCC=’Thanh xuan – Ha Noi’ WHERE MaNCC=’IBM’
3.2.3. Truy vấn dữ liệu
Trong SQL để khai thác, tìm kiếm, trích rút dữ liệu (truy vấn) từ một cơ sở dữ liệu ta sử dụng câu lệnh có cấu trúc khối cơ bản có dạng
FROM... WHERE...
hay còn gọi là câu lệnh truy vấn. Kết quả trả về của câu lệnh truy vấn là một bảng. Cấu trúc khối đầy đủ là khá phức tạp, tuy nhiên cấu trúc cơ bản của nó lại tương đối đơn giản.
Trong đó:
+ Mệnh đề SELECT ... : Được dùng để liệt kê các cột cần đưa ra trong bảng kết quả. Mệnh đề này có vai trò như phép chiếu trong đại số quan hệ.
+ Mệnh đề FROM... : Được dùng để liệt kê các bảng cần truy nhập để lấy kết quả. Mệnh đề này có vai trò như phép tích đề các.
+ Mệnh đề WHERE: Mệnh đề này tương tự như phép chọn trong đại số quan hệ, được dùng để đặt điều kiện cho các bộ sẽ đưa ra trong bảng kết quả hoặc điều kiện liên kết các bảng.
Để làm rõ ý nghĩa của câu lệnh, ta có thể so sánh một khối với một biểu thức đại số quan hệ:
Câu lệnh
SELECT A1, A2, ...,An
FROM r1, r2, ..., rm
WHERE P
tương đương với biểu thức đại số quan hệ sau:
∏{A1, A2, ..., An}(σP (r1 x r2 x ... x rm))
Cấu trúc đầy đủ của khối SELECT:
SELECT [DISTINCT] * | <Danh_sách_cột> |<Danh_sách_biểu_thức>
FROM <Danh_sách_bảng> | <Danh_sách_View> [WHERE <Điều_kiện>]
[GROUP BY <Danh_sách_cột> [HAVING <Điều_kiện 1>]] [ORDER BY <Tên_cột> | <Biểu_thức > [ASC|DESC>]] [UNION | INTERSECT | MINUS <Khối_SELECT>]
Trong đó:
Mệnh đề SELECT ... : Được dùng để liệt kê các cột cần đưa ra trong bảng kết quả.
+ DISTINCT dùng để chỉ rằng trong bảng kết quả không có các bản ghi trùng nhau.
+ Các lựa chọn đưa ra trong bảng kết quả: Dấu *: Tất cả các cột
<Danh_sách_cột>: Các cột trong danh sách được đưa ra trong bảng kết quả, các cột viết cách nhau dấu phẩy.
<Danh_sách_biểu_thức>: Các biểu thức trong danh sách được đưa ra trong kết quả.
Mệnh đề FROM...Được dùng để liệt kê các bảng, các VIEW cần truy nhập để lấy kết quả. Giữa các bảng, các VIEW viết cách nhau dấu phẩy.
Mệnh đề WHERE...: Để xác định các bản ghi thỏa mãn điều kiện để đưa ra trong bảng kết quả hoặc điều kiện kết nối các bảng.
GROUP BY <Danh_sách_cột>: Nhóm các bản ghi thành nhóm theo các cột trong Danh_sách_cột.
[HAVING <Biểu_thức>]: Đặt điều kiện cho các nhóm sẽ được đưa ra trong bảng kết quả. Vì vậy, nó chỉ có khi có GROUP BY
ORDER BY <Danh_sách_cột> | <Biểu_thức> [ASC|DESC>]: Sắp xếp kết quả theo thứ tự tăng dần nếu dùng ASC, giảm dần nếu dùng DESC.
UNION|INTERSECT| MINUS <Khối_SELECT>: Như ta đã biết mỗi khối SELECT cho ta một bảng, do đó nó có thể được hợp, giao hay trừ cho một bảng khác đươc xác định bởi <Khối_SELECT>
Nhắc lại rằng, biểu thức báo gồm các phép toán tác động lên các toán hạng. Trong đó:
+ Các phép toán bao gồm:
Các phép toán số học: ^, *, /, Mod, +, – Các phép toán logic: Not, And, Or
Các phép toán tập hợp: Union, Intersect, Minus, Contain, in Các phép toán so sánh: =, >, >=, <, <=, <>
Các phép toán khác: BETWEEN, LIKE, EXISTS
+ Các toán hạng bao gồm hằng, tên cột, hàm, biểu thức. Sau đây là một số hàm thông dụng:
SUM(Tên_cột): Tính tổng các giá trị trong cột có tên là Tên_cột MAX(Tên_cột): Cho giá tri lớn nhất trong cột có tên là Tên_cột MIN(Tên_cột): Cho giá tri bé nhất trong cột có tên là Tên_cột COUNT(*|Tên_cột|DISTINCT Tên_cột): Đếm số bản ghi trong bảng theo tùy chọn:
Ký tự *: Đếm tất cả các bản ghi trong cột
Tên_cột: Đếm số bản ghi có giá trị cột khác NULL
DISTINCT Tên_cột: Đếm số bản ghi có giá trị cột khác NULL, các bản ghi có giá trị của cột giống nhau chỉ tính một.
Chú ý: Thứ tự thực hiện câu lệnh truy vấn như sau:
FROM → WHERE → GROUP BY → HAVING → SELECT →
ORDER BY
Để tìm hiểu câu lệnh truy vấn, chúng tôi tách câu lệnh tổng quát thành các dạng sau:
a) Truy vấn theo câu hỏi đơn giản.
Ở đây ta xem các câu hỏi đơn giản là các câu hỏi chỉ truy vấn trên một bảng. Đối với loại truy vấn này ta có thể xét các trường hợp sau:
* Truy vấn không điều kiện. Đây là dạng đơn giản nhất, chỉ có