Hạn chế và sắp xếp dữ liệu

Các khả năng cần thiết của câu lệnh SELECT là Lựa chọn, Chiếu và Nối. Hiển thị các cột cụ thể từ một bảng được gọi là hoạt động của dự án. Bây giờ chúng ta sẽ tập trung vào việc hiển thị các hàng đầu ra cụ thể. Đây được gọi là một hoạt động chọn lọc. Các hàng cụ thể có thể được chọn bằng cách thêm mệnh đề WHERE vào truy vấn SELECT. Trên thực tế, mệnh đề WHERE xuất hiện ngay sau mệnh đề FROM trong phân cấp truy vấn SELECT. Trình tự phải được duy trì trong tất cả các tình huống. Nếu vi phạm, Oracle đưa ra một ngoại lệ.

Cú pháp:

SELECT *|{[DISTINCT] column| expression [alias],..}
FROM table
[WHERE condition(s)]

Trong cú pháp,

  • Mệnh đề WHERE là từ khóa

  • [điều kiện] chứa tên cột, biểu thức, hằng số, ký tự và toán tử so sánh.

Giả sử rằng người quản lý của bạn đang làm việc về ngân sách hàng quý cho tổ chức của bạn. Là một phần của hoạt động này, cần phải đưa ra danh sách các chi tiết cần thiết của từng nhân viên, nhưng chỉ dành cho những nhân viên được trả ít nhất 25.000 đô la hàng năm. Truy vấn SQL bên dưới hoàn thành nhiệm vụ này. Lưu ý việc sử dụng mệnh đề WHERE được in đậm.

SELECT Employee_ID, Last_Name, First_Name, Salary
FROM employees
WHERE Salary >= 25000;  

EMPLOYEE_ID  LAST_NAME        FIRST_NAME       SALARY
----------   ---------------  ---------------  -----------
88303        Jones            Quincey          $30,550.00
88404        Barlow           William          $27,500.00
88505        Smith            Susan            $32,500.00

3 rows selected

Những điểm cần lưu ý -

  • Mệnh đề SELECT chỉ có thể chứa một mệnh đề WHERE. Tuy nhiên, có thể thêm nhiều điều kiện lọc vào mệnh đề WHERE bằng toán tử AND hoặc OR.

  • Các cột, ký tự hoặc biểu thức trong mệnh đề vị ngữ phải có kiểu dữ liệu tương tự hoặc có thể chuyển đổi cho nhau.

  • Không thể sử dụng bí danh cột trong mệnh đề WHERE.

  • Các ký tự ký tự phải được đặt trong dấu ngoặc kép và phân biệt chữ hoa chữ thường.

  • Các ký tự ngày tháng phải được đặt trong dấu ngoặc kép và có định dạng nhạy cảm. Định dạng mặc định làDD-MON-RR.

Toán tử so sánh

Toán tử so sánh được sử dụng trong các vị từ để so sánh một số hạng hoặc toán hạng với một số hạng khác. SQL cung cấp tập hợp toàn diện các toán tử bình đẳng, bất bình đẳng và linh tinh. Chúng có thể được sử dụng tùy thuộc vào dữ liệu và logic điều kiện lọc trong truy vấn SELECT. Khi bạn sử dụng toán tử so sánh trong mệnh đề WHERE, các đối số (đối tượng hoặc giá trị bạn đang so sánh) ở cả hai bên của toán tử phải là tên cột hoặc một giá trị cụ thể. Nếu một giá trị cụ thể được sử dụng, thì giá trị đó phải là giá trị số hoặc chuỗi ký tự. Nếu giá trị là một chuỗi ký tự hoặc ngày tháng, bạn phải nhập giá trị trong dấu ngoặc kép ('').

Oracle có chín toán tử so sánh được sử dụng trong các điều kiện bình đẳng hoặc bất bình đẳng.

Operator  Meaning
=         equal to 
<         less than
>         greater than
>=        greater than or equal to
<=        less than or equal to
!=        not equal to
<>        not equal to

