Mệnh đề order by

Một phần của tài liệu Đề cương bài giảng môn cơ sở dữ liệu (Trang 149)

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 tEXCEPT 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 bng 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>

Một phần của tài liệu Đề cương bài giảng môn cơ sở dữ liệu (Trang 149)

Tải bản đầy đủ (PDF)

(161 trang)