Oracle 第2章 Oracle查詢、數據類型、函數
注意:本章提供Oracle SQL幫助文檔(PDF)下載
1、技術目標
- 瞭解 Oracle 數據類型
- 瞭解數據定義語言和數據操縱語言
- 瞭解事務控制語言和數據控制語言
- 掌握 SQL 操作符和 SQL 函數
2、SQL簡介
- SQL(Structured Query Language)是指結構化查詢語言
- SQL是基於數據庫的語言,由IBM在二十世紀七十年代初開發用於控制關係型數據庫,Oracle公司實現的SQL完全符合ANSI標準的SQL語言,Oracle使用SQL存儲和檢索信息
- SQL是一種非過程語言,用於查詢、添加、刪除以及修改數據和對象的命令非常簡單
- SQL是所有關係型數據庫的通用語言
Oralce用戶通過SQL與Oralce的交互,如圖:
SQL 支持下列類別的命令:
- 數據定義語言(DDL)
- 數據操縱語言(DML)
- 事務控制語言(TCL)
- 數據控制語言(DCL)
2.1)DDL(Data Definition Language)包含的指令如下,
- CREATE : 在數據庫中創建新的數據對象
- ALTER : 修改數據庫中對象的數據結構
- DROP : 刪除數據庫中的對象
- DISABLE/ENABLE TRIGGER : 修改觸發器的狀態
- UPDATE STATISTIC : 更新表/視圖統計信息
- TRUNCATE TABLE : 清空表中數據
- COMMENT : 給數據對象添加註釋
- RENAME : 更改數據對象名稱
2.2)DML(Data Manipulation Language)包含的指令如下,
- INSERT :將數據插入到表或視圖
- DELETE :從表或視圖刪除數據
-
SELECT :從表或視圖中獲取數據,例如:
使用1: 利用現有的表創建表,語法:
CREATE TABLE 新表名 ASSELECT 列名 FROM 原表名;
使用2: 選擇無重複的行,用DISTINCT關鍵字,語法:
SELECT DISTINCT 列名 FROM 表名;
使用3: 查詢中爲列取別名,使用AS關鍵字,語法:
SELECT 列名 AS 列別名 FROM 表名;
- UPDATE :更新表或視圖中的數據
- MERGE : 對數據進行合併操作(插入/更新/刪除)
2.3)TCL(Transaction Control Language)
事務是最小的工作單元,作爲一個整體進行工作保證事務的整體成功或失敗,
稱爲事務控制,包含的指令如下,
- COMMIT : 提交併結束事務處理
- SAVEPOINT : 標記事務中可以回滾的點
- ROLLBACK : 撤銷事務中已完成的工作
- SET TRANSACTION : 設置事務選項
使用: 設置事務以及回滾點
--執行修改操作
UPDATE orderMaster SET delDate='18-5月-08' WHERE orderNo
<= 'O8008';
--設置回滾點1
SAVEPOINT mark1;
DELETE FROM orderMaster WHERE orderNo='O8008';
--設置回滾點2
SAVEPOINT mark2;
--事務回滾到回滾點1
ROLLBACK TO SAVEPOINT mark1;
--提交事務
COMMIT;
2.4)DCL(Data Control Language)包含的指令如下,
- GRANT : 賦予用戶某種控制權限
- REVOKE :取消用戶某種控制權限
3、Oracle 數據類型
用戶創建表時,必須爲各個列指定數據類型
以下是 Oracle 數據類型的類別:
- 字符類型
- 數值類型
- 日期時間類型
- RAW和LONG RAW類型
- LOB類型
4、字符類型有3種
4.1)CHAR 類型
- 當需要固定長度的字符串時,使用 CHAR 數據類型。
- CHAR 數據類型存儲字母數字值。
- CHAR 數據類型的列長度可以是 1 到 2000 個字節
- 如果輸入的值小於指定長度,則用空格填充至固定長度
- 如果輸入的值大於指定長度,則返回錯誤報告
4.2)VARCHAR2 類型
- VARCHAR2數據類型支持可變長度字符串
- VARCHAR2數據類型存儲字母數字值
- VARCHAR2數據類型的大小在1至4000個字節範圍內
與CHAR類型相比,VARCHAR可節省存儲空間 ,如某
列爲VARCHAR2類型,大小爲50字節,用戶輸入20個
字節的字符,則最終其長度只有20個字節,而CHAR將
佔50字節,剩餘部分採用空格填充
4.3)LONG 類型
- LONG 數據類型存儲可變長度字符數據
- LONG 數據類型最多能存儲 2GB
該類型主要用於存儲超過VARCHAR2存儲容量的長文本
信息,其長度受磁盤可用存儲空間的限制,使用LONG類
型還需要遵守如下規則:
- 一個表中只能有一列可以是LONG類型
- LONG類型的列不能使用唯一約束或主鍵約束
- LONG類型的列不能建立索引
- 存儲過程或過程不能接受LONG類型的參數
5、數值類型 NUMBER
數值類型NUMBER可以存儲整數、浮點數和實數,最高精度爲 38 位,
數值數據類型的格式爲:
NUMBER [( p[, s])]
P表示精度,S表示小數點的位數(-84 ~ 127之間)
使用1: 列名 number,定義38位整數
使用2: 列名 number(位數),定義指定位數的整數
使用3: 列名 number(總位數, 小數位數),定義指定總位數和小數點右端數字位數的浮點數
6、日期時間類型
日期時間數據類型存儲日期和時間值,包括年、月、日,小時、分鐘、秒
6.1)DATE類型
DATE類型用於存儲日期和時間數據,佔7個字節固定長度,每個字節
分別存儲世紀、年、月、日、小時、分、秒,DATE類型的值從公元
4712年1月1日到公元9999年12月31日,Oracle提供了函數sysdate
可返回當前的日期和時間,
注意:日期數據類型的默認格式爲"DD-MON-RR","日-月-年",如
"18-5月-08"表示2008年5月18號
使用1: 添加記錄時指定默認日期
INSERT INTO order_master
VALUES('D1008', '18-5月-08', 'X800', 'abc', '25-5月-08');
使用2: 添加記錄時使用TO_DATE函數轉換日期
INSERT INTO my_table (date_col)
VALUES (TO_DATE('2005-10-18', 'YYYY-MM-DD'));
6.2)TIMESTAMP類型
TIMESTAMP類型用於存儲日期的年、月、日以及時間的小時、分和秒值,
其中秒值精確到小數點後6位,該類型同時包含時區信息,Oracle提供函數
systimestamp可返回當前日期、時間和時區
7、RAW和LONG RAW類型
RAW和LONG RAW類型用於存儲二進制數據
7.1)RAW類型
RAW數據類型用於存儲二進制數據,該類型最多能存儲2000個字節,
該類型沒有默認大小,使用時需指定大小,RAW類型可建立索引
7.2)LONG RAW類型
LONG RAW類型用於存儲可變長度的二進制數據,最多存儲2GB,該
類型與LONG數據類型需要遵守的規則一致
8、LOB類型
LOB又稱爲"大對象 "數據類型,可存儲4GB的非結構化信息,比如聲音、視頻等
,允許對數據進行高效、隨機、分段的訪問。LOB根據相對於數據庫的位置,可
以使外部的或者是內部的,操作LOB類型的數據可以使用如下方式:
- 使用SQL數據操作語言
- 使用PL/SQL提供的程序包DBMS_LOB
一個表中可以有多列爲LOB類型 ,這多列的LOB可以是不同的LOB類型,Oracle
提供了3種LOB類型,分別是:
- CLOB
- BLOB
- BFILE
8.1)CLOB(Character LOB,字符LOB)類型
該類型能存儲大量字符數據,字符數據可以爲單字節字符或者多字節字符,
還可用於存儲XML文檔數據
8.2)BLOC(Binary LOB,二進制LOB)
該類型可存儲較大的二進制數據(圖像、音視頻等)
8.3)BFILE(Binary File,二進制文件)
該類型能將二進制文件存儲在數據庫之外的操作系統文件中,表中的BFILE
列則只存儲一個BFILE定位器,該定位器指向文件系統中的二進制文件,可
存儲的文件最大爲4GB
9、Oracle中的僞列
僞列就像表中的一列,該列並未存儲在表中,僞列可從表中查詢但不能插入、更新、刪除其值,僞列有兩種,ROWID僞列和ROWNUM僞列
9.1)ROWID僞列:
表的每一行都有一個行地址,ROWID僞列返回該行的地址,
其值可以唯一標識表的行,使用該僞列可定爲表中的一行,
可查看ROWID的值:select rowid from 表名;
ROWID僞列僞列還有如下作用:
1.能以最快的方式訪問表中的行
2.顯示錶的行是如何存儲的
3.作爲表中行的唯一標識
9.2)ROWNUM僞列
ROWNUM僞列返回代表行序號 的值,第一行的ROWNUM爲1,第二行爲2,
依次類推,使用該僞列可限制查詢返回的行數,如使用ROWNUM提取前10
條記錄:select * from 表名 where rownum < 11;
10、SQL運算符
Oracle中的運算符分類圖:
10.1)算術運算符 包括:(+)、減(-)、乘(*)、除(/)
可以在SQL語句中使用算術表達式,算術表達式由數值數據類型的列名、數值常
量和連接它們的算術操作符組成
10.2)關係運算符 包括:
=、!=、<、>、<=、>=、BETWEEN…AND、IN、LIKE 和 IS NULL等,
關係運算符用於比較兩個表達式的值
10.3)邏輯運算符 包括:(AND)、或(OR)和非(NOT)
邏輯操作符用於組合多個計較運算的結果以生成一個或真或假的結果
10.4)集合運算符 包括:
聯合(UNION)、聯合所有(UNION ALL)、交集(INTERSECT)、減集(MINUS)
- UNION運算符返回兩個查詢選定的所有不重複的行
- UNION ALL運算符合並兩個查詢選定的所有行,包括重複的行
- INTERSECT運算符只返回兩個查詢的公共行
- MINUS 操作符返回從第一個查詢結果中排除第二個查詢中出現的行
集合操作符將兩個查詢結果合成一個結果,使用集合運算符需遵守如下規則 :
- 通過集合運算符連接的各查詢具有相同的列數且對應列的類型必須相同
- 查詢中不應含有LONG類型的列
- 列標題來自第一個select語句
使用: 查詢訂單表的訂單號,排除訂單明細中已有的訂單號:
SELECT orderNo FROM orderMaster
MINUS SELECT orderno FROM orderDetail;
10.5)連接運算符 :||
用於將兩個或多個字符串合併 成一個字符串 ,或者將一個字符串
與一個數值合併在一起,通過使用連接操作符可以將表中的多個
列合併成邏輯上的一個列,例如:
SELECT (venName || ' 的地址是 ' || venadd1 || ' ' || venadd2 || ' '
||venadd3) address FROM vendorMaster WHERE vencode='V001';
11、操作符的優先級
優先級從上往下遞減:
- 算術操作符 -------->最高優先級
- 連接操作符
- 比較操作符
- NOT 邏輯操作符
- AND 邏輯操作符
- OR 邏輯操作符 -------->最低優先級
12、Oracle的SQL函數
Oracle提供了用於執行特定操作的專用函數 ,Oracle的函數
可分爲單行函數、分組函數(聚合函數)、分析函數
12.1)單行函數
單行函數又稱爲"標量函數 ",對於從表中查詢的每一行,函數都返回一個值,
單行函數可出現在select、where子句中,單行函數可分爲:
1.日期函數:
add_months(日期, 月數)
該函數給指定的日期加上指定的月數
months_between(日期1, 日期2)
該函數返回兩個日期間的月數,
如果日期期1晚於日期2爲正數,否則爲負數,
如果兩日期爲同月,有如下情況:
1.兩日期爲該月中的同一天或最後一天,其結果始終爲整數
2.非同一天,將根據一月31天計算出小數部分並考慮時間差
last_day(日期)
該函數返回指定日期當月最後一天的日期值
round(日期, [格式])
該函數將日期四捨五入爲格式指定的單位,
格式爲可選值,日期默認舍入爲最靠近的那一天,
如果指定格式爲"year"年,則舍入到年的開始(1月1日),
如果格式爲"month"月,則舍入到月的第一天,
如果格式爲"day"周,則舍入到最靠近的星期天
next_day(日期, 星期幾)
該函數返回下一個星期幾的日期,
星期幾指周內的任何一天,例如:
select next_day(sysdate, '星期三') from dual;
顯示出當前日期後的第一個星期三的日期,參數'星期三'
可用整數 4 來表示
注意:dual 關鍵字用在沒有目標表的查詢中
2.字符函數:
3.數字函數:
4.轉換函數 :將值從一種類型轉換爲另一種類型
to_char(日期 | 數字 [, 格式])
該函數將日期或數字按指定的格式轉換爲varchar2類型,如:
select to_char(sysdate, 'YYYY' '年' 'fmMM' '月' 'fmDD' '日'
' HH24:MI:SS ') from dual;
顯示結果:xxxx年xx月xx日 xx:xx:xx
x爲當前日期的值
to_date(字符串 [, 格式])
該函數將char或varchar類型的日期字符串按指定格式轉換爲日期類型,
如:select to_date('2008-08-18', 'yyyy-mm-dd') from dual;
顯示結果:18-8月-08
to_number(字符串)
該函數將包含數字的字符串轉換爲number類型,通常不需使用該函數,
Oracle可以對數字字符串進行隱式轉換
5.其他函數 ,介紹幾個用來轉換空值的函數:
注意:NULL值表示空(未知),零值表示0(未知)
nvl(表達式1, 表達式2)
如果表達式1爲NULL則返回表達式2,否則返回表達式1,
如果表達式1和2是不同的類型,則將表達式2轉換爲表達式1的類型
nvl2(表達式1, 表達式2, 表達式3)
如果表達式1不是NULL,則返回表達式2,
如果表達式1是NULL,則返回表達式3
nullif(表達式1, 表達式2)
如果兩表達式相等,則返回NULL,否則返回表達式1,該
函數等價於如下的表達式:
case
when 表達式1 = 表達式2
then NULL
else 表達式1
end
12.2)分組函數,又稱爲聚合函數
- avg ,求平均值
- max ,求最大值
- sum ,求總和
- count(*) ,統計行總數,包括重複值和空值的行
- count(列名) ,統計行總數,不包括空值的行
- count(distinct 列名) ,與count(列名)相似,不過在統計時去除重複值
12.3)分析函數
分析函數根據一組行來計算聚合值,這些函數通常用來完成對聚合值的累計排
名、移動平均數和報表等計算,在使用分析函數之前,需要完成所有的連接以
及所有的where、group by、having子句,因此分析函數只能出現在select列
表或order by子句中,介紹幾個分析函數如下,
- ROW_NUMBER 返回連續的排位,不論值是否相等
- RANK 具有相等值的行排位相同,序數隨後跳躍
- DENSE_RANK 具有相等值的行排位相同,序號是連續的
其具體用法可參考"Oracle SQL幫助文檔"
13、總結
- SQL是通用的數據庫語言
- SQL命令可分爲數據定義語言、數據操縱語言、事務控制語言和數據控制語言
- Oracle支持的數據類型包括字符、數值、日期時間、RAW 和 LOB 等
- SQL支持的操作符包括算術、比較、邏輯、集合和連接操作符
- SQL函數可大致分爲單行函數、聚合函數和分析函數