Các toán tử Oracle khác là BETWEEN..AND, IN, LIKE và IS NULL.

GIỮA Toán tử

Toán tử BETWEEN có thể được sử dụng để so sánh một giá trị cột trong một phạm vi xác định. Phạm vi được chỉ định phải có giới hạn dưới và giới hạn trên, trong đó cả hai đều được bao gồm trong quá trình so sánh. Việc sử dụng nó tương tự như toán tử bất đẳng thức hỗn hợp (<= và> =). Nó có thể được sử dụng với các giá trị kiểu số, ký tự và ngày tháng.

Ví dụ, điều kiện WHERE SALARY BETWEEN 1500 AND 2500 trong một truy vấn SELECT sẽ liệt kê những nhân viên có mức lương từ 1500 đến 2500.

Toán tử IN

Toán tử IN được sử dụng để kiểm tra giá trị cột trong một tập giá trị nhất định. Nếu cột có thể được tương đương với bất kỳ giá trị nào từ tập hợp đã cho, điều kiện được xác nhận. Điều kiện được xác định bằng cách sử dụng toán tử IN còn được gọi là điều kiện thành viên.

Ví dụ, điều kiện WHERE SALARY IN (1500, 3000, 2500) trong một truy vấn SELECT sẽ hạn chế các hàng có mức lương là 1500, 3000 hoặc 2500.

Nhà điều hành LIKE

Toán tử LIKE được sử dụng để đối sánh mẫu và tìm kiếm ký tự đại diện trong truy vấn SELECT. Nếu một phần của giá trị cột không xác định, ký tự đại diện có thể được sử dụng để thay thế phần không xác định. Nó sử dụng các toán tử ký tự đại diện để xây dựng chuỗi tìm kiếm, do đó tìm kiếm được gọi là tìm kiếm theo ký tự đại diện. Hai toán tử này là Phân vị ('%') và Dấu gạch dưới ('_'). Dấu gạch dưới ('_') thay thế một ký tự trong khi phần trăm ('%') thay thế nhiều ký tự. Chúng cũng có thể được sử dụng kết hợp.

Ví dụ: truy vấn SELECT bên dưới liệt kê tên của những nhân viên có họ bắt đầu bằng 'SA'.

SELECT first_name
FROM employees
WHERE last_name LIKE 'SA%';

Điều kiện KHÔNG ĐẦY ĐỦ

Cần lưu ý, không thể kiểm tra giá trị NULL bằng toán tử bình đẳng. Đó là vì giá trị NULL không xác định và không được gán trong khi toán tử bình đẳng kiểm tra một giá trị xác định. Toán tử IS NULL đóng vai trò là toán tử bình đẳng để kiểm tra các giá trị NULL của một cột.

Ví dụ, điều kiện WHERE COMMISSION_PCT IS NULL trong một truy vấn SELECT sẽ liệt kê những nhân viên không có phần trăm hoa hồng.

Toán tử logic

Có thể thêm nhiều điều kiện lọc vào vị từ mệnh đề WHERE. Nhiều hơn một điều kiện có thể được kết hợp với nhau bằng cách sử dụng các toán tử logic AND, OR và NOT.

  • AND: kết hợp hai hoặc nhiều điều kiện và chỉ trả về kết quả khi tất cả các điều kiện đều đúng.

  • HOẶC: kết hợp hai hoặc nhiều điều kiện và nó trả về kết quả khi bất kỳ điều kiện nào là đúng.

  • NOT: phủ định biểu thức theo sau nó.

Toán tử AND liên kết hai hoặc nhiều điều kiện trong mệnh đề WHERE và chỉ trả về TRUE nếu tất cả các điều kiện đều đúng. Giả sử rằng một nhà quản lý cần một danh sách các nhân viên nữ. Hơn nữa, danh sách chỉ nên bao gồm những nhân viên có họ bắt đầu bằng chữ "E" hoặc có tên sau trong bảng chữ cái. Ngoài ra, bảng kết quả nên được sắp xếp theo họ của nhân viên. Có hai điều kiện đơn giản để được đáp ứng. Mệnh đề WHERE có thể được viết thành: WHERE Gender = 'F' AND last_name> 'E'.

