Giới hạn và sắp xếp dữ liệu (Restricting and Sorting Data) trong một câu truy vấn Oracle SQL

SysVN tiếp tục giới thiệu bài viết “Restricting and Sorting Data” trong một câu truy vấn dùng mệnh đề SELECT.  Restricting and Sorting Data tôi tạm dịch sang tiếng Việt là giới hạn và sắp xếp dữ liệu. Tài liệu kỹ thuật bằng tiếng Anh có ý nghĩa nguyên bản, đọc rất dễ hiểu. Khi dịch sang tiếng Việt, tùy theo cách hiểu của mỗi người mà có cách dịch khá nhau. Đó là lý do tôi thích đọc tài liệu tiếng Anh.

Sau khi hiểu được bài này các bạn có thể làm được những vấn đề sau:

  • Giới hạn những hàng hiển thị dữ liệu bởi một câu truy vấn
  • Sắp xếp lại dữ liệu những hàng được hiển thị bởi một câu truy vấn
  • Cách sử dụng mệnh đề WHERE
  • Cách sử dụng những toán tử so sánh  =, <=, BETWEEN, IN, LIKE và điều kiện NULL
  • Cách sử dụng những toán tử logic: AND, OR, NOT
  1. Giới hạn những hàng được hiển thị

Cú pháp: 

SELECT *|{[DISTINCT] column|expression [alias],…}
FROM
table
[WHERE logical expression(s)];

Chú ý:

  • Giới hạn những hàng được hiển thị bằng cách sử dụng mệnh đề WHERE. Mệnh đề WHERE chứa một điều kiện. Nếu điều kiện là đúng và những hàng khớp với điều kiện đó thì trả về kết quả.
  • Mệnh để WHERE đứng sau mệnh đề FROM
  • Không sử dụng Column Alias trong mệnh đề WHERE
  • Mệnh đề WHERE so sánh những giá trị trong những column, literal, biểu thức toán học, những hàm. Nó bao gồm ba thành phần:

– Tên column
– Điều kiện so sánh
– Tên column, hằng số, danh sách các giá trị

Ví dụ: Với vị dụ trên hiển thị employee_id, last_name, job_id, department_id của những nhân viên mà có mã phòng ban là 90

SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90;

2. Chuỗi ký tự và ngày

Quy tắc:

  • Chuỗi ký tự và ngày (Character Strings and Dates) được đặt trong dấu nháy đơn.
  • Chuối ký tự phân biệt hoa thường, giá trị ngày (date) phụ thuộc vào định dạng
  • Định dạng mặc định của kiểu ngày là  DD-MON-RR. Chi tiết định dạng RR và thay đổi định dạng mặc định sẽ tìm hiểu trong bài sau

Ví dụ: 

SELECT last_name, job_id, department_id
FROM employees
WHERE last_name = ‘King’;

SELECT last_name
FROM employees
WHERE hire_date = ’17-FEB-95′;

3. Toán tử so sánh

Toán tử so sánh được sử dụng trong điều kiện để so sánh một biểu thức với một giá trị hoặc biểu thức khác. Toán tử so sánh được sử dụng trong mệnh đề WHERE có định dạng. Có thể sử dụng  != và ^= để so sánh không bằng.

… WHERE expr operator value

Ví dụ: 

… WHERE hire_date = ’01-JAN-95‘
… WHERE salary >= 6000
… WHERE last_name = ‘Smith’

Ví dụ: Hiển thị last_name, salary của những nhân viên có lương dưới 3000$

SELECT last_name, salary
FROM employees
WHERE salary <= 3000 ;

a. Sử dụng toán tử  BETWEEN 

BETWEEN thường được sử dụng với AND để hiển thị kết quả những hàng dựa vào một dãy giá trị điều kiện

Ví dụ: Hiển thị last_name, salary của những nhân viên mà có lương từ 2500$ đến 3500$

SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500 ;

BETWEEN cũng có thể được sử dụng với kiểu ký tự. Ví dụ:

SELECT last_name
FROM employees
WHERE last_name BETWEEN ‘King’ AND ‘Smith’

b. Sử dụng toán tử IN

Để kiểm tra những giá trị trong một danh sách các giá trị thường sử dụng toán tử IN

Ví dụ: Hiển thị  employee_id, last_name, salary, manager_id của những nhân viên mà có manager_id là 100 hoặc 101 hoặc 201

SELECT employee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id IN (100, 101, 201) ;

Ví dụ trên có thể sử dụng điều kiện OR

