post  trước, chúng ta đã biết cách viết câu SELECT đơn giản nhất. Post này chúng ta sẽ đi sâu hơn vào câu lệnh SELECT, với việc chọn lọc dữ liệu theo điều kiện, và sắp xếp dữ liệu để việc hiển thị kết quả rõ ràng hơn cho người dùng.

Trong post trước chúng ta đã thực hiện phép chiếu, để chỉ ra những column thông tin mà chúng ta muốn lấy dữ liệu. Hãy tưởng tượng bạn có 1 table với vài ngàn dòng, trong khi đó bạn chỉ muốn đọc 1 số dòng thỏa điều kiện nào đó thôi. Bạn không thể nào SELECT hết tất cả rồi ngồi đọc từ trên xuống được. Vậy giải pháp là gì? Câu lệnh SELECT hỗ trợ 1 mệnh đề là WHERE, cho phép đặt ra các điều kiện để lọc, để giới hạn dữ liệu trả về. Đây chính là phép chọn (selection).

Cú pháp câu lệnh SELECT có WHERE

 

 

Mệnh đề WHERE nằm sau mệnh đề FROM trong câu lệnh SELECT. Trong mệnh đề WHERE là 1 hay nhiều điều kiện so sánh, giữa column với 1 giá trị, 1 tập các giá trị hay 1 column khác.

Ví dụ: table emloyees trong schema HR có dữ liệu của nhân viên tất cả các bộ phận. Ta chỉ muốn lấy thông tin về các nhân viên thuộc bộ phận có mã là 90:

 

 

Chú ý: trong mệnh đề WHERE không sử dụng được column alias. Giá trị so sánh kiểu chuỗi hay ngày tháng cũng phải đặt trong dấu nháy đơn. Giá trị kiểu chuỗi có phân biệt hoa thường và kiểu ngày tháng có phân biệt định dạng, mặc định là DD-MON-RR.

 

 

Toán tử so sánh

 

Trong mệnh đề WHERE hỗ trợ nhiều toán tử so sánh, bao gồm:

 

Toán tử Ý nghĩa
= bằng
> lớn hơn
>= lớn hơn hoặc bằng
< bé hơn
<= bé hơn hoặc bằng
<>   ^=   != không bằng
BETWEEN … AND … giữa 2 giá trị
IN trong tập giá trị
LIKE tương tự như
IS NULL là giá trị NULL

 

 

Ví dụ:

 

 

 

Toán tử BETWEEN … AND … dùng để lấy dữ liệu trong khoảng (áp dụng cho cả khoảng số và khoảng ký tự):

 

 

 

Toán tử IN dùng kiểm tra dữ liệu trong tập hợp:

 

 

 

Toán tử LIKE dùng để tìm kiếm giá trị chuỗi gần đúng. Có thể sử dụng ký tự % để thay thế cho nhiều ký tự hay ký tự _ để thay thế cho 1 ký tự:

 

 

 

Cũng có thể dùng LIKE cho kiểu ngày tháng:

 

 

Trường hợp trong chuỗi tìm kiếm có ký tự _ hay %, ta phải sử dụng từ khóa ESCAPE để nhận biết ký tự đánh dấu trước ký tự _ hay % mà ta muốn hiểu là nội dung tìm kiếm. Ở đây ESCAPE cho biết rằng \ là ký tự đánh dấu. Câu lệnh sau sẽ tìm những nhân viên có job_id có chuỗi SA_ trong đó

 

 

Để so sánh với NULL, ta sử dụng điều kiện IS NULL hoặc IS NOT NULL. Không thể sử dụng dấu = vì NULL là không có gì, nên không thể so sánh bằng hay không bằng với 1 giá trị.

 

 

Sử dụng các toán tử logic: AND, OR, NOT

 

Phép AND: chỉ đúng khi tất cả các phép so sánh đều đúng.

 

 

Phép OR: chỉ sai khi tất cả các phép so sánh đều sai.

 

 

NOT: phủ định ý nghĩa các toán tử như IN, BETWEEN, LIKE, NULL

 

 

Thứ tự ưu tiên so sánh

 

Nếu không sử dụng dấu ngoặc thì mặc định thứ tự ưu tiên tính toán như sau:

