- SQL 證書學習資料
- SQL - 簡介
- SQL - SQL 考試大綱
- SQL - SQL SELECT 語句
- SQL - 限制和排序資料
- SQL - 使用單行函式
- SQL - 條件表示式
- SQL - 使用組函式
- SQL - 從多個表獲取資料
- SQL - 使用子查詢解決查詢
- SQL - 使用集合運算子
- SQL - 資料操作
- SQL - 使用 DDL 語句
- SQL - 建立其他模式物件
- SQL 證書題庫
- SQL - SQL SELECT 語句
- SQL - 限制和排序資料
- SQL - 使用單行函式
- SQL - 轉換函式
- SQL - 條件表示式
- SQL - 使用組函式
- SQL - 從多個表獲取資料
- SQL - 使用子查詢解決查詢
- SQL - 使用集合運算子
- SQL - 資料操作
- SQL - 使用 DDL 語句
- SQL - 建立其他模式物件
- SQL 證書模擬考試
- SQL 證書 - 模擬考試
- SQL 證書實用資源
- SQL 證書 - 實用資源
- SQL 證書 - 討論
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