SQL - 限制和排序資料



SELECT 語句的基本功能包括選擇、投影和連線。從表中顯示特定列稱為投影操作。我們現在將重點放在顯示特定的輸出行。這稱為選擇操作。可以透過在 SELECT 查詢中新增 WHERE 子句來選擇特定的行。事實上,WHERE 子句出現在 SELECT 查詢層次結構中的 FROM 子句之後。在所有情況下都必須保持此順序。如果違反,Oracle 會引發異常。

語法

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

在語法中,

  • WHERE 子句是關鍵字

  • [condition] 包含列名、表示式、常量、字面量和比較運算子。

假設您的經理正在處理組織的季度預算。作為此活動的一部分,需要生成每個員工基本詳細資訊的列表,但僅限於年薪至少 25,000 美元的員工。下面的 SQL 查詢完成了此任務。請注意粗體顯示的 WHERE 子句的使用。

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 

需要注意的要點 -

  • 一個 SELECT 子句只能包含一個 WHERE 子句。但是,可以使用 AND 或 OR 運算子將多個過濾條件附加到 WHERE 子句。

  • 謂詞子句中的列、字面量或表示式必須具有相似或可相互轉換的資料型別。

  • WHERE 子句中不能使用列別名。

  • 字元字面量必須用單引號括起來,並且區分大小寫。

  • 日期字面量必須用單引號括起來,並且對格式敏感。預設格式為DD-MON-RR

比較運算子

比較運算子用於謂詞中,將一個項或運算元與另一個項進行比較。SQL 提供了全面的相等、不等和雜項運算子集。它們可以根據 SELECT 查詢中的資料和過濾條件邏輯使用。當您在 WHERE 子句中使用比較運算子時,運算子兩側的引數(您要比較的物件或值)必須是列名或特定值。如果使用特定值,則該值必須是數字值或字面字串。如果該值是字元字串或日期,則必須在單引號 (' ') 內輸入該值。

Oracle 有九個比較運算子可用於相等或不等條件。

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

其他 Oracle 運算子包括 BETWEEN..AND、IN、LIKE 和 IS NULL。

BETWEEN 運算子

BETWEEN 運算子可用於比較一定範圍內列的值。指定的範圍必須具有下限和上限,在比較期間兩者都包含在內。其用法類似於複合不等式運算子(<= 和 >=)。它可以用於數字、字元和日期型別值。

例如,SELECT 查詢中的 WHERE 條件SALARY BETWEEN 1500 AND 2500 將列出薪資在 1500 到 2500 之間的員工。

IN 運算子

IN 運算子用於測試給定值集中列的值。如果列可以與給定集中任何值相等,則驗證條件。使用 IN 運算子定義的條件也稱為成員資格條件。

例如,SELECT 查詢中的 WHERE 條件SALARY IN (1500, 3000, 2500) 將限制薪資為 1500、3000 或 2500 的行。

LIKE 運算子

LIKE 運算子用於在 SELECT 查詢中進行模式匹配和萬用字元搜尋。如果列值的某一部分未知,則可以使用萬用字元來替換未知部分。它使用萬用字元運算子構建搜尋字串,因此搜尋稱為萬用字元搜尋。這兩個運算子是百分號 ('%') 和下劃線 ('_')。下劃線 ('_') 替換單個字元,而百分號 ('%') 替換多個字元。它們也可以組合使用。

例如,下面的 SELECT 查詢列出姓氏以 'SA' 開頭的員工的姓氏。

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

IS (NOT) NULL 條件

需要注意的是,不能使用等號運算子測試 NULL 值。這是因為 NULL 值是未知的和未分配的,而等號運算子測試的是確定值。IS NULL 運算子充當等號運算子,用於檢查列的 NULL 值。

例如,SELECT 查詢中的 WHERE 條件COMMISSION_PCT IS NULL 將列出沒有佣金百分比的員工。

邏輯運算子

可以將多個過濾條件新增到 WHERE 子句謂詞。可以使用邏輯運算子 AND、OR 和 NOT 將多個條件組合在一起。

  • AND:連線兩個或多個條件,並且僅當所有條件都為真時才返回結果。

  • OR:連線兩個或多個條件,並且當任何條件為真時都返回結果。

  • NOT:否定其後的表示式。