Toán tử số học
Toán tử nối chuỗi
Toán tử so sánh
NULL, LIKE, IN
BETWEEN
<> != ^=
NOT
AND
OR

 

 

Ở ví dụ trên, ta thấy phép OR rồi mới đến phép AND, mà phép AND có độ ưu tiên cao hơn, do đó Oracle sẽ đọc hiểu câu lệnh như sau: lấy các dòng từ bảng employees nếu nhân viên đó:

  • có job ID là AD_PRES VÀ lương > 15000
  • HOẶC có job id là SA_REP

 

 

Ví dụ thứ 2 này, do có dấu ngoặc nên nội dung trong ngoặc sẽ được ưu tiên. Oracle hiểu câu lệnh như sau: lấy các dòng từ bảng employees nếu nhân viên đó hoặc:

  • có job ID là SA_REP VÀ lương > 15000
  • có job ID là AD_PRES VÀ lương > 15000

 

Sắp xếp kết quả sử dụng ORDER BY

 

Dữ liệu trả về có thể không theo thứ tự. Muốn sắp xếp nội dung theo thứ tự, ta sử dụng mệnh đề ORDER BY. Sau từ khóa ORDER BY ta liệt kê các column (hay alias, hoặc thứ tự column trong mệnh đề SELECT) muốn sắp xếp kết quả, hoặc có thể là 1 biểu thức. Có thể thêm từ khóa ASC để sắp xếp tăng dần (ASC là mặc định, có thể không ghi ra), DESC để sắp xếp giảm dần sau mỗi column (DESC ở đây là Descending, không phải lệnh Describe).

Ví dụ:

 

 

Chú ý rằng ORDER BY luôn là mệnh đề cuối cùng trong câu SELECT. Có thể thêm từ khóa NULLS FIRST hoặc NULLS LAST để chỉ định dòng có chứa giá trị NULL sẽ được xếp trước hay sau trong thứ tự so sánh. Mặc định thì khi sắp xếp tăng dần, dòng NULL sẽ xếp sau còn khi sắp xếp giảm dần, dòng NULL sẽ xếp trước.
Có thể sort theo 1 column không có trong mệnh đề SELECT mà có ở trong table.

 

 

Sử dụng biến trong câu SELECT

 

Khi SELECT, nếu muốn thay thế 1 giá trị cố định trong câu SELECT bằng 1 biến để có thể thay đổi giá trị tùy ý khi thực thi, ta có thể dùng ký tự & hay && + tên biến. Đối với biến có giá trị kiểu chuỗi hay ngày tháng, phải đặt trong dấu nháy đơn: ‘&tên_biến’. Ta có thể dùng biến trong mệnh đề SELECT, WHERE, ORDER BY, dùng thay cho giá trị hoặc tên column.

 

Ký tự & bắt buộc người dùng phải nhập lại giá trị mỗi lần thực thi câu lệnh:

 

 

Ký tự && dùng để lưu lại giá trị của biến ở lần thực thi đầu tiên. Các lần sau khi gọi lại câu lệnh Oracle sẽ tự truyền giá trị ở lần đầu vào. Ở ví dụ dưới đây sử dụng 1 biến cho cả column trong mệnh đề SELECT và mệnh đề ORDER BY. Nếu gọi lại câu lệnh lần thứ 2 bằng dấu / thì ta sẽ không phải nhập giá trị biến column nữa:

 

 

 

Nếu muốn đặt lại giá trị cho biến &&column, sử dụng lệnh UNDEFINE để clear giá trị của biến:

 

 

Ngược lại, ta có thể dùng DEFINE để set trước giá trị biến:

 

 

Trong các ví dụ trên ta đều thấy SQL*Plus hiện ra thông tin của 1 mệnh đề trước và sau khi gán giá trị cho biến, thông qua 2 dòng old và new. Đó là khi ta set biến môi trường VERIFYON. Nếu ta set biến VERIFY là OFF thì thông tin này sẽ không còn hiện ra:

 

 

Mình sẽ có 1 bài viết riêng về biến môi trường trong SQL*Plus.

 

Như vậy, sau bài này, chúng ta đã có được cấu trúc của 1 câu SELECT như sau: