oracle(一)
Oracle資料型別:
1.字元資料型別:
1)char資料型別。當需要固定長度字串時,使用char。長度1~2000位元組。如果沒有指定大小,預設1位元組。如果
使用者輸入的值小於指定的大小,系統用空格填充。如果大於,報錯。
2)varchar2資料型別,支援可變長度的字串。大小為1~4000位元組。如果使用者輸入的值小於指定的大小,不用填充
,varchar2資料型別可以節省磁碟空間。如果varchar2想根據定義的長度儲存相應的漢字個數,可以宣告為
如:varchar2(10 char)
3)nchar資料型別,即國家字符集,使用方法和char相同。用來儲存Unicode字符集型別,即雙位元組字元資料。最
小單位1字元。
4)nvarchar2與nchar類似,只是可變長度的。
2.數值資料型別number:
number資料型別可以儲存正數、負數、零、定點數、精度為38信的浮點數。
語法:number(p,s) --如果不寫p,s內容,是否是沒有限制?
p 為精度,表示數字的有效位數,在1~38之間,從左邊第一個不為0的數算起,小數點和負號不計入有效位數。
s 為範圍,表示小數右邊數字的位數,在-84~+127之間。
規則:首先精確到小數中右邊s位,並四捨五入。如果精確後值的有效位數<=p,則正確;否則報錯。
3.日期時間資料型別:用於儲存日期值和時間值
1)date資料型別,用於儲存表中的日期和時間資料。使用7位元組固定長度,每個位元組分別儲存世紀、年、月、日、小
時、分和秒。sysdate函式的功能是返回當前的日期和時間。
2)timestamp資料型別,用於儲存日期的年、月、日以及時間的小時、分和秒。秒值精確到小數小後6位,包含時區
資訊。systimestamp函式的功能是返回當前日期、時間和時區。
改變日期格式:
Oracle中的SQL視窗:alter session set nls date format=’YYYY-MM-DD HH24:MI:SS’;//只對當前視窗有效。
環境變數:鍵:nls_date_format
值:YYYY-MM-DD HH24:MISS
4.遊標型別,SYS_REFCURSOR型別是Oracle提供的系統遊標型別。
如下,過程返回一個遊標型別:
CREATE OR REPLACE PROCEDURE get_sals(
cur_salary OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN our_salary FOR
SELECT empno, sal FROM employee;
END;
LOB資料型別:
LOB又稱為“大物件”資料型別。我叫儲存4GB的非結構化資訊,如聲音剪輯和視訊剪輯。LOB允許對資料進行高效、隨
機、分段的訪問。一個表中可以有多個列被定義為LOB資料型別。可以通過PL/SQL中提供的程式包DBMS_LOB修改。
1.CLOB(Character LOB,字元LOB)儲存大量字元資料。可以儲存單位元組字元資料和多位元組字元資料,主要用於儲存非結
構化的XML多檔。如新聞、內容介紹等含大量文字內容的文件。
2.BLOB(Binary LOB,二進位制LOB)可以儲存較大的二進位制物件,如圖形、視訊剪輯和聲音剪輯等。
3.BFILE(Binary File,二進位制檔案)能夠將二進位制檔案儲存在資料庫外部的作業系統檔案中。BFILE列儲存一個BFILE
定位器,指向位於伺服器檔案系統上的二進位制檔案。最大4GB。
4.NCLOB資料型別用於儲存大的nchar字元資料。支援固定寬度字元和可變寬度字元(Unicode字元資料)。使用方法同
CLOB類似。
早期使用Long資料型別儲存大資料。
Oracle中的偽列:
1.rouid,資料庫中每一行都有一個行地址,rowid偽列返回該行地址。rowId值可以唯一標識資料庫中的一行。
2.rounum,返回一個數值代表行的次序。通過使用rownum,使用者可以限制查詢返回的行數。
rownum對於等於某值的查詢條件,可以使用rownum=1作為條件,但是不能等於大於1的值。
rownum對於大於某值的查詢條件,可以使用rownum>1,但是不能大於1以上的值。
rownum對於小於某值的查詢條件,可以rownum<大於1的整數。
例: select * from(
select a.*,rownum rn from ( --這裡設定了rownum的列別名,這樣就可以在外層查詢用between and語句了
select * from employee order by sal desc
) a
)
where rn between 5 and 9;
SQL語言分類:
資料定義語言(DDL Data Definition):create建立、alter更改、truncate截斷、drop刪除
資料操縱語言(DML Data Manipulation Language):insert插入、select選擇、delete刪除、update更新
事務控制語言(TCL Transaction Control Language):commit提交、savepoint儲存點、rollback回滾
資料控制語言(DCL Data Control Language):grant授予、revoke回收
資料定義語言DDL:
1.create table命令:
create table [schema.]table_name
(
column_name datatype,
column_name datetype,
…
)
schema表示物件的所有者,即模式的名稱。如果使用者在自己的模式中建立表,則可以不指定所有者名稱。
table表示表的名稱。
column表示列的名稱。
datatype表示該列的資料型別及其寬度。
表名命名規則:
1)表名首字元應該為字母。
2)不能使用Oracle保留字來為表命名。
3)表各的最大長度為30個字元。
4)同一使用者模式下的不同表不能具有相同的名稱。
5)可以使用下劃線、數字、字母,但不能使用空格和單引號。
Oracel和SQL Server資料庫物件表之間的差異:
列數:Oracle,254; SQL Server,1024
行大小:Oracle沒有限制;SQL Server,8060位元組,加16位元組指向每個text或image列。
最大行數:Oracle沒有限制;SQL Server沒有限制
表命名規則:Oracle,[schema.]table_name; SQL Server,[[[server.]database.]owner.]table_name
2.truncate table命令:
可以只刪除表中的記錄而不刪除表結構,刪除表中的所有行而不記錄日誌。
truncate table <table_name>;
資料操縱語言DML:(insert,select,update,delete)
1.選擇無重複的行,在select命令中包含distinct子句。
select distinct stuName,stuAge from stuInfo;
2.使用列別名,列別名不會影響列的實際名稱。列別名位於列表達式後面。
select stuName as “姓 名”,stuAge as 年齡,stuNo 編號 from stuInfo;
如果列別名中指定有特殊字元(如空格)的列標題使用雙引號括起來。
3.利用現有表建立新表。
語法: create table <newTable_name>
as
select {* | column(s)} from <oldTable_name> [where ];
複製表結構和記錄:
create table newStuInfo
as
select * from stuInfo;
複製表指定列和記錄:
create table newStuInfo
as
select stuName,stuAge,stuNo from stuInfo;
只複製表結構:
create table newStuInfo
as
select * from stuInfo where 1=2;
4.查看錶中行數:
select count(1) from stuInfo; --1比*號效率較高
5.取出stuName,stuAge列不存在重複的資料記錄:
select stuName,stuAge from stuInfo
group by stuName,stuAge
having(count(stuName||stuAge));//“||”在這裡是連線操作符,類似於“+”,意思為將兩部分內容連線在
一起,因為count()裡面只能有一個列,所以連線起來。
6.刪除stuName、stuAge列重複的行(相同資料只保留一行)
delete from stuInfo where rowid not in(
select max(rowid) from stuInfo group by stuName,stuAge
having (count(stuName||stuAGe)>1)
union
select max(rowid) from stuInfo group by stuName,stuAge
having (count(stuName||stuAge)=1)
);
7.根據當前使用者所有資料量>100萬的表的資訊
select tabke_name from user_all_tables a where a.num_rows>1000000;
–user_all_tables為系統提供的資料檢視,使用者可以通過查詢該檢視獲得當前使用者表中描述。
事務控制語言TCL:
1)commit:提交事務,提事務中對資料庫的修改進行永久儲存。
2)rollback:回滾事務,即取消對資料庫所做的作何修改。
3)savepoint <savepoint_name>:在事務中建立儲存點。
4)rollback to savepoint <savepoint_name>:將事務回滾到儲存點。即savepoint 建立的儲存點
開啟事務:在Oracle中,上一次事務結束以後,資料第一次被修改時自動開啟。
結束事務: ①資料被提交:發出commit命令;執行DDL或DCL語句後,當前事務自動commit;與Oracle分離。
②資料被撤銷:發出rollback命令;伺服器程序異常結束;DBA停止會話。
例: insert into dept values (10,’ACCOUNTING’,’NEW YORK’);
commit;
savepoint a;//a只是一個名稱
insert into dept values (20,’SALES’,’NEW YORK’);
rollback to savepoint a;
rollback;–結果只有第一條記錄插入成功
資料控制語言DCL:
資料控制語言為使用者提供許可權控制命令。資料庫物件(如表)的所有者對這些物件擁有控制權限。所有者可以根據自己
的意願決定其他使用者如何訪問物件,授予其他使用者許可權(insert,select,update,delete,…)
SQL操作符:
1.算術操作符。算術表示式由number資料型別的列名、數值常量和連線它們的算術操作符組成。
+(加)、-(減)、*(乘)、/(除)。
2.比較操作符:=、!=、<、<=、>、>=、between… and 、in、not in、like、is null、is not null。
Oracle中的between-and語句,包含前也包含後。如:rn between 5 and 9;結果是5,6,7,8,9
3.邏輯操作符:and , or , not。
4.集合操作符,將多個查詢的結果組合成一個結果集。
規則: 1)通過集合操作符連線的條個查詢具有相同的列數,且對應列的資料型別必須相容。
2)這種查詢不應含有long型別的列。列標題來自第一個select語句。
union (並集)操作符返回兩個查詢選定的所有不重複的行。使用order by 子句時,必須放在最後一個select後。
select empno from employee
union
select rempno from retireEmp
order by empno;
union all (並集all)操作符合並兩個查詢選定的所有行。包括重複的行。
intersect (交集)操作符返回兩個查詢都有的行。
select empno from employee
intersect
select rempno from retireEmp;
minus (減集)操作符只返回由第一個查詢選定而未被第二個查詢選定的行,即在第一個查詢結果中排除在第二個查詢
結果中出現的行。
select empno from employee
minus
select rempno from retireEmp;
5.連線操作符(||),用於將兩個或多個字串合併成一個字串,或者將一個字串與一個數值合併在一起。
select job||’ ‘||ename from employee;–輸出的時候將崗位和姓名連線在一起輸出。
SQL函式:大致分為單行函式、聚合函式、分析函式。
單行函式:字元函式、日期函式、數字函式、轉換函式及其他函式。
聚合函式(Aggregate Function)也稱為分組函式是基於資料庫表的多行進行運算,返回一個結果。
分析函式是對一個查詢結果中的每個分組進行運算,但每個分組對應的結果可以有多個。
字元函式:操作結果可能是字元資料型別,也可能是數字型別。
函式
說明
輸入
結果
initcap(char)
首字母大寫
initcap(‘hello’)
Hello
lower(char)
轉換為小寫
lower(‘FUN’)
fun
upper(char)
轉換為大寫
upper(‘sun’)
SUN
ltrim(char,set)
左剪裁
ltrim(‘xyzadams’,’xyz’)
zdams
rtrim(char,set)
右剪裁
rtaim(‘xyzadams’,’ams’)
xyzad
translate(char,from,to)
按字元翻譯
translate(‘Jack’,’abcd’,’1234’)
J13k
replace(char,search_str,
replace_str)
字串替換
replace(‘jack and jue’,’j’,’bl’)
black and blue
instr(char,substr[.pos])
查詢子串位置
instr(‘worldwide’,’d’)
5
substr(char,pos,len)
取子字串,下標從1開始
substr(‘abcdefg’,3,2)
cd
concat(char1,char2)
連線字串
concat(‘Hello’,’world’)
Helloworld
數字函式,接受數字輸入並返回數字作為輸出結果,返回的值可以精確到小數點後38位。
函式
說明
輸入
結果
abs(n)
取絕對值
abs(-15)
15
ceil(n)
向上取整
ceil(44.178)
45
floor(n)
向下取整
floor(44.99)
44
round(m,n)
四捨五入
round(100.256,2)
100.26
trunc(m,n)
截斷
trunk(100.256,2)
100.25(小數後幾位?)
sin(n)
正弦
sin(1.571)
.999999979
cos(n)
餘弦
cos(0)
1
power(m,n)
m的n次冪
power(4,2)
16
sqrt(n)
平方根
sqrt(4)
2
sign(n)
取符號
sign(-32)
-1
mod(m,n)
取m%n的結果
mod(10,3)
1 (Oracle中沒有%運算子)
日期函式,對日期值進行運算,根據函式的用途產生日期資料型別或數值型別的結果。
函式
功能
例項
結果
sysdate
返回當前日期和時間
select sysdate from dual;
當前日期和時間
systimestamp
返回當前日期、時間、時區
select systimestamp from
dual;
當前日期、時間
和時區
months_between(
prevdate,nextdate)
返回兩個日期間的月份
months_between(‘04-11月
-05’,’11-1月-01’)
57.7741935
add_months
返回把月份數加到日期上的新日期
add_months(‘06-2月-03’,1)
add_months(‘06-2月-03’,1)
06-3月-03
06-1月-03
next_day
返回指定日期後的星期對應的新日期
next_day(‘06-2月-3’,’星期一’)
10-2月03
last_day
返回指定日期所在月的最後一天
last_day(‘06-2月-03’)
28-2月-03
round
按指定格式對日期進行四捨五入
對年份四捨五入,日期>6月30日,則
年份+1;
round(to_date(‘13-2月-03’),’YEAR’)
round(to_date(‘13-2月-03’),’MONTH’)
round(to_date(‘13-2月-03’),’DAY’)
01-1月-03
01-2月-03
16-2月-03
trunc
對日期按指定方式進行截斷
trunc(to_date(‘06-2月-03’),’YEAR’)
trunc(to_date(‘06-2月-03’),’MONTH’)
trunc(to_date(‘06-2月-03’),’DAY’)
01-1月-03
01-2月-03
02-2月-03
extract(year
from date)
返回date中的年份,也可以是month
day,
extract(year from sysdate)
2014
轉換函式,將值從一種資料型別轉換為另一種資料型別。Oracle中沒有convert函式。
函式
功能
例項
結果
to_char
轉換成指定字串型別
to_char(123.45,’ 符號可以)
$123.5
to_date
轉換成指定日期型別
to_date(‘1980-01-01’,’yyyy-mm-dd’)
01-1月-80
to_number
轉換成指定數值型別
to_number(‘1234.5’)
數字:1234.5
to_char()的語法為:
to_char(d|n[,fmt]);–其中d是日期,n是數字,fmt是指定日期或數字的格式 。轉換成的是varchar2資料型別
例: select to_char(sysdate,’YYYY”年”fmMM”月”fmDD”日” HH24:MI:SS’) from dual;
–使用了填充模式”fm”格式掩碼來避免空格填充和數字零填充
–格式中的小數有多少位,結果就會四捨五入進多少位。
to_date()的語法為:
to_date(char[,fmt]);–將char或varchar資料型別轉換為日期資料型別。fmt指定字元的形式。
–這裡的fmt是指定Oracle伺服器該如果解析這個char字串的格式,返回的結果統一是:yyyy-mm-dd;
select to_date(‘2013-07-18’,’yyyy-mm-dd’) from dual;–結果:18-7月-13
–這Oracle中mm是月份,mi是分種數
to_number()函式將包含數字的字串轉換為number資料型別。通常不必這樣做,因為Oracle可以對數字字串進行隱
式轉換。
select sqrt(to_number(‘100’)) from dual;–結果:10
其他函式,除去已介紹函式還不其他一些單行函式,在此稱為其他函式。
函式
功能
nvl(exp1,exp2)
如果exp1的值為null,則返回exp2的值,否則返回exp1的值
nvl2(exp1,exp2,exp3)
如果exp1的值為null,則返回exp2的值,否則返回exp3的值
decode(value,if1,then1
,if2,then2,…,else
如果value的值為if1,則返回then1的值;如果value的值為if2,則返回then2的值
,… 否則返回else的值
例: select ename,
sal+nvl(comm,0) sal1,
nvl2(comm,sal+comm,sal) sal2,
decode(to_char(hiredate,'MM'),'01','一月','02','二月','03','三月','04','四月','05'
,'五月','06','六月','下半年') mon
from employee;
聚合函式:能基於列進行計算,將多個直合併為一個值。對一組值進行計算,並返回計算後的值。
使用聚合函式進行統計值時,將忽略NULL值,但不忽略重複項。
1.sun(),返回表示式中所有數值的總和,只能用於數字列,只能返回一個數值,不能夠直接與可能返回多行的列一起 使用來進行查詢。
例:select sun(score) from result where studentid=33 --查詢學號為33的學生的成績總和
2.avg(),返回表示式中所有數值的平均值,只能用於數值列。
例:select avg(score) from result where score>=60 --查詢及格的平均值。
3.max()和min():max()返回表示式中的最大值,min()返回表示式中的最小值,它們都可以用於數字型,字元型以及 日期/時間型別的列。
例:select avg(score),max(score),min(score) from result where score>=60
–查詢及格線上的平均分、最高分、最低分
4.count(),返回提供的組成或記錄齡中的計數。可以用於數字和字元型別的列,也可以使用星號’*’作為count()的 表示式。
例:select count(*) from score where score>=60 --查詢及格人數的語句
也可以使用整數型別的值當作表示式,如:
select count(1000) from score where score>=60 --結果將和上面的一樣
小提示:count(distinct 表示式),遇到重複資料,只記錄一次
分析函式:Oracle從8.1.6版本開始提供分析函式。分析函式是對一組查詢結果進行運算,然後獲行結果。與聚合函式的區別在於返回多行,聚合函式每組返回一行。用於對分組後組內進行排序。
語法:
函式名([引數]) over ([分割槽子句][排序子句]);–分割槽子句(partition by)表示將查詢結果分為不同的組,功能
類似於group by語句。預設將所有結果作為一個分組。排序子句(order by)預設是asc升序。
rank、dense_rank、row_number函式用於為每條記錄產生一個從1開始至N的自然數,N的值可能小於記錄的總數。這
3個函式用於解決排名問題。
1)row_number函式返回一個唯一的值,當遇到相同資料時,排名按照記錄集中記錄的順序依次遞增。
2)dense_rank函式返回一個唯一的值,當遇到相同資料時,所有相同資料的排名都是一樣的。
3)rank函式返回一個唯一的值,當遇到相同的資料時,所有相同資料的排名是一樣的,同時會在最後一條相同記錄和
下一條不同記錄的排名之間空出排名。
例:select ename,deptno,sal,
rank() over (partition by deptno order by sal desc) rank,
dense_rank() over (partition by deptno order by sal desc) "dense_rank",
row_number() over (partition by deptno order by sal desc) "row_number"
from employee;