SELECT employee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id = 100
      OR manager_id = 101
      OR manager_id = 201

Chú ý:

  • Danh sách các giá trị được chỉ ra trong IN theo thứ tự ngẫu nhiên
  • Toán tử IN có thể sử dụng bất kỳ kiểu dữ liệu nào

Ví dụ: Hiển thị employee_id, manager_id, department_id của những nhân viên mà có last_name là Hartstein hoặc Vargas

SELECT employee_id, manager_id, department_id
FROM employees
WHERE last_name IN (‘Hartstein’, ‘Vargas’);

c. Sử dụng toán tử LIKE

LIKE được sử dụng để so sánh một giá trị với các giá trị tương tự bởi sử dụng các toán tử wildcard. Có hai wildcard được sử dụng kết hợp với toán tử LIKE là % và _

  • % đại diện cho 0 hoặc nhiều ký tự chữ hoặc số
  • _ đại diện cho một ký tự chữ hoặc số

Ví dụ: Hiển thị tên của những nhân viên bắt đầu ký tự “S”

SELECT first_name
FROM employees
WHERE first_name LIKE ‘S%’ ;

Tùy vào từng trường hợp, LIKE cũng có thể thay thế cho BETWEEN

Ví dụ: Hiển thị last_name, hire_date của những nhân viên bắt đầu làm việc từ tháng 1-1995 đên 12-1995

SELECT last_name, hire_date
FROM employees
WHERE hire_date LIKE ‘%95’;

Có thể kết hợp 2 wildcard (%, _) với những ký tự 

Ví dụ:

SELECT last_name
FROM employees
WHERE last_name LIKE ‘_o%’ ;

Nếu trong chuỗi ký tự hiển thị yêu cầu có chứa có ký tự đặc biệt như %, _ thì ta có thể dùng  ESCAPE. Ví dụ

SELECT employee_id, last_name, job_id
FROM employees
WHERE job_id LIKE ‘%SA\_%’ ESCAPE ‘\’;

d. Điều kiện NULL

Để kiểm tra điều kiện Null có thể dùng hai mệnh đề IS NULL, IS NOT NULL. Giá trị Null là giá trị không có, không được gán, không biết, không phải zero, không phải khoảng trắng. Do đó ta không thể dùng dấu = trong biểu thức kiểm tra, bởi vì giá trị Null bằng hoặc không bằng với bất kỳ giá trị nào

  • IS NULL để kiểm tra giá trị là Null
  • IS NOT NULL để kiểm tra giá trị không phải là Null

Ví dụ: Hiển thị last_name, manager_id của những nhân viên nào không có manager_id

SELECT last_name, manager_id
FROM employees
WHERE manager_id IS NULL ;

Ví dụ: Hiển thị last_name, job_id, commission_pct của những nhân viên mà có nhận commission

SELECT last_name, job_id, commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;

e. Sử dụng toán tử logic

Toán tử logic trong SQL bao gồm: AND, OR, NOT

Toán tử AND

Ví dụ: Hiển thị employee_id, last_name, job_id, salary của những nhân viên mà có lương trên 10000$ và job_id có chưa MAN

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >= 10000
AND job_id LIKE ‘%MAN%’ ;

Bảng bên dưới là kết quả của sự kết hợp 2 biểu thức sử dụng AND

Toán tử OR

Ví dụ: Hiển thị employee_id, last_name, job_id, salary của những nhân viên mà có lương trên 10000$ hoặc có job_id có chưa MAN

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >= 10000
OR job_id LIKE ‘%MAN%’ ;

Bảng bên dưới là kết quả của sự kết hợp 2 biểu thức sử dụng OR

Toán tử NOT

Ví dụ: Hiển thị last_name, job_id của những nhân viên mà có job_id không phải là IT_PROG hoặc ST_CLERK hoặc SA_REP

SELECT last_name, job_id
FROM employees
WHERE job_id
NOT IN (‘IT_PROG’, ‘ST_CLERK’, ‘SA_REP’) ;

Bảng bên dưới là kết quả của việc sử dụng toán tử NOT

NOTTRUEFALSENULL
 FALSETRUENULL

Chú ý: Toán tử NOT cũng có thể được sử dụng với các toán tử khác như  BETWEEN, LIKENULL.

Vi dụ:

… WHERE job_id NOT IN (‘AC_ACCOUNT’, ‘AD_VP’)
… WHERE salary NOT BETWEEN 10000 AND 15000
… WHERE last_name NOT LIKE ‘%A%’
… WHERE commission_pct IS NOT NULL