Mặc định, cỏc dũng dữ liệu trong kết quả của cõu truy vấn tuõn theo thứ tự của chỳng trong bảng dữ liệu hoặc được sắp xếp theo chỉ mục (nếu trờn bảng cú chỉ mục). Trong trường hợp muốn dữ liệu được sắp xếp theo chiều tăng hoặc giảm của giỏ trị của một hoặc nhiều trường, ta sử dụng thờm mệnh đề ORDER BY trong cõu lệnh SELECT; Sau ORDER BY là danh sỏch cỏc cột cần sắp xếp (tối đa là 16 cột). Dữ liệu được sắp xếp cú thể theo chiều tăng (ASC) hoặc giảm (DESC), mặc định là sắp xếp theo chiều tăng.
Vớ dụ 2.20: Cõu lệnh dưới đõy hiển thị danh sỏch cỏc mụn học và sắp xếp theo chiều giảm
dần của số đơn vị học trỡnh
SELECT * FROM monhoc ORDER BY sodvht DESC
Nếu sau ORDER BY cú nhiều cột thỡ việc sắp xếp dữ liệu sẽ được ưu tiờn theo thứ tự từ trỏi qua phải. Vớ dụ 2.21: Cõu lệnh SELECT hodem,ten,gioitinh, YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bỡnh' ORDER BY gioitinh,tuoi cú kết quả là:
Thay vỡ chỉ định tờn cột sau ORDER BY, ta cú thể chỉ định số thứ tự của cột cấn được sắp xếp. Cõu lệnh ở vớ dụ trờn cú thể được viết lại như sau:
SELECT hodem,ten,gioitinh, YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi FROM sinhvien WHERE ten='Bỡnh' ORDER BY 3, 4 2.1.6 Phộp hợp
Phộp hợp được sử dụng trong trường hợp ta cần gộp kết quả của hai hay nhiều truy vấn thành một tập kết quả duy nhất. SQL cung cấp toỏn tử UNION để thực hiện phộp hợp. Cỳ phỏp như sau
UNION [ALL] Cõu_lệnh_2
[UNION [ALL] Cõu_lệnh_3] ...
[UNION [ALL] Cõu_lệnh_n] [ORDER BY cột_sắp_xếp]
[COMPUTE danh_sỏch_hàm_gộp [BY danh_sỏch_cột]]
Trong đú
Cõu_lệnh_1 cú dạng
SELECT danh_sỏch_cột [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]
và Cõu_lệnh_i (i = 2,..,n) cú dạng
SELECT danh_sỏch_cột
[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]
Vớ dụ 2.22: Giả sử ta cú hai bảng Table1 và Table2 lần lượt như sau:
cõu lệnh
SELECT A,B FROM Table1 UNION
SELECT D,E FROM table2
Mặc định, nếu trong cỏc truy vấn thành phần của phộp hợp xuất hiện những dũng dữ liệu giống nhau thỡ trong kết quả truy vấn chỉ giữ lại một dũng. Nếu muốn giữ lại cỏc dũng này, ta phải sử dụng thờm từ khoỏ ALL trong truy vấn thành phần.
Vớ dụ 2.23: Cõu lệnh
SELECT A,B FROM Table1 UNION ALL
SELECT D,E FROM table2
Cho kết quả như sau
Khi sử dụng toỏn tử UNION để thực hiện phộp hợp, ta cần chỳ ý cỏc nguyờn tắc sau:
• Danh sỏch cột trong cỏc truy vấn thành phần phải cú cựng số lượng.
• 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 thành phầ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 thành phầ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ự được cho trong mỗi truy vấn.
• Khi cỏc kiểu dữ liệu khỏc nhau được kế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 được chỉ định trong truy vấn đầu tiờn.
• Truy vấn thành phần đầu tiờn cú thể cú INTO để tạo mới một bảng từ kết quả của chớnh phộp hợp.
• Mệnh đề ORDER BY và COMPUTE dựng để sắp xếp kết quả truy vấn hoặc tớnh toỏn cỏc giỏ trị thống kờ chỉ được sử dụng ở cuối cõu lệnh UNION. Chỳng khụng được sử dụng ở trong bất kỳ truy vấn thành phần nào.
• Mệnh đề GROUP BY và HAVING chỉ cú thể được sử dụng trong bản thõn từng truy vấn thành phần. Chỳng khụng được phộp sử dụng để tỏc động lờn kết quả chung của phộp hợp.
• Phộp toỏn UNION cú thể được sử dụng bờn trong cõu lệnh INSERT.
• Phộp toỏn UNION khụng được sử dụng trong cõu lệnh CREATE VIEW.
Khi cần thực hiện một yờu cầu truy vấn dữ liệu từ hai hay nhiều bảng, ta phải sử dụng đến phộp nối. Một cõu lệnh nối kết hợp cỏc dũng dữ liệu trong cỏc bảng khỏc nhau lại theo một hoặc nhiều điều kiện nào đú và hiển thị chỳng trong kết quả truy vấn.
Xột hai bảng sau đõy: Bảng KHOA
Bảng LOP
Giả sử ta cần biết mó lớp và tờn lớp của cỏc lớp thuộc Khoa Cụng nghệ Thụng tin, ta phải làm như sau:
• Chọn ra dũng trong bảng KHOA cú tờn khoa là Khoa Cụng nghệ Thụng tin, từ đú xỏc định được mó khoa (MAKHOA) là DHT02.
• Tỡm kiếm trong bảng LOP những dũng cú giỏ trị trường MAKHOA là DHT02
(tức là bằng MAKHOA tương ứng trong bảng KHOA) và đưa những dũng này vào kết quả truy vấn
Như vậy, để thực hiện được yờu cầu truy vấn dữ liệu trờn, ta phải thực hiện phộp nối giữa hai bảng KHOA và LOP với điều kiện nối là MAKHOA của KHOA bằng với MAKHOA của LOP. Cõu lệnh sẽ được viết như sau:
SELECT malop,tenlop FROM khoa,lop
WHERE khoa.makhoa = lop.makhoa AND
tenkhoa='Khoa Cụng nghệ Thụng tin'
2.1.7.1 Sử dụng phộp nối
Phộp nối là cơ sở để thực hiện cỏc yờu cầu truy vấn dữ liệu liờn quan đến nhiều bảng. Một cõu lệnh nối thực hiện lấy cỏc dũng dữ liệu trong cỏc bảng tham gia truy vấn, so sỏnh giỏ trị của cỏc dũng này trờn một hoặc nhiều cột được chỉ định trong điều kiện nối và kết hợp cỏc dũng thoả món điều kiện thành những dũng trong kết quả truy vấn.
Để thực hiện được một phộp nối, cần phải xỏc định được những yếu tố sau:
• Những cột nào cần hiển thị trong kết quả truy vấn
• Những bảng nào cú tham gia vào truy vấn.
• Điều kiện để thực hiện phộp nối giữa cỏc bảng dữ liệu là gỡ
Trong cỏc yếu tố kể trờn, việc xỏc định chớnh xỏc điều kiện để thực hiện phộp nối giữa cỏc bảng đúng vai trũ quan trọng nhất. Trong đa số cỏc trường hợp, điều kiện của phộp nối được xỏc định nhờ vào mối quan hệ giữa cỏc bảng cần phải truy xuất dữ liệu. Thụng thường, đú là điều kiện bằng nhau giữa khoỏ chớnh và khoỏ ngoài của hai bảng cú mối quan hệ với nhau. Như vậy, để cú thể đưa ra một cõu lệnh nối thực hiện chớnh xỏc yờu cầu truy vấn dữ liệu đũi hỏi phải hiểu được mối quan hệ cũng như ý nghĩa của chỳng giữa cỏc bảng dữ liệu.
Danh sỏch chọn trong phộp nối
Một cõu lệnh nối cũng được bắt đầu với từ khúa SELECT. Cỏc cột được chỉ định tờn sau từ khoỏ SELECT là cỏc cột được hiển thị trong kết quả truy vấn. Việc sử dụng tờn cỏc cột trong danh sỏch chọn cú thể là:
• Tờn của một số cột nào đú trong cỏc bảng cú tham gia vào truy vấn. Nếu tờn cột trong cỏc bảng trựng tờn nhau thỡ tờn cột phải được viết dưới dạng
tờn_bảng.tờn_cột
• Dấu sao (*) được sử dụng trong danh sỏch chọn khi cần hiển thị tất cả cỏc cột của cỏc bảng tham gia truy vấn.
• Trong trường hợp cần hiển thị tất cả cỏc cột của một bảng nào đú, ta sử dụng cỏch viết:
tờn_bảng.*
Mệnh đề FROM trong phộp nối
Sau mệnh đề FROM của cõu lệnh nối là danh sỏch tờn cỏc bảng (hay khung nhỡn) tham gia vào truy vấn. Nếu ta sử dụng dấu * trong danh sỏch chọn thỡ thứ tự của cỏc bảng liệt kờ sau FROM sẽ ảnh hưởng đến thứ tự cỏc cột được hiển thị trong kết quả truy vấn.
Mệnh đề WHERE trong phộp nối
Khi hai hay nhiều bảng được nối với nhau, ta phải chỉ định điều kiện để thực hiện phộp nối ngay sau mệnh đề WHERE. Điều kiện nối được biểu diễn dưới dạng biểu thức logic so sỏnh giỏ trị dữ liệu giữa cỏc cột của cỏc bảng tham gia truy vấn.
Cỏc toỏn tử so sỏnh dưới đõy được sử dụng để xỏc định điều kiện nối
Phộp toỏn í nghĩa = Bằng > Lớn hơn >= Lớn hơn hoặc bằng < Nhỏ hơn <= Nhỏ hơn hoặc bằng <> Khỏc !> Khụng lớn hơn !< Khụng nhỏ hơn
Vớ dụ 2.24: Cõu lệnh dưới đõy hiển thị danh sỏch cỏc sinh viờn với cỏc thụng tin: mó sinh viờn, họ và tờn, mó lớp, tờn lớp và tờn khoa
SELECT masv,hodem,ten,sinhvien.malop,tenlop,tenkhoa FROM sinhvien,lop,khoa
WHERE sinhvien.malop = lop.malop AND lop.makhoa=khoa.makhoa
Trong cõu lệnh trờn, cỏc bảng tham gia vào truy vấn bao gồm SINHVIEN, LOP và KHOA. Điều kiện để thực hiện phộp nối giữa cỏc bảng bao gồm hai điều kiện:
sinhvien.malop = lop.malop
và lop.malop = khoa.malop
Điều kiện nối giữa cỏc bảng trong cõu lệnh trờn là điều kiện bằng giữa khoỏ ngoài và khoỏ chớnh của cỏc bảng cú mối quan hệ với nhau. Hay núi cỏch khỏc, điều kiện của phộp nối được xỏc định dựa vào mối quan hệ giữa cỏc bảng trong cơ sở dữ liệu.
2.1.7.2 Cỏc loại phộp nối
Phộp nối bằng và phộp nối tự nhiờn
Một phộp nối bằng (equi-join) là một phộp nối trong đú giỏ trị của cỏc cột được sử dụng để nối được so sỏnh với nhau dựa trờn tiờu chuẩn bằng và tất cả cỏc cột trong cỏc bảng tham gia nối đều được đưa ra trong kết quả.
Vớ dụ 2.25: Cõu lệnh dưới đõy thực hiện phộp nối bằng giữa hai bảng LOP và KHOA
SELECT * FROM lop,khoa
Trong kết quả của cõu lệnh trờn, cột makhoa (mó khoa) xuất hiện hai lần trong kết quả phộp nối (cột makhoa của bảng khoa và cột makhoa của bảng lop) và như vậy là khụng cần thiết. Ta cú thể loại bỏ bớt đi những cột trựng tờn trong kết quả truy vấn bằng cỏch chỉ định danh sỏch cột cần được hiển thị trong danh sỏch chọn của cõu lệnh.
Một dạng đặc biệt của phộp nối bằng được sử dụng nhiều là phộp nối tự nhiờn
(natural-join). Trong phộp nối tự nhiờn, điều kiện nối giữa hai bảng chớnh là điều kiện bằng giữa khoỏ ngoài và khoỏ chớnh của hai bảng; Và trong danh sỏch chọn của cõu lệnh chỉ giữ lại một cột trong hai cột tham gia vào điều kiện của phộp nối
Vớ dụ 2.26: Để thực hiện phộp nối tự nhiờn, cõu lệnh trong vớ dụ 2.25 được viết lại như sau
SELECT malop,tenlop,khoa,hedaotao,namnhaphoc, siso,lop.makhoa,tenkhoa,dienthoai FROM lop,khoa
WHERE lop.makhoa=khoa.makhoa
hoặc viết dưới dạng ngắn gọn hơn:
SELECT lop.*,tenkhoa,dienthoai FROM lop,khoa
WHERE lop.makhoa=khoa.makhoa
Phộp nối với cỏc điều kiện bổ sung
Trong cỏc cõu lệnh nối, ngoài điều kiện của phộp nối được chỉ định trong mệnh đề WHERE cũn cú thể chỉ định cỏc điều kiện tỡm kiếm dữ liệu khỏc (điều kiện chọn). Thụng thường, cỏc điều kiện này được kết hợp với điều kiện nối thụng qua toỏn tử AND.
Vớ dụ 2.27: Cõu lệnh dưới đõy hiển thị họ tờn và ngày sinh của cỏc sinh viờn Khoa Cụng
nghệ Thụng tin
SELECT hodem,ten,ngaysinh FROM sinhvien,lop,khoa
WHERE tenkhoa='Khoa Cụng nghệ Thụng tin' AND sinhvien.malop = lop.malop AND
lop.makhoa = khoa.makhoa
Phộp tự nối và cỏc bớ danh
Phộp tự nối là phộp nối mà trong đú điều kiện nối được chỉ định liờn quan đến cỏc cột của cựng một bảng. Trong trường hợp này, sẽ cú sự xuất hiện tờn của cựng một bảng nhiều lần trong mệnh đề FROM và do đú cỏc bảng cần phải được đặt bớ danh.
Vớ dụ 2.28: Để biết được họ tờn và ngày sinh của cỏc sinh viờn cú cựng ngày sinh với sinh viờn Trần Thị Kim Anh, ta phải thực hiện phộp tự nối ngay trờn chớnh bảng sinhvien. Trong cõu lệnh nối, bảng sinhvien xuất hiện trong mệnh đề FROM với bớ danh là a và b. Bảng
sinhvien với bớ danh là a sử dụng để chọn ra sinh viờn cú họ tờn là Trần Thị Kim Anh và bảng sinhvien với bớ danh là b sử dụng để xỏc định cỏc sinh viờn trựng ngày sinh với sinh viờn Trần Thị Kim Anh. Cõu lệnh được viết như sau:
SELECT b.hodem,b.ten,b.ngaysinh FROM sinhvien a, sinhvien b
a.ngaysinh=b.ngaysinh AND a.masv<>b.masv
Phộp nối khụng dựa trờn tiờu chuẩn bằng
Trong phộp nối này, điều kiện để thực hiện phộp nối giữa cỏc bảng dữ liệu khụng phải là điều kiện so sành bằng giữa cỏc cột. Loại phộp nối này trong thực tế thường ớt được sử dụng.
Phộp nối ngoài (outer-join)
Trong cỏc phộp nối đó đề cập ở trờn, chỉ những dũng cú giỏ trị trong cỏc cột được chỉ định thoả món điều kiện kết nối mới được hiển thị trong kết quả truy vấn, và được gọi là phộp nối trong (inner join) Theo một nghĩa nào đú, những phộp nối này loại bỏ thụng tin chứa trong những dũng khụng thoả món điều kiện nối. Tuy nhiờn, đụi khi ta cũng cần giữ lại những thụng tin này bằng cỏch cho phộp những dũng khụng thoả món điều kiện nối cú mặt trong kết quả của phộp nối. Để làm điều này, ta cú thể sử dụng phộp nối ngoài.
SQL cung cấp cỏc loại phộp nối ngoài sau đõy:
• Phộp nối ngoài trỏi (ký hiệu: *=): Phộp nối này hiển thị trong kết quả truy vấn
tất cả cỏc dũng dữ liệu của bảng nằm bờn trỏi trong điều kiện nối cho dự những dũng này khụng thoả món điều kiện của phộp nối
• Phộp nối ngoài phải (ký hiệu: =*): Phộp nối này hiển thị trong kết quả truy vấn
tất cả cỏc dũng dữ liệu của bảng nằm bờn phải trong điều kiện nối cho dự những dũng này khụng thoả điều kiện của phộp nối.
Vớ dụ 2.29: Giả sử ta cú hai bảng DONVI và NHANVIEN như sau:
Bảng DONVI Bảng NHANVIEN Cõu lệnh: SELECT * FROM nhanvien,donvi WHERE nhanvien.madv=donvi.madv cú kết quả là:
Nếu thực hiện phộp nối ngoài trỏi giữa bảng NHANVIEN và bảng DONVI:
FROM nhanvien,donvi
WHERE nhanvien.madv*=donvi.madv
kết quả của cõu lệnh sẽ là:
Và kết quả của phộp nối ngoài phải:
select *
from nhanvien,donvi
where nhanvien.madv=*donvi.madv
như sau:
Phộp nối và cỏc giỏ trị NULL
Nếu trong cỏc cột của cỏc bảng tham gia vào điều kiện của phộp nối cú cỏc giỏ trị NULL thỡ cỏc giỏ trị NULL được xem như là khụng bằng nhau.
Vớ dụ 2.30: Giả sử ta cú hai bảng TABLE1 và TABLE2 như sau:
TABLE1 TABLE2 A B C D 1 b1 NULL d1 NULL b2 4 d2 4 b3 Cõu lệnh: SELECT *
FROM table1, table2 WHERE A *= C
Cú kết quả là:
A B C D
1 b1 NULL NULL NULL b2 NULL NULL
2.1.7.4 Sử dụng phộp nối trong SQL2
Ở phần trước đó đề cập đến phương phỏp sử dụng phộp nối trong và phộp nối ngoài trong truy vấn SQL. Như đó trỡnh bày, điều kiện của phộp nối trong cõu lệnh được chỉ định trong mệnh đề WHERE thụng qua cỏc biểu thức so sỏnh giữa cỏc bảng tham gia truy vấn.
Chuẩn SQL2 (SQL-92) đưa ra một cỏch khỏc để biểu diễn cho phộp nối, trong cỏch biểu diễn này, điều kiện của phộp nối khụng được chỉ định trong mệnh đề WHERE mà được chỉ định ngay trong mệnh đề FROM của cõu lệnh. Cỏch sử dụng phộp nối này cho phộp ta biểu diễn phộp nối cũng như điều kiện nối được rừ ràng, đặc biệt là trong trường hợp phộp nối được thực hiện trờn ba bảng trở lờn.
Phộp nối trong
Điều kiện để thực hiện phộp nối trong được chỉ định trong mệnh đề FROM theo cỳ phỏp như sau:
tờn_bảng_1 [INNER] JOIN tờn_bảng_2 ON điều_kiện_nối
Vớ dụ 2.31: Để hiển thị họ tờn và ngày sinh của cỏc sinh viờn lớp Tin K24, thay vỡ sử dụng cõu lệnh:
SELECT hodem,ten,ngaysinh FROM sinhvien,lop
WHERE tenlop='Tin K24' AND sinhvien.malop=lop.malop
ta cú thể sử dụng cõu lệnh như sau:
SELECT hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE tenlop='Tin K24'
Phộp nối ngoài
SQL2 cung cấp cỏc phộp nối ngoài sau đõy:
• Phộp nối ngoài trỏi (LEFT OUTER JOIN)
• Phộp nối ngoài phải (RIGHT OUTER JOIN)
• Phộp nối ngoài đầy đủ (FULL OUTER JOIN)
Cũng tương tự như phộp nối trong, điều kiện của phộp nối ngoài cũng được chỉ định ngay trong mệnh đề FROM theo cỳ phỏp:
tờn_bảng_1 LEFT|RIGHT|FULL [OUTER] JOIN tờn_bảng_2 ON điều_kiện_nối
Vớ dụ 2.32: Giả sử ta cú hai bảng dữ liệu như sau:
Phộp nối ngoài trỏi giữa hai bảng NHANVIEN và DONVI được biểu diễn bởi cõu lệnh:
SELECT *
FROM nhanvien LEFT OUTER JOIN donvi ON nhanvien.madv=donvi.madv
cú kết quả là:
Cõu lệnh:
SELECT *
FROM nhanvien RIGHT OUTER JOIN donvi ON nhanvien.madv=donvi.madv
thực hiện phộp nối ngoài phải giữa hai bảng NHANVIEN và DONVI, và cú kết quả là:
Nếu phộp nối ngoài trỏi (tương ứng phải) hiển thị trong kết quả truy vấn cả những dũng dữ liệu khụng thoả điều kiện nối của bảng bờn trỏi (tương ứng phải) trong phộp nối thỡ phộp nối ngoài đầy đủ hiển thị trong kết quả truy vấn cả những dũng dữ liệu khụng thoả điều kiện nối của cả hai bảng tham gia vào phộp nối.
Vớ dụ 2.33: Với hai bảng NHANVIEN và DONVI như ở trờn, cõu lệnh
SELECT *
FROM nhanvien FULL OUTER JOIN donvi ON nhanvien.madv=donvi.madv
Thực hiện phộp nối trờn nhiều bảng