3、Oracle 中的過濾、排序

画个一样的我發表於2024-05-18

最近專案要用到Oracle,奈何之前沒有使用過,所以在B站上面找了一個學習影片,用於記錄學習過程以及自己的思考。
影片連結:
【尚矽谷】Oracle資料庫全套教程,oracle從安裝到實戰應用
如果有侵權,請聯絡刪除,謝謝。

更加詳細的教程,可以直接觀看此連結Oracle教程

1、過濾

1.1、基本使用方式

使用方式:使用 WHERE 子句,將不滿足條件的行過濾掉。

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

WHERE 子句緊隨 FROM 子句。

比如:

-- 查詢 department_id 等於 90 的資料
SELECT employee_id, last_name, job_id, department_id
FROM   employees
WHERE  department_id = 90 ;

1.2、過濾中使用字元和日期

過濾條件中使用字元和日期,有以下幾點需要注意:

  • 字元和日期要包含在單引號中
  • 字元大小寫敏感,日期格式敏感
  • 預設的日期格式是 DD-MON月-RR。(eg: 7-7月-1996)。使用此方式容易出現格式不匹配,後面再單行函式中做轉換後查詢。
-- 字串查詢
SELECT last_name, job_id, department_id
FROM   employees
WHERE  last_name = 'Whalen';


--日期查詢
SELECT last_name, hire_date, department_id
FROM   employees
WHERE  hire_date = '7-6月-1994';

--使用單行函式後的日期查詢
SELECT last_name, hire_date, department_id
FROM   employees
WHERE  to_char(hire_date, 'yyyy-mm-dd') = '1994-06-07';

以下的查詢方式都不對:

-- ORA-00904: "yyyy-mm-dd": 識別符號無效
WHERE  to_char(hire_date, "yyyy-mm-dd") = '1994-06-07';  -- 報錯

WHERE  to_char(hire_date, 'yyyy-mm-dd') = '1994-6-07';  -- 得不到正確資料

1.3、where 條件中的比較運算

賦值使用 := 符號

1、比較運算

-- 查詢薪資小於等於3000的
SELECT last_name, salary
FROM   employees
WHERE  salary <= 3000;

1.4、其它比較運算

1、BETWEEN

使用 BETWEEN 運算來顯示在一個區間內的值

-- 查詢薪資大於等於2500並且小於等於3500的
SELECT last_name, salary
FROM   employees
WHERE  salary BETWEEN 2500 AND 3500;

2、IN
使用 IN運算顯示列表中的值。

-- 查詢薪資等於 100或者101或者201的
SELECT employee_id, last_name, salary, manager_id
FROM   employees
WHERE  manager_id IN (100, 101, 201);

1.5 LIKE

  • 使用 LIKE 運算選擇類似的值(模糊查詢)
  • 選擇條件可以包含字元或數字:
  • % 代表零個或多個字元(任意個字元)
  • _代表一個字元。
-- 查詢first_name 以S開頭的
SELECT	first_name
FROM 	employees
WHERE	first_name LIKE 'S%';

1、%-可以同時使用。

-- 查詢第二個字元是o的資料
SELECT last_name
FROM   employees
WHERE  last_name LIKE '_o%';

2、可以使用 ESCAPE 識別符號 選擇%_ 符號。

迴避特殊符號的:使用轉義符。例如:將[%]轉為[%]、[_]轉為[_],然後再加上[ESCAPE ‘\’] 即可。

-- 查詢以 IT_ 開頭的資料。注意查詢後面需要加上 escape 。
SELECT job_id
FROM   jobs
WHERE  job_id LIKE 'IT\_%' escape '\';

1.6、NULL

使用 IS (NOT) NULL 判斷空值。

-- 查詢 manager_id 等於 NULL 的資料
SELECT last_name, manager_id
FROM   employees
WHERE  manager_id IS NULL;

1.7、邏輯運算

1.7.1、AND

AND 要求並的關係為真。

-- 查詢salary 大於等於10000 並且 job_id 包含 MAN 的資料
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >=10000
AND    job_id LIKE '%MAN%';
1.7.2、OR

OR 要求或關係為真。

-- 查詢 salary 大於等於 或者 job_id 包含 MAN 的資料
SELECT employee_id, last_name, job_id, salary
FROM   employees
WHERE  salary >= 10000
OR     job_id LIKE '%MAN%';
1.7.3、NOT
-- 查詢 job_id 不在 ('IT_PROG', 'ST_CLERK', 'SA_REP') 列表中的資料
SELECT last_name, job_id
FROM   employees
WHERE  job_id 
       NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');

1.8、優先順序

可以使用括號改變優先順序順序

2、ORDER BY子句

  • 使用 ORDER BY 子句排序
    • ASC(ascend): 升序
    • DESC(descend): 降序
  • ORDER BY 子句在SELECT語句的結尾
SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date ;

1、降序排序

SELECT   last_name, job_id, department_id, hire_date
FROM     employees
ORDER BY hire_date DESC ;

2、按別名排序

SELECT employee_id, last_name, salary*12 annsal
FROM   employees
ORDER BY annsal;

3、多個列排序

按照ORDER BY 列表的順序排序。

SELECT last_name, department_id, salary
FROM   employees
ORDER BY department_id, salary DESC;

可以使用不在SELECT 列表中的列排序。

SELECT last_name, department_id
FROM   employees
ORDER BY salary DESC;

select 語句表示式

SELECT     *|{[DISTINCT] column|expression [alias],...}
FROM       table
[WHERE     condition(s)]
[ORDER BY  {column, expr, alias} [ASC|DESC]];

練習題:
1、選擇姓名中有字母a和e的員工姓名

select last_name
from employees
where last_name like '%a%e%' or last_name like '%e%a%'

相關文章