ĐĂNG KÝ ĐỂ NHẬN THÔNG TIN MỚI NHẤT

WHERE – ORDER BY – Tự học SQL cơ bản (phần 2) – Sắp xếp và chọn lọc dữ liệu khi truy vấn với SQL

WHERE – ORDER BY – Tự học SQL cơ bản (phần 2) – Sắp xếp và chọn lọc dữ liệu khi truy vấn với SQL

Trong bài viết thứ 2 của Chương trình tự học SQL cơ bản, anh em sẽ được tìm hiểu với các nội dung sau:

  • Sắp xếp dữ liệu với mệnh đề ORDER BY.
  • Chọn lọc dữ liệu với điều kiện WHERE.
  • Lưu ý giá trị NULL khi thực hiện truy vấn với SQL.

1. Sắp xếp và lọc dữ liệu trong câu lệnh truy vấn

Mệnh đề ORDER BY

Ở bài viết đầu tiên khi truy vấn dữ liệu trong bảng, ta chưa để ý đến thứ tự của các bản ghi được trả về khi thực hiện SELECT. Để sắp xếp thứ tự các bản ghi ta dùng mệnh đề ORDER BY như sau.

Ví dụ sắp xếp danh sách nhân viên theo thứ tự alphabet của họ nhân viên.

SELECT 
   last_name, first_name 
FROM employees
ORDER BY last_name;

Mặc định khi dùng mệnh đề ORDER BY, các bản ghi sẽ được sắp xếp thứ tự tăng dần (Ascending). Nếu muốn đổi lại theo thứ tự giảm dần, thêm từ khóa DESC (Descending) như sau.

SELECT 
   last_name, first_name 
FROM employees
ORDER BY last_name DESC;

Ngược lại với từ khóa DESCASC (Ascending). Mệnh đề ORDER BY last_name sẽ giống với ORDER BY last_name ASC.

SELECT 
   last_name, first_name 
FROM employees
ORDER BY last_name ASC;

Cú phép ASC và DESC trong Mệnh đề ORDER BY cũng tương tự với các Hệ CSDL khác. Để có thể sắp xếp theo nhiều cột, ta ngăn cách mỗi cột với dấu phẩy như khi SELECT. ORDER BY sẽ sắp xếp theo lần lượt thứ tự các cột được điền trong câu lệnh truy vấn.

SELECT * FROM employees
ORDER BY department_id, job_id, email;

Ta cũng có thể dùng cả từ khóa DESCASC cho các cột khác nhau.

SELECT * FROM employees
ORDER BY department_id ASC, job_id DESC, email;

Trong thường hợp tên cột quá dài hoặc quá phức tạp mà không muốn mất công ghi lại 1 lần nữa tên cột trong mệnh đề ORDER BY, ta có thể dùng số thay cho tên cột như sau (cú pháp này không áp dụng cho MySQL).

SELECT
   last_name, first_name, 
   job_id, department_id 
FROM employees
ORDER BY 1, 2;

Đây chính là số thứ tự của các cột được viết sau từ khóa SELECT. Mệnh đề ORDER BY 4, 1 dưới đây sẽ tương đương với ORDER BY department_id, last_name.

SELECT
   last_name, first_name, 
   job_id, department_id 
FROM employees
ORDER BY 4, 1;

Số thứ tự cũng có thể dùng với từ khóa ASCDESC.

SELECT
   last_name, first_name, 
   job_id, department_id 
FROM employees
ORDER BY 4 DESC, 1 ASC;

Lọc các bản ghi trùng nhau và Giới hạn số lượng bản ghi trả về

Nếu lấy hết toàn bộ dữ liệu trong bảng, ta có thể không gặp trường hợp bản ghi trùng giá trị nhau. Nhưng nếu chỉ lấy một hoặc một vài cột, có thể ta sẽ có các bản ghi với dữ liệu giống nhau, ví dụ họ của nhân viên.

Để loại bỏ các bản ghi có giá trị trùng nhau, ta thêm từ khóa DISTINCT như sau. Ví dụ xem có bao nhiêu mã phòng ban khác nhau từ bảng nhân viên (cú pháp DISTINCT tương tự với các Hệ CSDL khác).

SELECT DISTINCT department_id 
FROM employees
ORDER BY 1;