SELECT last_name "Last Name", first_name "First Name", Gender "Gender"
FROM employees
WHERE Gender = 'F' AND last_name > 'E'
ORDER BY last_name;

Toán tử OR liên kết nhiều hơn một điều kiện trong mệnh đề WHERE và trả về TRUE nếu một trong hai điều kiện trả về true. Giả sử rằng các yêu cầu của người quản lý tổ chức của bạn thay đổi một chút. Một danh sách nhân viên khác là cần thiết, nhưng trong danh sách này, các nhân viên phải: (1) là nữ hoặc, (2) có họ bắt đầu bằng chữ cái "T" hoặc một chữ cái có sau trong bảng chữ cái. Bảng kết quả nên được sắp xếp theo họ của nhân viên. Trong tình huống này, một trong hai điều kiện có thể được đáp ứng để đáp ứng truy vấn. Nhân viên nữ nên được liệt kê cùng với nhân viên có tên thỏa mãn điều kiện thứ hai.

Toán tử NOT được sử dụng để phủ định một biểu thức hoặc ký hiệu.

Mệnh đề ORDER BY

Khi bạn chỉ hiển thị một vài hàng dữ liệu, có thể không cần thiết phải sắp xếp đầu ra; tuy nhiên, khi bạn hiển thị nhiều hàng, người quản lý có thể được hỗ trợ trong việc ra quyết định bằng cách sắp xếp thông tin. Đầu ra từ câu lệnh SELECT có thể được sắp xếp bằng cách sử dụng mệnh đề ORDER BY tùy chọn. Khi bạn sử dụng mệnh đề ORDER BY, tên cột mà bạn đang đặt hàng cũng phải là tên cột được chỉ định trong mệnh đề SELECT.

Truy vấn SQL dưới đây sử dụng mệnh đề ORDER BY để sắp xếp bảng kết quả theo cột last_name theo thứ tự tăng dần. Thứ tự tăng dần là thứ tự sắp xếp mặc định.

SELECT last_name, first_name
FROM employees
WHERE last_name >= 'J'
ORDER BY last_name;

last_name        first_name
---------------  ---------------
Jones            Quincey
Klepper          Robert
Quattromani      Toni
Schultheis       Robert

Việc sắp xếp cũng có thể dựa trên giá trị số và ngày. Việc sắp xếp cũng có thể được thực hiện dựa trên nhiều cột.

Theo mặc định, mệnh đề ORDER BY sẽ sắp xếp các hàng đầu ra trong bảng kết quả theo thứ tự tăng dần. Chúng ta có thể sử dụng từ khóa DESC (viết tắt của từ khóa giảm dần) để kích hoạt tính năng sắp xếp giảm dần. Mặc định thay thế là ASC sắp xếp theo thứ tự tăng dần, nhưng từ khóa ASC hiếm khi được sử dụng vì nó là từ khóa mặc định. Khi từ khóa tùy chọn ASC hoặc DESC được sử dụng, nó phải theo sau tên cột mà bạn đang sắp xếp trong mệnh đề WHERE.

Positional Sorting - Vị trí số của cột trong danh sách cột đã chọn có thể được đưa ra trong mệnh đề ORDER BY, thay vì tên cột. Nó chủ yếu được sử dụng trong các truy vấn UNION (sẽ thảo luận ở phần sau). Truy vấn sắp xếp kết quả được đặt theo mức lương kể từ khi nó xuất hiện thứ 2 trong danh sách cột.

SELECT  first_name, salary
FROM employees
ORDER BY 2;

Các biến thay thế

