1. Định nghĩa các thuật ngữ: cơ sở dữ liệu, hệ quản trị cơ sở dữ liệu, hệ cơ sở dữ
22.2.5. Mệnh đề order by
Mệnh đềORDER BYđược sử dụng để sắp xếp kết quả trả về. Sắp xếp các dòng Mệnh đề ORDER BYđược dùng để sắp xếp các dòng. Ví dụbảng Orders: Company OrderNumber Sega 3412 ABC Shop 5678 W3Schools 2312 W3Schools 6798 Ví dụ:
Để lấy danh sách các công ty theo thứ tự chữ cái (tăng dần): SELECTCompany, OrderNumber FROMOrders
ORDER BYCompany
Kết quả trả về:
Company OrderNumber
ABC Shop 5678
W3Schools 6798
W3Schools 2312
Ví dụ:
Lấy danh sách các công ty theo thứ tự chữ cái (tăng dần) và hoá đơn đặt hàng theo thứ tự số tăng dần:
SELECTCompany, OrderNumber FROMOrders ORDER BYCompany, OrderNumber
Kết quả trả về: Company OrderNumber ABC Shop 5678 Sega 3412 W3Schools 2312 W3Schools 6798 Ví dụ:
Lấy danh sách các công ty theo thứ tự giảm dần: SELECTCompany, OrderNumber FROMOrders ORDER BYCompanyDESC
Kết quả trả về: Company OrderNumber W3Schools 6798 W3Schools 2312 Sega 3412 ABC Shop 5678 22.2.6. Kết nối bảng
Trong quá trình truy vấn, dữ liệu có thể được lấy từ một hoặc nhiều bảng trong CSDL, nếu số lượng bảng từ 2 trở lên chúng ta phải thực hiện việc kết nối giữa các bảng, biểu thức kết nối ta sẽ đặt trong mệnh đề where (ở đây chúng ta đang đề cập đến kết nối bằng)
Quay trở lại với CSDL quản lý vật tư trong bài 10, giả sử muốn hiển thị tên nhân viên đã xuất vật tư trong ngày ‘12/07/2008’, chúng ta sẽ thiết kế câu truy vấn như sau:
SELECTTEN_NV
FROMNHAN_VIEN, PHIEU_XUAT
151 Câu truy vấn trên thựchiện trên hai bảng là NHAN_VIEN và PHIEU_XUAT, điều kiện kết nối giữa hai bảng là MA_NV = MANV_XUAT.
22.3. Các bài tập về truy vấn cơ bản
Cho các bảng trong cơ sở dữ liệu quản lý vật tư ( hình vẽ ở dưới )
Hãy viết các câu truy vấn để trả lời các câu hỏi sau
1) Hiển thị tên và ngày sinh của những nhân viên sinh năm 1980
2) Hiển thị thông tin bao gồm mã, tên và ngày sinh của những nhân viên đã xuất vật tư trong tháng 6 năm 2008.
3) Hiển thị mã vật tư và số lượng đã xuất trong ngày 12 tháng 8 năm 2008 4) Hiển thị tênvà đơn giá của tất cả vật tư sắp xếp theo chiều tăng của đơn
giá
5) Hiển thị tên vật tư và số tiền tương ứng của những vật tư đãđược xuất trong phiếu có số phiếu xuất là ‘001’
Bài 23: THỰC HÀNH VỀ CẬP NHẬT DỮ LIỆU
Bài 24: THỰC HÀNH VỀ TRUY VẤN CƠ BẢN
Bài 25: CÁC PHÉP TOÁN TẬP HỢPVÀ TRUY VẤN LỒNG
25.1. Các phép toán tập hợp
25.1.1. Toán tử UNION
Toán tử UNION cho phép ta hợp các kết quả của hai hay nhiều truy vấn thành một tập kết quả duy nhất.Cú pháp của phép hợp như sau:
Trong đóQuery_1 có dạng như sau:
SELECT select_list
[INTO clause] [FROM clause]
Query_1
[UNION [ALL] Query_2 ]
...
Giả sử chúngta có hai bảng như sau: Khi đó phép hợp SELECT A, C FROM R UNION SELECT * FROM S Sẽ có kết quả là (b¶ng kÕt qu¶)
Theo mặc định, phép toán UNION sẽ loại bỏ những dòng giống nhau trong kết quả. Nếu ta sử dụng tùy chọn ALL thì các dòng giống nhau sẽ không bị loại bỏ.Ta có thể sử dụng các dấu ngoặc để xác định thứ tự tính toán trong phép hợp.
Các nguyên tắc khi sử dụng toán tử UNION
Khi xây dựng các câu lệnh UNION, ta cần chú ý các nguyên tắc sau:
+ Tất cả các danh sách chọn trong câu lệnh UNION phải có cùng số biểu thức (các tên cột, các biểu thức số học, các hàm gộp,...) Bảng R A B C A1 B1 1 A2 B1 2 A3 B2 3 A4 B2 4 Kết quả E F A1 1 A2 2 A3 3 A4 4 A5 5 Bảng S E F A3 3 A4 4 A5 5 Và Query_i (i = 2,..,N) có dạng SELECT select_list [FROM clause] [WHERE clause] [GROUP BY clause] [HAVING clause]
+ Các cột tương ứng trong tất cả các bảng, hoặc tập con bất kỳ các cột được sửdụng trong bản thân mỗi truy vấn phải cùng kiểu dữ liệu.
+ Các cột tương ứng trong bản thân từng truy vấn của một câu lệnh UNION phải xuất hiện theo thứ tự nhưnhau. Nguyên nhân là do phép hợp so sánh các cột từng cột một theo thứ tự đượccho trong mỗi truy vấn.
+ Khi các kiểu dữ liệu khác nhau đượckết hợp với nhau trong câu lệnh UNION, chúng sẽ được chuyển sang kiểu dữ liệu cao hơn (nếu có thể được). +Tiêu đề cột trong kết quả của phép hợp sẽ là tiêu đề cột đượcchỉ định trong truy vấn đầu tiên.
25.1.2. Toán tửEXCEPT và INTERSECT
25.2. Truy vấn lồng
Cú pháp của câu truy vấn lồng
Ví dụ : trong cơ sở dữ liệu quản lý vật tư, hiển thị mã và tên vật không được xuất trong năm 2007, chúng ta sẽ thiết kế câu truy vấn như sau:
SELECT MA_VTU, TEN_VTU FROM VAT_TU
WHERE MA_VTU NOT IN (SELECT MA_VTU
FROM PHIEU_XUAT AS PX,DONG_XUAT AS DX
WHERE PX.SO_PXUAT =DX.SO_PXUAT AND NGAY_XUAT BETWEEN '1/1/2007' AND
'12/31/2007' )
Các câu lệnh SELECT có thể lồng nhau ở nhiều mức.
Câu truy vấn con thường trả về một tập các giá trị.
Các câu truy vấn con trong cùng một mẹnh đề WHERE được kết hợp bằng phép nối logic.
Mệnh đề WHERE của câu truy vấn cha
- <biểu thức><so sánh tập hợp><truy vấn con> - So sánh tập hợp thường đi cùng một số toán tử
IN, NOT IN SELECT <danh sách các cột> FROM <danh sách các bảng> WHERE <so sánh tập hợp> ( SELECT <danh sách các cột> FROM <danh sách các bảng> WHERE<điều kiện>)
Câu truy vấn cha (Outer query)
Câu truy vấn con (Subquery)
ALL ANY hoặc SOME - Kiểm tra sự tồn tại EXISTS NOT EXISTS 25.2.1.Truy vấn lồng phân cấp
+Mệnh đề WHERE của truy cập con không tham chiếu đến thuộc tính của các quan hệ trong mệnh đề FORM ở truy vấn cha.
+Khi thực hiện,câu truy vấn con sẽ được thực hiện trước.
25.2.2. Truy vấn lồng tương quan
+ Mệnh đề WHERE của truy vấn con tham chiếu ít nhất một thuộc tính của các quan hệ trong mệnh đề FROM ở truy vấn cha
+ Khi thực hiện, câu truy vấn con sẽ được thực hiện nhiều lần,mỗi lần tương ứng với một bộ của truy vấn cha
* Toán tử In và Exists
IN
- <tên cột>IN<câu truy vấn con>
- Thuộc tính ở mệnh đề SELECT của truy vấn con phải có cùng dữ liệu với thuộc tính ở mệnh đề WHERE của truy vấn cha.
EXISTS
- Không cần có thuộc tính, hằng số hay biểu thức nào khác đứng trước.
- Không nhất thiết liệt kê thuộc tính ở mệnh đề SELECT của truy vấn con.
- Những câu lệnh truy vấn có ANY hay IN đều có thể chuyển thành câu truy vấn có EXISTS
25.3. Bài tập liên quan đến các phép toán tập hợp và truy vấn lồng
Hãy sử dụng ngôn ngữ truy vấn ( SQL) để trả lời các câu hỏi sau:
Câu 1: Hiển thị tên nhân viên, ngày sinh của những nhân viên đã xuất vật tư trong tháng 8 năm 2008.
Câu 2: Hiển thị tên nhân viên, ngày sinh của những nhân viên đã xuất vật tư có tên là ‘Màn hình máy tính’
Câu 3: Hiển thịmã, tên vật tư đãđược xuất với khối lượng lớn nhất.
Bài 26: THỰC HÀNH VỀ CÁC PHÉP TOÁN TẬP HỢPvà TRUY VẤN
LỒNG
Bài 27: HÀM KẾT HỢP VÀ GOM NHÓM, MỘT SỐ TRUY VẤN
KHÁC
27.1. Hàm kết hợp
27.1.1. Hàm count(), min(), max(), sum(), avg()
Cú pháp của hàm COUNT:
SELECTCOUNT(tên_cột)FROMtên_bảng
Hàm COUNT(*):
Hàm COUNT(*) trả về số lượng các dòngđược chọn ở trong bảng. Ví dụ ta có bảngPersonsnhư sau:
Name Age
Hansen, Ola 34
Svendson, Tove 45
Pettersen, Kari 19
Câu lệnh sau sẽ trả về số lượng các dòng trong bảng: SELECTCOUNT(*)FROMPersons
và kết quả trả về sẽ là:3
Câu lệnh sau sẽ trả về số lượng những người lớn hơn 20 tuổi: SELECTCOUNT(*)FROMPersons WHEREAge>20
kết quả trả về sẽ là: 2
Hàm COUNT(column) sẽ trả về số lượng các dòng có giá trị khácNULLở cột được chỉ định.
Ví dụ ta có bảngPersonsnhư sau:
Name Age
Hansen, Ola 34
Svendson, Tove 45
Pettersen, Kari
Câu lệnh sau sẽ trả về số lượng những người mà cộtAge trong bảng không
rỗng:
SELECTCOUNT(Age)FROMPersons và kết quả trả về sẽ là: 2
Mệnh đềCOUNT DISTINCT
Lưuý: Các ví dụ dưới đây chỉ hoạt động với CSDLOracle và MS SQL
Server, không hoạt động trên MS Access(chưa thử nhiệm vớicác hệ CSDL
khác!)
Từ khoá DISTINCT và COUNT có thể được dùng chung với nhau để đếm số lượng các kết quả không trùng nhau.
Cú pháp như sau:
SELECTCOUNT(DISTINCTcolumn(s))FROMtable Ví dụ ta có bảngOrdersnhư sau:
Company OrderNumber Sega 3412 W3Schools 2312 Trio 4678 W3Schools 6798 Câu lệnh SQL sau:
SELECTCOUNT(DISTINCTCompany)FROMOrders sẽ trả về kết quả là: 3
SQL có sẵn khá nhiều hàm để thực hiện đếm và tính toán.
Cú pháp:
Cú pháp để gọi hàm trong câu lệnh SQL như sau: SELECTfunction(tên_cột)FROMtên_bảng
Bảng dữ liệu chúng ta sẽ dùng trong các ví sụ tiếp theo:
Name Age
Svendson, Tove 45
Pettersen, Kari 19
HàmAVG(column)
Hàm AVG trả về giá trị trung bình tính theo cột được chỉ định của các dòng được chọn. Các giá trịNULL sẽ không được xét đến khi tính giá trị trung bình.
Ví dụ:
Câu lệnh sau sẽ tính số tuổi trung bình của những người có tuổi trên 20: SELECTAVG(Age)FROMPersonsWHERE Age>20
kết quả trả về sẽ là:39.5
Hàm MAX(column)
Hàm MAX trả về giá trị lớn nhất trong cột. Các giá trị NULL sẽ không được xét đến.
Ví dụ:
SELECTMAX(Age)FROMPersons kết quả trả về:45
Hàm MIN(column)
Hàm MAX trả về giá trị nhỏ nhất trong cột. Các giá trị NULL sẽ không được xét đến.
Ví dụ:
SELECTMIN(Age)FROM Persons kết quả trả về: 19
Lưuý: Hàm MIN và MAX cũng có thể áp dụng cho các cột có dữ liệu là chuỗi văn bản. Dữ liệu trong cột sẽ được so sánh theo thứ tự tăng dần của từ điển
Hàm SUM(column)
Hàm SUM trả về tổng giá trị của cột. Các giá trị NULL sẽ không được xét đến.
Ví dụ:
Tìm tổng số tuổi của tất cả những người có trong bảng: SELECTSUM(Age)FROMPersons
kết quả trả về:98
Ví dụ:
Tìm tổng số tuổi của tất cả những người có tuổi lớn hơn 20: SELECTSUM(Age)FROMPersonsWHERE Age>20
27.2. Gom nhóm
27.2.1. Cú pháp
Các hàm tập hợp (ví dụ nhưSUM) thông thường cần thêm chức năng của mệnh đềGROUP BY.
GROUP BY...
Mệnh đềGROUP BY...được thêm vào SQL bởi vì các hàm tập hợp (như SUM) trả về một tập hợp của các giá trị trong cột mỗi khi chúng được gọi, và nếu không có GROUP BY ta không thể nào tính được tổng của các giá trị theo từng nhóm riêng lẻ trong cột.
Cú pháp củaGROUP BYnhư sau:
SELECTtên_cột, SUM(tên_cột)FROMtên_bảng GROUP BYtên_cột
Ví dụ sử dụngGROUP BY:
Giả sử ta có bảngSalesnhư sau:
Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100
Câu lệnh SQL sau:
SELECTCompany, SUM(Amount)FROMSales sẽ trả về kết quả:
Company SUM(Amount)
W3Schools 17100
IBM 17100
W3Schools 17100
Kết quả trả về ở trên đôi khi không phải là cái mà ta mong đợi. Ta thêm mệnh đềGROUP BY vào trong câu lệnh SQL:
SELECTCompany, SUM(Amount)FROMSales
GROUP BYCompany
và kết quả trả về lần này sẽ là:
Company SUM(Amount)
W3Schools 12600
IBM 4500
Kết quả này đúng là cái mà ta mong muốn.
27.2.2. Điều kiện trên nhóm
Mệnh đề HAVING...được thêm vào SQL vì mệnh đềWHERE không áp dụng được đối với các hàm tập hợp (nhưSUM). Nếu không cóHAVING, ta không thể nào kiểm tra được điều kiện với các hàm tập hợp.
Cú pháp củaHAVINGnhư sau:
SELECTtên_cột,SUM(tên_cột)FROMtên_bảng
GROUP BYtên_cột
HAVING SUM(tên_cột)điều_kiệngiá_trị
Ta sử dụng lại bảng Salesở trên. Câu lệnh SQL sau: SELECTCompany, SUM(Amount)FROMSales
GROUP BYCompany
HAVING SUM(Amount) >10000
sẽ trả về kết quả:
Company SUM(Amount)
W3Schools 12600
Với SQL, bí danh có thể được sử dụng cho tên của cột và tên của bảng. Bí danh cột:
Cú pháp bí danh cột như sau:
SELECTtên_cột ASbí_danh_cộtFROMtên_bảng
Bí danh bảng:
Bí danh bảng có cú pháp như sau:
SELECTtên_cộtFROMtên_bảng ASbí_danh_bảng
Ví dụ sử dụngbí danh cột:
Ta có bảng Personsnhư sau:
LastName FirstName Address City
Hansen Ola Timoteivn 10 Sandnes
Svendson Tove Borgvn 23 Sandnes
Pettersen Kari Storgt 20 Stavanger
Câu lệnh SQL sau:
SELECT LastNameAS Họ, FirstName ASTên FROMPersons Sẽ trả vềkết quả: Họ Tên Hansen Ola Svendson Tove Pettersen Kari
27.3. Thứ tự thực hiện câu truy vấn có mệnh đề Group by và Having
Mệnh đề GROUP BY
Các thuộc tính trong mệnh đề SELECT (trừ những thuộc tính trong những hàm kết hợp) phải xuất hiện trong mệnh đềGROUP BY
Mệnh đề HAVING
- Sử dụng các hàm kết hợp trong mệnh đề SELECT để kiểm tra một số điều kiện nào đó.
- Chỉ kiểm tra điều kiện trên nhóm, không là điều kiện lọc trên từng bộ.
- Sau khi gom nhóm điều kiện trên nhóm mới được thực hiện.
Thứ tự thực hiện câu truy vấn só mệnh đề GROUP BY và HAVING - (1) Chọn ra những dòng thỏa điều kiện trong mện đề WHERE. - (2) Những dòng này sẽ được gom thành nhiều nhóm tương ứng
với mệnh đề GROUP BY.
- (3) Áp dụng các hàm kết hợp cho mỗi nhóm.
- (4) Bỏ qua những nhóm không thỏa mãn điều kiện trong mệnh đề HAVING
- (5) Rút trích các giá trị của các cột và hàm kết hợp trong mệnh đề SELECT.
27.4. Bài tập liên quan đến hàm kết hợp và gom nhóm27.5. Một số dạng truy vấn khác 27.5. Một số dạng truy vấn khác
27.5.1. Truy vấn con ở mệnh đề From
Ví dụ: trong cơ sở dữ liệu quản lý vật tư, chúng ta muốn hiển thị tên những nhân viên đã xuất vật tư trong ngày ‘12/08/2008’, câu lệnh truy vấn sau sẽ thực hiện yêu cầu trên.
Kết quả trả về của một câu truy vấn phụ là một bảng - Bảng trung gian trong quá trình truy vấn
- Không có lưu trữ thật sự Cú pháp
SELECT <danh sách các cột>
FROM R1, R2, (<truy vấn con>) AS tên_bảng WHERE<điều kiện>
SELECT nv.ten_nv FROM nhan_vien As nv, (SELECT manv_xuat FROM phieu_xuat WHERE ngay_xuat = ‘08/12/2008’) As Temp
WHERE nv.ma_nv = Temp.manv_xuat
27.5.2. Điều kiện kết nối ở mệnh đề From
a. Kết nối bằng
INNER JOIN : trả về tất cả các hàng từ hai bảng khi điều kiện được so trùng. Nếu các hàng trong bảng R1 không so trùng trong bảng R2, hàng đó sẽkhôngđượcchọnra.
b. Kết nối ngoài
LEFT JOIN : Trả vềtất cả các hàng từbảng thứnhất R1, cho dù nó không
được so trùng trong bảng thứ hai R2. Nếu các hàng trong bảng R1 không so
trùng trong bảng R2, những hàng này cũng được liệt kê (thay thế bởi giá trị NULL).
RIGHT JOIN: Trảvềtất cảcác hàng từbảng thứnhấtR2, cho dù nó không
được so trùng trong bảng thứ hai R1. Nếu các hàng trong bảng R2 không so
trùng trong bảng R1, những hàng này cũng được liệt kê (thay thế bởi giá trị NULL).
27.6. Các bài tập liên quan đến một số dạng truy vấn khác
Bài 28: THỰC HÀNH HÀM KẾT HỢP VÀ GOM NHÓM Bài 29: THỰC HÀNH MỘT SỐ DẠNG TRUY VẤN KHÁC Bài 30: THỰC HÀNH TỔNG HỢP Bài 31: KIỂM TRA THỰC HÀNH Bài 32: Ôn tập 32.1.Tóm tắt lý thuyết 32.2. Bài tậptổnghợp. SELECT <danh sách các cột>
FROM R1 LEFT|RIGHT [OUTER] JOIN R2 ON <biểu thức>
WHERE<điều kiện>
SELECT <danh sách các cột>
FROM R1 [INNER] JOIN R2 ON <biểu thức> WHERE<điều kiện>