Câu lệnh SELECT sẽ trả về tất cả các bản ghi của bảng. Nếu muốn SELECT mà kết quả chỉ top 5 hoặc top 10 bản ghi trong bảng ta sẽ thực hiện như sau. Các ví dự dưới đây sẽ lấy ra top 5 nhân viên lương cao nhất trong công ty.

Với SQL Server, ta dùng từ khóa TOP <N>  để giới hạn số lượng bản ghi trả về.

SELECT TOP 5 * FROM employees
ORDER BY salary DESC;

Với Oracle, ta dùng mệnh đề FETCH FIRST <N> ROWS ONLY ở cuối câu truy vấn để giới hạn.

SELECT * FROM employees
ORDER BY salary DESC 
FETCH FIRST 5 ROWS ONLY;

Với PostgreSQLMySQL, ta đều sử dụng từ khóa LIMIT <N> để giới hạn các bản ghi.

SELECT * FROM employees
ORDER BY salary DESC 
LIMIT 5;

2. Chọn lọc dữ liệu chi tiết hơn với điều kiện WHERE

Điều kiện WHERE

Ở bên trên ta mới chỉ lọc các bản ghi trùng nhau hoặc giới hạn số lượng bản ghi trả về. Để lọc kết quả một cách chi tiết và cụ thể hơn ta sẽ sử dụng đến điều kiện WHERE trong câu lệnh truy vấn với SQL.

Ví dụ tìm danh sách tất cả các nhân viên thuộc phòng ban có mã là 10. Ta thực hiện so sánh cột department_id với 10 bằng dấu = như sau.

SELECT * FROM employees
WHERE department_id = 10;

Có tất cả các phép so sánh sau trong SQL: =, !=, >, <, >=, <= (toán tử so sánh). Ví dụ tìm tất cả nhân viên có mã phòng ban khác 20.

SELECT * FROM employees
WHERE department_id != 20;

Ví dụ tìm tất cả nhân viên có lương lớn hoặc bằng 2500$.

SELECT * FROM employees
WHERE salary >= 2500;

Các toán tử so sánh có cú pháp giống nhau với các hệ CSDL, nhưng điều kiện so sánh với từng Hệ CSDL có thể sẽ khác nhau. Ví dụ với câu lệnh tìm nhân viên có họ là King, OraclePostgreSQL sẽ yêu cầu chính xác chuỗi so sánh là ‘King’ chứ không được là ‘king’ hay ‘KING’.

SELECT * FROM employees
WHERE last_name = 'King';

Trong khi với SQL ServerMySQL không yêu cầu chính xác chuỗi so sánh. Dù bạn điền ‘KiNg’, ‘kInG’ hay gì đi chăng nữa CSDL vẫn sẽ tự hiểu được

SELECT * FROM employees
WHERE last_name = 'kinG';

Chú ý có thể sẽ có lúc anh em sẽ gặp các câu lệnh dùng <> thay vì !=. Cả 2 toán tử này đều là phép so sánh khác và đều hợp lệ với các Hệ CSDL. Khác nhau duy nhất ở chỗ != không phải toán tử thuộc tiêu chuẩn ISO, nên anh em hãy sử dụng <> cho phép so sánh khác để phòng sau này có thể gặp phải hệ thống không hiểu toán tử != là gì. 

Kết hợp các điều kiện trong mệnh đề WHERE

Các điều kiện trong WHERE có thể kết hợp nhau để ra cho ra một điều kiện phức tạp hơn, giúp việc lọc dữ liệu hiệu quả hơn.

Để kết hợp các điều kiện ta dùng các toán tử sau gọi là phép Logic: AND, OR, NOT. Ví dụ tìm nhân viên không thuộc phòng ban 20 và có lương từ 2000$ trở lên.

SELECT * FROM employees
WHERE department_id <> 20 AND salary > 2000;

Câu lệnh sẽ sau tìm nhân viên ở phòng ban 20 và phòng ban 30. Ta không dùng toán tử AND vì tất nhiên một nhân viên không thể vừa có mã phòng ban là 20 và cả 30 được. Ý của câu lệnh là tìm các nhân viên ở 2 phòng ban này. 

SELECT * FROM employees
WHERE department_id = 20 OR department_id = 30;

Trong trường hợp ta cần tìm bản ghi thuộc một trong dãy cá giá trị cho trước. Ta sẽ dùng từ khóa IN như sau. Ví dụ tìm nhân viên thuộc phòng ban 20, 30 và 40.

