目錄
1.別名的使用
2.AND的優先級高于OR
3.where后面可以接別名,order by后面不可以
4.Oracle中SQL的執行順序(重點)
5.dual萬用表
6.是否區分大小寫
7.Oracle常用數據類型
8.Oracle常用函數
(1)length字符、lengthb字節和cast強制類型轉換
(2)數據類型轉換
to_date():將字符串轉換為日期類型?
to_char():將日期、時間戳或數字轉換為字符串格式
?to_number():將字符串轉為數字類型
9.NOT BETWEEN? AND 反向區間
10.NOT IN
11.LIKE模糊查詢
12.空值NULL
(1)空值的過濾
(2)空值的排序
(3)空值運算
(4)空值轉換NVL與NVL2
1.別名的使用
別名--數字、字母、下劃線組成,不能數字和符號打頭
必須以字母開頭;
長度不能超過 30?個字符;
只能包含字母(A-Z、a-z)、數字(0-9)、下劃線(_)和美元符號($);
不能使用 Oracle 的保留字(比如:SELECT、FROM、WHERE……);
不能和同一個用戶下的其他對象重名;
中文別名,as可以省略
表的別名不能使用as。
如果想使用一些特殊字符或不符合上述規則的名稱作為別名,可以將別名用雙引號括起來。
select ename 員工姓名, sal as "員工薪資", deptno "部門編號"from empwhere job = 'SALESMAN';
2.AND的優先級高于OR
使用括號明確優先級:
SELECT * FROM employees
WHERE (dept_id = 10 OR dept_id = 20) AND salary > 5000;
3.where后面可以接別名,order by后面不可以
具體原因是根據Oracle中SQL的執行順序來的,詳見下面?
4.Oracle中SQL的執行順序(重點)
- FROM:首先確定數據來源,包括表、視圖等,并處理任何連接(JOIN)操作。
- WHERE:應用過濾條件來篩選行。
- GROUP BY:將結果集按指定列分組。
- HAVING:對分組后的結果進行條件過濾。
- SELECT:選擇需要顯示的列或表達式,并執行任何計算或函數調用。
- ORDER BY:根據指定的列對最終結果進行排序。
- OFFSET-FETCH/ROWNUM:限制返回的行數(如分頁功能)。注意,
OFFSET-FETCH
是較新的語法,而ROWNUM
是Oracle特有的用于限制結果集大小的方法。
5.dual萬用表
dual/萬能表/偽表
Oracle 中dual表的存在主要是為了滿足語法要求和提供一些便利。
dual表是 Oracle 與數據字典一起自動創建的一個單行單列的虛擬表,它只有一列
虛擬的,不包含任何數據
select 7+9 from dual;select sysdate from dual;
6.是否區分大小寫
字符串里面要區分大小寫
不區分大小寫的:字段名、表名
select * from emp where ename='SCOTT';
select * from emp where ename='scott';
?
7.Oracle常用數據類型
數據類型類別 | 數據類型 | 描述 | 示例/備注 |
---|---|---|---|
數值類型 | NUMBER(p,s) | 存儲固定或浮動的數值, p是精度(總位數),s是標度(小數點后的位數)。 | NUMBER(5,2) ?表示最多5位數字,其中2位在小數點之后。 |
字符串類型 | VARCHAR2(size) | 可變長度字符數據類型,size指最大字節長度,范圍1到4000字節。 |
|
NVARCHAR2(size) | 類似于VARCHAR2,但使用國家字符集,適用于多語言環境。 | NVARCHAR2(100) ?使用國家字符集存儲最多100個字符。 | |
CHAR(size) | 固定長度字符數據類型,如果插入的字符串短于定義長度,則用空格填充至定義長度。 | CHAR(100) ?總是占用100個字符的空間。 | |
NCHAR(size) | 類似于CHAR,但使用國家字符集。 | NCHAR(100) ?使用國家字符集并總是占用100個字符的空間。 | |
CLOB | 用于存儲大型字符數據,最大可達128TB。 | 適合存儲大量的文本數據。 | |
NCLOB | 用于存儲使用國家字符集編碼的大型字符數據。 | 與CLOB類似,但支持國家字符集。 | |
日期/時間類型 | DATE | 存儲日期和時間信息,精確到秒。格式為:世紀、年、月、日、時、分、秒。 | 常用于需要同時記錄日期和時間的情況。 |
TIMESTAMP | 類似DATE,但提供了更高的時間精度(納秒級),并可選包含時區信息。 | TIMESTAMP WITH TIME ZONE ?或?TIMESTAMP WITH LOCAL TIME ZONE 。 | |
大對象類型(LOB) | BLOB | 用于存儲二進制大對象,如圖像、視頻等,最大可達128TB。 | |
BFILE | 用于存儲指向存儲在數據庫外部文件系統中的大二進制文件的指針。 | ||
原始和ROWID類型 | RAW(size) | 用于存儲二進制數據或字節字符串,必須指定最大長度,范圍從1到2000字節。 | |
LONG RAW | 類似于RAW,但可用于存儲更大的二進制數據,最大可達2GB。(不推薦用于新應用) | ||
ROWID | 存儲行的地址,每個表中的每一行都有一個唯一的ROWID。 | ||
其他類型 | BOOLEAN | 僅在PL/SQL中可用,用于存儲邏輯布爾值(TRUE, FALSE, NULL)。注意,在SQL語句中并不直接支持BOOLEAN類型。 | |
XMLType | 用于存儲XML數據,并提供了一系列針對XML的操作函數。 |
CHAR()和VARCHAR2()區別:
CHAR()始終占用定義的最大長度的存儲空間,如果存儲的數據長度小于這個長度,會使用空格填充剩余的空間
VARCHAR2()只占用實際字符數據的存儲空間,可變長度
8.Oracle常用函數
(1)length字符、lengthb字節和cast強制類型轉換
LENGTH(x):返回字符個數 11?'WH'?'你好'? ? ? ? ?-- 文本信息的基本單位
LENGTHB(x):返回字節數 ????????????????????????????????-- 數據存儲的基本單位
CAST():轉換數據類型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-- cast('123' as number)
-- 一個英文/數字占用1個字節
-- 一個中文占用2個字節
-- GBK:一個漢字占兩個字節
-- utf-8:一個漢字占三個字節
select lengthb('你好') from dual; -- 4select length('你好') from dual; -- 2select length(cast(123 as char(4))) from dual; -- 4SELECT LENGTH(11), -- 2LENGTH('HH'), -- 2LENGTHB('HH') -- 2
FROM DUAL;
(2)數據類型轉換
--隱式轉換 會造成索引失效
SELECT?ename e1,ENAME E2--字段不區分大小寫
FROM?EMP
WHERE?DEPTNO='10'; -- 錯誤寫法,會導致索引失效
to_date():將字符串轉換為日期類型?
TO_DATE(string, format_model)
注意:前后要保持一致。?
TO_DATE 括號里面 年月日必須完整 否則會給一個默認值
select to_date('20250520', 'YYYYMMDD') as a1,to_date('2025-05-20', 'YYYY-MM-DD') as a2from dual;
例題:查詢 所有 1982年之前入職的員工薪資,輸出:員工姓名 ? 員工入職時間 ?員工薪資
select EMPNO, hiredate, SALfrom empwhere hiredate < to_date('1982-01-01', 'yyyy-MM-DD')
to_char():將日期、時間戳或數字轉換為字符串格式
TO_CHAR 括號里面 可以只取年 ?只取月 ?只取日
select hiredate as a1,to_char(hiredate, 'YYYYMMDD') as a2,to_char(hiredate, 'YYYY-MM-DD') as a3,to_char(hiredate, 'MM/DD/YYYY') as a4,to_char(hiredate, 'YYYY') as a5,to_char(hiredate, 'MM/DD') as a6from emp;
使用to_char()查詢1982年之前入職的員工:?
select * from emp where to_char(hiredate, 'yyyy') < 1982;select * from emp where to_number(to_char(hiredate, 'yyyy')) < 1982;
將系統當前時間 以年月日的形式展示,并且是日期類型:
-- 思路:
SELECT SYSDATE FROM DUAL;--查看默認時間樣式SELECT TO_CHAR(SYSDATE,'YYYYMMDD') FROM DUAL;--提取年月日字符串類型SELECT TO_DATE(TO_CHAR(SYSDATE,'YYYYMMDD'),'YYYYMMDD')--轉化為日期格式
FROM DUAL;
?to_number():將字符串轉為數字類型
字符串靠左,數字類型靠右
總結:
日期 → 字符串類型 :TO_CHAR(日期字段,'輸出格式') ?'YYYYMMDD'/'YYYY'
字符串類型 → 日期 :TO_DATE(字符串,'輸出格式') 'YYYYMMDD'/'YYYY-MM-DD'
字符串 → 數字類型 :TO_NUMBER(字符串) ?可以不用 做隱式轉換
--練習:查詢入職時間在1981年的員工
--TO_CAHR
SELECT *
FROM EMP
WHERE TO_CHAR(HIREDATE, 'YYYY') = '1981';
--TO_DATE
SELECT *
FROM EMP
WHERE HIREDATE >= TO_DATE('19810101', 'YYYYMMDD')AND HIREDATE <= TO_DATE('19811231', 'YYYYMMDD');
--NUMBER--CAST
SELECT *
FROM EMP
WHERE CAST(TO_CHAR(HIREDATE, 'YYYY') AS NUMBER) = 1981;
9.NOT BETWEEN? AND 反向區間
NOT BETWEEN? AND 不包括最大值和最小值
BETWEEN? AND 是包括端點值的
SELECT *
FROM EMP
WHERE SAL NOT BETWEEN 1000 AND 2000;
--WHERE SAL>2000 OR SAL<1000;
10.NOT IN
示例:查詢所有不是經理(MANAGER) 也不是文員(CLERK)的信息? ??--AND/OR
SELECT *
FROM EMP
WHERE JOB <> 'MANAGER'AND JOB <> 'CLERK';
--WHERE JOB NOT IN ('MANAGER','CLERK')
例題:找出 所有 10號部門 以及 20?號部門 以及 薪資 不在 2000?~ 3000?這個區間的員工信息。輸出:ENAME,SAL,DEPTNO????????????????--IN(X,Y,Z…)
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO IN (10, 20)AND SAL NOT BETWEEN 2000 AND 3000;
11.LIKE模糊查詢
關鍵字是 LIKE?(長的像...) 兩個 通配符
?% :表示 0位以及以上任意字符 ??
?_ ?下劃線表示 ?固定一位字符 ?
示例:查詢EMP表中姓名包含S的員工信息
SELECT *
FROM EMP
--WHERE ENAME LIKE '%S%'
--WHERE ENAME LIKE '%S'
WHERE ENAME LIKE 'S%';
示例:找出 姓名是 S開頭 且是五位長度的員工姓名?
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'S%'AND LENGTH(ENAME) = 5; --五位長度SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'S____'; -- 4個_
查詢出名字是5個字,并且第二個字母是C的
SELECT ENAME
FROM EMP
--WHERE ENAME LIKE '_C___'
WHERE LENGTH(ENAME) = 5 --5位長度
AND ENAME LIKE '_C%';
12.空值NULL
(1)空值的過濾
需要 用 IS?NULL?/ IS?NOT?NULL來判斷
示例:篩選 獎金為 空(沒有獎金) 的員工信息
SELECT?* FROM?EMP WHERE?COMM IS?NULL;
(2)空值的排序
空值排序永遠在最大
SELECT * FROM EMP ORDER BY COMM;
?
--NULLS LAST 最后
--NULLS FIRST 最前
SELECT * FROM EMP ORDER BY COMM NULLS first;
示例:找出所有沒有獎金的員工,輸出員工姓名 ?薪資 ?部門編號,獎金,并且按照薪資的降序排序
SELECT ENAME, SAL, DEPTNO, comm
FROM EMP
WHERE COMM IS NULLor comm = 0
--WHERE nvl(comm,0)=0
ORDER BY SAL DESC;
(3)空值運算
--- 空值不參與比較運算
--- 空值跟任何值 進行 加減乘除 都是得到 空(NULL)
(4)空值轉換NVL與NVL2
NVL(expr1, expr2)
如果?expr1?為非 NULL,則返回?expr1;如果?expr1?為 NULL,則返回?expr2。
NVL2(表達式,不為空設值,為空設值)
SELECT NVL(comm, 0) FROM EMP;
SELECT NVL2(null, 1, 0) FROM dual;
示例:找出年收入高于3萬的員工信息(年收入 = (薪資+獎金) * 12),并且輸出員工姓名、員工薪資、獎金、年收入。按照年收入的倒序排序。
select ename, sal, nvl(comm, 0), 12 * (sal + nvl(comm, 0)) year_sal--年收入
from emp
where 12 * (sal + nvl(comm, 0)) > 30000--年收入高于3萬
order by year_sal desc;
總結:
- 空值:未知的 沒有意思的數 不是0 也不是空格
- NULL排序在最大
- 對 null?做+-*/運算得到的還是 NULL
- NULL?不參與比較