AND 運算子連結 WHERE 子句中的兩個或多個條件,並且僅當所有條件都為真時才返回 TRUE。假設經理需要一份女性員工的名單。此外,該列表應僅包含姓氏以字母“E”開頭或在字母表中排在後面的員工。此外,結果表應按員工姓氏排序。有兩個簡單的條件需要滿足。WHERE 子句可以寫成: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;

OR 運算子連結 WHERE 子句中的多個條件,並且如果任一條件返回 true,則返回 TRUE。假設您組織經理的要求略有變化。需要另一個員工列表,但在此列表中,員工應:(1)是女性,或(2)姓氏以字母“T”開頭或字母表中排在後面的字母。結果表應按員工姓氏排序。在這種情況下,可以滿足兩個條件中的任何一個以滿足查詢。應列出女性員工以及滿足第二個條件的員工。

NOT 運算子用於否定表示式或條件。

ORDER BY 子句

當您僅顯示幾行資料時,可能不需要對輸出進行排序;但是,當您顯示多行時,透過對資訊進行排序可以幫助經理做出決策。可以使用可選的 ORDER BY 子句對 SELECT 語句的輸出進行排序。當您使用 ORDER BY 子句時,您要排序的列名也必須是 SELECT 子句中指定的列名。

下面的 SQL 查詢使用 ORDER BY 子句按升序對結果表中的 last_name 列進行排序。升序是預設排序順序。

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

排序也可以基於數字和日期值。也可以基於多列進行排序。

預設情況下,ORDER BY 子句將按升序對結果表中的輸出行進行排序。我們可以使用關鍵字 DESC(代表降序)啟用降序排序。另一種預設值是 ASC,它按升序排序,但 ASC 關鍵字很少使用,因為它已成為預設值。當使用 ASC 或 DESC 可選關鍵字時,它必須跟隨您在 WHERE 子句中排序的列名。

位置排序 - 可以ORDER BY 子句中使用選定列列表中列的數字位置,而不是列名。它主要用於 UNION 查詢(稍後討論)。該查詢按 salary 對結果集進行排序,因為它在列列表中排在第 2 位。

SELECT  first_name, salary
FROM employees
ORDER BY 2;

替換變數

當 SQL 查詢必須針對不同的輸入集執行多次時,可以使用替換變數。可以在查詢執行之前使用替換變數提示使用者輸入。它們廣泛用於基於查詢的報表生成,該報表從使用者處獲取資料範圍作為條件過濾和資料顯示的輸入。替換變數以單個&符號開頭,用於臨時儲存值。例如,

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

當執行上述 SELECT 查詢時,Oracle 將“&”識別為替換變數。它提示使用者如下輸入“last_name”和“EMPNO”的值。

Enter value for last_name:
Enter value for empno:

一旦使用者為這兩個變數提供輸入,就會替換值,驗證並執行查詢。

需要注意的要點 -

  • 如果變數旨在替換字元或日期值,則需要將字面量用單引號括起來。在處理字元和日期值時,將&替換變數用單引號括起來是一個有用的技巧。

  • SQL Developer 和 SQL*Plus 都支援替換變數和 DEFINE/UNDEFINE 命令。儘管 SQL Developer 或 SQL*Plus 不支援對使用者輸入進行驗證檢查(資料型別除外)。

  • 您不僅可以在 SQL 語句的 WHERE 子句中使用替換變數,還可以將其用作列名、表示式或文字的替換。

使用雙&替換變數

當在多個地方使用相同的替換變數時,為了避免再次重新輸入相同的資料,我們使用雙&替換。在這種情況下,一旦輸入替換變數的值,就會在所有使用位置進行替換。

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

請注意,在上述查詢中,&DT 的值被替換了兩次。因此,使用者一旦提供其值,它將在兩個位置被替換。

DEFINE 和 VERIFY 命令

在 SQL*Plus 中,使用 DEFINE 功能設定會話中變數的定義。變數可以在會話中定義,從而避免查詢執行期間停止。Oracle 在 SQL 查詢中遇到相同的變數時會讀取它。預設情況下處於開啟狀態。藉助 DEFINE 子句,可以在查詢執行之前在命令列中宣告變數,例如 **DEFINE variable=value;**。

Verify 命令驗證上述替換,顯示為 OLD 和 NEW 語句。預設情況下處於關閉狀態,可以使用 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
廣告

© . All rights reserved.