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
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
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ử = > < >= <= <> ! > !< Vớ dụ 2.15: Cõu lệnh: ý 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 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.
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
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:
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL 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:
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
• 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
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
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 30
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
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
Cho kết quả như sau:
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
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.
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
• 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 phải làm như sau:
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
• 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ỡ
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
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 35
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
<= 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
Khoa CNTT - Trường ĐHKH Huế Giỏo trỡnh SQL
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