Mệnh đề WHERE trong cõu lệnh SELECT được sử dụng nhằm xỏc định cỏc điều kiện đối với việc truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logic và chỉ những dũng dữ liệu nào thoả món điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.
Vớ dụ 2.14: Cõu lệnh dưới đõy hiển thị danh sỏch cỏc mụn học cú số đơn vị học trỡnh lớn hơn 3
SELECT * FROM monhoc WHERE sodvht>3
Kết quả của cõu lệnh này như sau:
Trong mệnh đề WHERE thường sử dụng:
• Cỏc toỏn tử kết hợp điều kiện (AND, OR)
• Cỏc toỏn tử so sỏnh
• Kiểm tra giới hạn của dữ liệu (BETWEEN/ NOT BETWEEN)
• Danh sỏch • Kiểm tra khuụn dạng dữ liệu. • Cỏc giỏ trị NULL a. Cỏc toỏn tử so sỏnh Toỏn tử ý nghĩa = Bằng > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng <= Nhỏ hơn hoặc bằng <> Khỏc !> Khụng lớn hơn !< Khụng nhỏ hơn Vớ dụ 2.15: Cõu lệnh: SELECT masv,hodem,ten,ngaysinh FROM sinhvien WHERE (ten='Anh') AND (YEAR(GETDATE())-YEAR(ngaysinh)<=20)
cho biết mó, họ tờn và ngày sinh của cỏc sinh viờn cú tờn là Anh và cú tuổi nhỏ hơn hoặc bằng 20.
b. Kiểm tra giới hạn của dữ liệu
Để kiểm tra xem giỏ trị dữ liệu nằm trong (ngoài) một khoảng nào đú, ta sử dụng toỏn tử BETWEEN (NOT BETWEEN) như sau:
Cỏch sử dụng í nghĩa
giỏ_trị BETWEEN a AND b a ≤ giỏ_trị≤ b
giỏ_trị NOT BETWEEN a AND b (giỏ_trị < a) AND (giỏ_trị>b)
Vớ dụ 2.16: Cõu lệnh dưới đõy cho biết họ tờn và tuổi của cỏc sinh viờn cú tờn là Bỡnh và cú tuổi nằm trong khoảng từ 20 đến 22
SELECT hodem,ten,year(getdate())-year(ngaysinh) AS tuoi FROM sinhvien
WHERE ten='Bỡnh' AND
YEAR(GETDATE())-YEAR(ngaysinh) BETWEEN 20 AND 22
c. Danh sỏch (IN và NOT IN)
Từ khoỏ IN được sử dụng khi ta cần chỉ định điều kiện tỡm kiếm dữ liệu cho cõu lệnh SELECT là một danh sỏch cỏc giỏ trị. Sau IN (hoặc NOT IN) cú thể là một danh sỏch cỏc giỏ trị hoặc là một cõu lệnh SELECT khỏc.
Vớ dụ 2.17: Để biết danh sỏch cỏc mụn học cú sốđơn vị học trỡnh là 2, 4 hoặc 5, thay vỡ sử dụng cõu lệnh
SELECT * FROM monhoc
WHERE sodvht=2 OR sodvht=4 OR sodvht=5
ta cú thể sử dụng cõu lệnh
SELECT * FROM monhoc WHERE sodvht IN (2,4,5)
d. Toỏn tử LIKE và cỏc ký tựđại diện
Từ khoỏ LIKE (NOT LIKE) sử dụng trong cõu lệnh SELECT nhằm mụ tả khuụn dạng của dữ liệu cần tỡm kiếm. Chỳng thường được kết hợp với cỏc ký tự đại diện sau đõy:
Ký tựđại diện ý nghĩa
% Chuỗi ký tự bất kỳ gồm khụng hoặc nhiều ký tự _ Ký tựđơn bất kỳ
[] Ký tựđơn bất kỳ trong giới hạn được chỉ định (vớ dụ [a-f]) hay một tập (vớ dụ [abcdef])
[^] Ký tựđơn bất kỳ khụng nằm trong giới hạn được chỉ định ( vớ dụ [^a-f] hay một tập (vớ dụ [^abcdef]).
Vớ dụ 2.18: Cõu lệnh dưới đõy
SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'Lờ%'
cho biết họ tờn của cỏc sinh viờn cú họ là Lờ và cú kết quả như sau
Cõu lệnh:
SELECT hodem,ten FROM sinhvien
WHERE hodem LIKE 'Lờ%' AND ten LIKE '[AB]%'
Cú kết quả là:
e. Giỏ trị NULL
Dữ liệu trong một cột cho phộp NULL sẽ nhận giỏ trị NULL trong cỏc trường hợp sau:
• Nếu khụng cú dữ liệu được nhập cho cột và khụng cú mặc định cho cột hay kiểu dữ liệu trờn cột đú.
• Người sử dụng trực tiếp đưa giỏ trị NULL vào cho cột đú.
• Một cột cú kiểu dữ liệu là kiểu số sẽ chứa giỏ trị NULL nếu giỏ trị được chỉ định gõy tràn số.
Trong mệnh đề WHERE, để kiểm tra giỏ trị của một cột cú giỏ trị NULL hay khụng, ta sử dụng cỏch viết:
WHERE tờn_cột IS NULL
hoặc:
WHERE tờn_cột IS NOT NULL
2.1.4 Tạo mới bảng dữ liệu từ kết quả của cõu lệnh SELECT
Cõu lệnh SELECT ... INTO cú tỏc dụng tạo một bảng mới cú cấu trỳc và dữ liệu được xỏc định từ kết quả của truy vấn. Bảng mới được tạo ra sẽ cú số cột bằng số cột được chỉđịnh trong danh sỏch chọn và số dũng sẽ là số dũng kết quả của truy vấn
Vớ dụ 2.19: Cõu lệnh dưới đõy truy vấn dữ liệu từ bảng SINHVIEN và tạo một bảng TUOISV bao gồm cỏc trường HODEM, TEN và TUOI
SELECT hodem,ten,YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi INTO tuoisv
FROM sinhvien
Lưu ý: Nếu trong danh sỏch chọn cú cỏc biểu thức thỡ những biểu thức này phải được đặt tiờu đề.
2.1.5 Sắp xếp kết quả truy vấn
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
Cõu_lệnh_1
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.
2.1.7 Phộp nối
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
• 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.
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
WHERE lop.makhoa=khoa.makhoa
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
WHERE a.hodem='Trần Thị Kim' AND a.ten='Anh' AND 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