Khi một truy vấn SQL phải được thực thi nhiều lần cho các tập hợp đầu vào khác nhau, các biến thay thế có thể được sử dụng. Các biến thay thế có thể được sử dụng để nhắc người dùng nhập trước khi thực hiện truy vấn. Chúng được sử dụng rộng rãi trong việc tạo báo cáo dựa trên truy vấn, lấy phạm vi dữ liệu từ người dùng làm đầu vào để lọc có điều kiện và hiển thị dữ liệu. Các biến thay thế được bắt đầu bằng một ký hiệu dấu và (&) để tạm thời lưu trữ các giá trị. Ví dụ,

SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM employees
WHERE LAST_NAME = &last_name
OR EMPLOYEE_ID = &EMPNO;

Khi truy vấn SELECT ở trên được thực thi, oracle xác định '&' là biến thay thế. Nó nhắc người dùng nhập giá trị cho 'last_name' và 'EMPNO' như bên dưới.

Enter value for last_name:
Enter value for empno:

Khi người dùng cung cấp đầu vào cho cả hai biến, các giá trị được thay thế, truy vấn được xác minh và thực thi.

Những điểm cần lưu ý -

  • Nếu biến được dùng để thay thế một ký tự hoặc giá trị ngày tháng, thì ký tự cần được đặt trong dấu nháy đơn. Một kỹ thuật hữu ích là đặt dấu và biến thay thế trong dấu ngoặc kép khi xử lý các giá trị ký tự và ngày tháng.

  • Cả SQL Developer và SQL * Plus đều hỗ trợ các biến thay thế và lệnh DEFINE / UNDEFINE. Mặc dù SQL Developer hoặc SQL * Plus không hỗ trợ kiểm tra xác thực (ngoại trừ kiểu dữ liệu) trên đầu vào của người dùng.

  • Bạn có thể sử dụng các biến thay thế không chỉ trong mệnh đề WHERE của câu lệnh SQL mà còn để thay thế cho tên cột, biểu thức hoặc văn bản.

Sử dụng biến số thay thế dấu hiệu và ký hiệu kép

Khi cùng một biến thay thế được sử dụng tại nhiều nơi, thì để tránh nhập lại cùng một dữ liệu, chúng ta sử dụng dấu kép và thay thế. Trong những trường hợp như vậy, giá trị của biến thay thế, sau khi được nhập, sẽ được thay thế ở tất cả các trường hợp sử dụng.

SELECT first_name, HIRE_DATE, SEPARATION_DATE
FROM employees
WHERE HIRE_DATE LIKE '%&DT%' AND SEPARATION_DATE '%&&DT%'

Lưu ý rằng cùng một giá trị & DT được thay thế hai lần trong truy vấn trên. Vì vậy, giá trị của nó khi được người dùng cung cấp sẽ được thay thế ở hai vị trí.

Các lệnh DEFINE và VERIFY

Thiết lập định nghĩa của các biến trong một phiên được đặt bởi tính năng DEFINE của SQL * Plus. Các biến có thể được xác định trong phiên, để tránh bị dừng trong quá trình thực thi truy vấn. Oracle đọc cùng một biến bất cứ khi nào gặp trong một truy vấn SQL. Nó ở trạng thái ON theo mặc định. Với sự trợ giúp của mệnh đề DEFINE, người ta có thể khai báo một biến trong dòng lệnh trước khi thực hiện truy vấn nhưDEFINE variable=value;.

Lệnh Verify xác minh sự thay thế ở trên hiển thị dưới dạng câu lệnh CŨ và MỚI. Nó được TẮT theo mặc định và có thể được đặt thành BẬT bằng lệnh SET.

SQL> SET DEFINE ON
SQL> SET VERIFY ON
SQL> DEFINE NAME = MARTIN'
SQL> SELECT first_name, SALARY 
FROM employees
WHERE first_name = '&NAME';
OLD   1: select first_name, sal from employee where first_name = '&first_name'
new   1: select first_name, sal from employee where first_name = 'MARTIN'

first_name     SALARY
-------        -------
MARTIN         5000