SELECT * FROM employees
WHERE department_id IN (20, 30, 40);

Câu lệnh trên tương ứng với câu lệnh dùng từ khóa OR như dưới đây. 

SELECT * FROM employees
WHERE department_id = 20 OR department_id = 30 OR department_id = 40;

Nếu muốn so sánh trong một khoảng giá trị, ví dụ tìm nhân viên lương từ 1000 đến 3000. Thay vì viết salary >= 1000 AND salary <= 3000, ta có thể dùng từ khóa BETWEEN như sau.

SELECT * FROM employees
WHERE salary BETWEEN 1000 AND 3000;

Các cú pháp câu lệnh trên cũng tương tự với các Hệ CSDL khác.

Tìm kiếm với biểu thức chính quy trong điều kiện WHERE

Khi cần tìm điều kiện với kiểu dữ liệu chuỗi, ví dụ tìm nhân viên theo tên bắt đầu bằng ‘Alex’ nhưng ta lại không nhớ chính xác các ký tự phía sau trong tên ra sao. Khi đó ta sẽ dùng từ khóa LIKE như sau.

SELECT * FROM employees
WHERE first_name LIKE 'Alex%';

Ký tự % được thêm vào trong chuỗi để CSDL hiểu các ký tự phía sau ‘Alex’ có thể là bất cứ chuỗi ký tự nào với độ dài tùy ý. Qua đó sẽ tìm được tất cả nhân viên có tên bắt đầu bằng ‘Alex’.

Ví dụ nếu muốn tìm các nhân viên mà trong tên có chữ ‘son’ ta sẽ thêm ký tự % ở 2 đầu của chuỗi như sau.

SELECT * FROM employees
WHERE first_name LIKE '%son%';

Ví dụ sau sẽ tìm nhân viên thuộc bất cứ bộ phận nào không phải là IT.

SELECT * FROM employees
WHERE job NOT LIKE 'IT%';

Lưu ý với tất cả các hệ CSDL, khi dùng % để tìm mẫu cho chuỗi, ta đều phải dùng dấu nháy đơn ‘ ‘ để thể hiện chuỗi. Kinh nghiệm rút ra là khi sử dụng chuỗi trong câu lệnh truy vấn, dù Hệ CSDL có cho phép các dấu khác đi chăng nữa, ta vẫn chỉ nên dùng nháy đơn để thể hiện chuỗi 

Giá trị NULL trong điều kiện WHERE

Đôi khi trong bảng có thể tồn tại các bản ghi có chứa giá trị Null. Giá trị Null khác với chuỗi rỗng là nó thực sự không có bất cứ thứ gì cả. Ví dụ sau ta sẽ tìm nhân viên mà không có mã quản lý.

SELECT * FROM employees
WHERE manager_id = NULL;

Câu lệnh trên vẫn chạy bình thường nhưng không trả về kết quả nào cả vì thực chất CSDL chẳng hiểu = NULL nghĩa là gì cả. Với CSDL, NULL không phải một kiểu dư liệu như chuỗi hay số mà có thể dùng phép so sánh với nó được.

Thay vào đó ta sử dụng từ khóa IS hay còn gọi là toán tử xác nhận như sau.

SELECT * FROM employees
WHERE manager_id IS NULL;

Ngược lại với IS chính là IS NOT. Ví dụ sau sẽ tìm các nhân viên có mã quản lý.

SELECT * FROM employees
WHERE manager_id IS NOT NULL;

Các cú pháp câu lệnh trên cũng tương tự với các Hệ CSDL khác.

Tiếp theo

Tự học SQL cơ bản (phần 3)

Liên Hệ với Wecommit

Nếu bạn muốn liên hệ với Wecommit, bạn có thể trao đổi trực tiếp qua Facebook cùng Trần Quốc Huy – người sáng lập của Wecommit.

Nếu bạn muốn chúng tôi đồng hành xây dựng sự nghiệp với bạn trong 01 năm (bạn sẽ có rất nhiều kiến thức, kinh nghiệm ĐỘC QUYỀN về tối ưu cơ sở dữ liệu) bạn có thể đăng ký trải nghiệm chương trình Từ điển tối ưu 100x hiệu năng của chúng tôi.

Views: 20





    Câu hỏi bảo mật

    Trả lời

    Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *