1、Check規則
Check (Agebetween15and30 )把年齡限制在15~30歲之間
2、新SQL語法
在調用某一函數時,可以通過“=>”符號來為特定的函數參數指定數據。而在Oracle11g中,在SQL語句中也可以這樣的語法,例如:
Select f( x => 6)from dual ;
3、將sequence的值賦給變量
11g之前的賦值方式Select seq_x.next_val intov_x from dual ;
11g賦值方式v_x :=seq_x.next_val ;
4、SQL的功能
?4.1數據定義
Create ,Drop ,Alter
?4.2數據操縱
Select , insert , update , delete
?4.3數據控制
Grant, Revoke
5、Oracle創建語法
?1、表空間
createtablespacelq_oradatadatafile'd:\oracle_test\user_data01.dbf'
size32mautoextendonnext32mmaxsize2048mextentmanagementlocaluniformsize16m ;
?2、臨時表空間
createtablespacelq_oradata_temptempfile
'd:\oracle_test\temp_data01.dbf'
size32mautoextendonnext32mmaxsize2048mextentmanagementlocaluniformsize16m ;
?3、創建用戶
create user lq identified by lq
default tablespacelq_oradata
temporary tablespace temp;
注:此處的temp為系統臨時表空間,也可以自定義臨時表空間;
?4、給用戶授權
grant connect,resource to lq;
?5、創建表
createtableit_employees (
employee_idnumber(6)notnullunique,
first_namevarchar2(30) ,
last_namevarchar2(30)notnull,
emailvarchar2(30),
phone_numbervarchar2(15),
job_idvarchar2(10),
salary_numbernumber(8,2),
manager_idnumber(6)
)
添加數據
insertintoit_employees(employee_id,first_name,last_name,email,phone_number,job_id,salary_number,manager_id,birth_date)
values(seq_employee.nextval,'Micheal','Joe','mj_aui01@188.com','13149258943','it_prog',5000.67,seq_employee.nextval,to_date('2011-11-01','yyyy-mm-dd'));
?6、創建視圖
給用戶分配創建視圖的權限
A:首先授予查詢所有表的權限
grant select any
table tolq;
B:再次授予查詢所有字典表的權限
grant select any
dictionary tolq;
C:如果已經分配以上權限,還是權限不足,則可分配管理員權限
grant dba tolq;
createviewprog_employees
as
selectemployee_id,first_name,last_name,email,phone_number,salary_number,manager_id
fromit_employees
wherejob_id='it_prog'
with check option;
注:可加上with check option;
?7、創建索引
聚簇索引:指索引向的順序與表中記錄的物理順序相一致的索引組織。
用戶可以在查詢頻率最高的列上建立聚簇索引,從而提高查詢效率。由于,聚簇索引是將索引和表記錄放在一起存儲,所以在一個基表上只能創建一個聚簇索引;在建立聚簇索引后,由于更新索引列數據時會導致表中物理順序的變更,系統代價較高,因此對于經常更新的列不宜建立聚簇索引。
Create [unique] [cluster] index [索引名]
On <表名> (<列名>[<次序>],<列名>[<次序>],<列名>[<次序>]……)
其中,unique表示此索引的每一個索引值不能重復,對應唯一的數據記錄。Cluster表示要創建的索引為聚簇索引。索引可以建立在對應表的一列或者多列上,如果是多個列,各個列之間需要用逗號分隔。<次序>用于指定索引值的排列次序,ASC表示升序,DESC表示降序,默認為ASC.
Create indexit_lastnameonit_employees(last_name)
描述:執行后會在表it_employees的last_name列上建立一個索引。
而it_employees表中的數據將按照last_name值升序存放。
6、Oracle刪除語法Drop
?6.1:刪除表
Droptable<表名>
刪除表時,表中的數據、在該表上建立的索引一并都會被刪除。
?6.2:刪除視圖
Drop view <視圖名>
?6.3:刪除索引
Drop index <索引名>
7、Oracle修改語法Alter
Alter table <表名>
[add <新列><數據類型>[完整性約束]]
新增birth_date列
Altertableit_employeesaddbirth_date date;
[Drop<完整性約束>]
刪除employee_id字段的unique約束
Altertableit_employeesDrop unique(employee_id);
[Modify <列名> [數據類型]]
將manager_id字段改為8位
Altertableit_employeesmodifymanager_id number(8)
8、Oracle查詢select
?8.1:簡單查詢
8.1.1使用from子句指定表
select * from hr.countries ;
select * from hr.countries,hr.departments;
8.1.2使用select指定列
Selectcolumn name_1, ……
column name_n
Fromtable_name_1 , table_name_2 .
8.1.3算術表達式
Selectem.first_name,em.last_name,
em.salary_number*(1+0.2) "new_salar y"
fromit_employees em;
查詢出員工薪資上調10%之后的結果,為了提高刻度性,可以為列重新制定顯示標題"new_salar y";
注:如何列標題中包含一些特殊字符,例如空格等,則必須使用雙引號將列標題擴起來。
8.1.3distinct關鍵字
Select distinct job_id from it_employees;
?8.2:where子句
8.2.1條件表達式
selectem.employee_id, em.first_name,em.last_namefromit_employees emwhereem.first_namelike'B%';
判斷first_name以“B”開頭的雇員;
8.2.2連接運算and / or
selectem.employee_id, em.first_name,em.last_namefromit_employees em
whereem.phone_number='15321981677'
andem.salary_number >6000;
用and做連接符,電話號碼和薪酬為判斷條件;
-------------------------------------------------
selectem.employee_id, em.first_name,em.last_namefromit_employees em
whereem.first_name='Britney'
orem.salary_number <6000;
8.2.3 NULL值
首先插入一條記錄,此處Email只為NULL
insertintoit_employees(employee_id,first_name,last_name,email,phone_number,job_id,salary_number,manager_id,birth_date)
values(seq_employee.nextval,'Britney','Joe',NULL,'15321981677','it_prog',10000.67,seq_employee.nextval,to_date('2011-11-01','yyyy-mm-dd'));
查詢值為null的語句:
select*fromit_employees emwhereem.emailisnull;
select*fromit_employees emwhereem.emailisnotnull;
?8.3:order by子句
selectem.last_name, em.job_id , em.salary_number
fromit_employees em
whereem.salary_number >5000
orderbyem.job_id,em.salary_numberdesc;
order by子句后邊可指定多個列名,首先根據第一列排序,當第一列值相同時,再對第二列進行比較排序,以此類推;
?8.4:groupby子句
通過Group By進行的查詢:
selectem.job_id,avg(em.salary_number),sum(em.salary_number),max(em.salary_number),count(em.job_id)
fromit_employees emgroupbyem.job_id ;
可以在group by后使用rollup或者cube進行匯總,在查詢結果中都會附加一條匯總信息,sql如下:
selectem.job_id,avg(em.salary_number),sum(em.salary_number),max(em.salary_number),count(em.job_id)
fromit_employees emgroupbyrollup(em.job_id) ;
?8.5:Having子句
selectjob_id ,avg(SALARY_NUMBER) ,sum(SALARY_NUMBER),max(SALARY_NUMBER),count(*)
fromIT_EMPLOYEESgroupbyJOB_IDhavingavg(SALARY_NUMBER) >5500
通常與Group by子句一起使用,在完成對分組統計后,可以使用Having子句對分組的結果做進一步篩選;
?8.6:多表連接查詢
8.6.1基本形式
將表employees和表departments相連接,從而生成一個笛卡積:
Selectemployee_id, last_name , department_name fromemployees , departments ;
8.6.2條件限定
selectit.employee_id,it.last_name, dm.department_name
fromit_employees it , departments dm
whereit.department_id = dm.department_id;
selectit.employee_id,it.last_name, dm.department_name
fromit_employees it , departments dm
whereit.department_id = dm.department_id
anddm.department_name ='Shipping';
8.6.3表別名
8.6.4 Join連接
Fromjoin_table1join_typejoin_table2
[ON(join_Condition)]
8.6.4.1內連接
select em.employee_id, em.last_name,dep.department_name
from it_employees eminnerjoindepartments dep
on em.department_id = dep.department_id
where em.job_id='it_prog';
8.6.4.2自然連接
Selectem.employee_id, em.first_name, em.last_name, dep.department_name fromit_employees emnatural
joindepartmentsdepwhere dep.department_name=’Sales’
8.6.4.3外連接
左外連接:
selectem.employee_id, em.last_name, dep.department_name
fromit_employees emleftouterjoindepartments dep
onem.department_id = dep.department_id
whereem.job_id='it_prog';
右外連接:
selectem.employee_id, em.last_name, dep.department_name
fromit_employees emrightouterjoindepartments dep
onem.department_id = dep.department_id
wheredep.location_id =1700;
完全外連接:
selectem.employee_id, em.last_name, dep.department_name
fromit_employees emfullouterjoindepartments dep
onem.department_id = dep.department_id
wheredep.location_id =1700or em.job_id=’it_prog’;
8.6.4.4自連接
selectem1.last_name "manager" , em2.last_name "employee"
fromit_employees em1leftjoinit_employees em2
onem1.employee_id = em2.manager_id
orderbyem1.employee_id;
?8.7:集合操作
Union (并運算)、UNION ALL、InTerSect(交運算)、Minus (差運算)
8.7.1Union
/*** < unionall>***/形成的結果集中包含有兩個結果集中重復的行。
selectit.employee_id, it.last_namefromit_employeesit
whereit.last_namelike'%e'orit.last_namelike'j%'
union
selectem.employee_id , em.last_namefromit_employees em
whereem.last_namelike'j%'orem.last_namelike'%o%';
8.7.2Intersect
Intersect查詢結果保留Last_name以j開頭的雇員
selectit.employee_id, it.last_namefromit_employeesit
whereit.last_namelike'%e'orit.last_namelike'j%'
intersect
selectem.employee_id , em.last_namefromit_employees em
whereem.last_namelike'j%'orem.last_namelike'%o%';
8.7.3Minus
例:返回Last_name以e結尾的集合
selectit.employee_id, it.last_namefromit_employeesit
whereit.last_namelike'%e'orit.last_namelike'j%'
minus
selectem.employee_id , em.last_namefromit_employees em
whereem.last_namelike'j%'orem.last_namelike'%o%';
?8.8:子查詢
8.7.1in關鍵字
selectemployee_id, last_name , department_id
from it_employees
where department_idIn
(
selectdepartment_id fromdepartments
wherelocation_id=1700
)
8.7.2Exists關鍵字
selectemployee_id, last_name , department_id
from it_employeesem
whereexists
(
select * fromdepartmentsdep
where em.department_id= dep.department_id
andlocation_id=1700
)
8.7.3比較運算符
selectemployee_id , last_name , job_id , SALARY_NUMBER
fromit_employees
whereJOB_ID ='it_prog'
andSALARY_NUMBER >= (selectavg(SALARY_NUMBER)fromit_employeeswherejob_id='it_prog')
9、數據操縱
?9.1:Insert
9.1.1一般Insert
Insertinto[user.]table[@db_link] [([column1, column2… culumnx])]
Values([express1],[ express2]……)
insertintojobs (job_id,job_title,min_salary,max_salary)
values('it_test','測試員',3500.00,8000.00);
/***注:以下Desc… insert未測試成功***/
descjobs
insertintojobsvalues('it_dba','管理員',5000.00,15000.00)
9.1.2批量Insert
insertintoemployees(employee_id,first_name,last_name,email,phone_number,job_id,salary_number,manager_id)
selectem.employee_id,
em.first_name,
em.last_name,
em.email,
em.phone_number,
em.job_id,
em.salary_number,
em.manager_id
fromit_employees em , departments dep
whereem.department_id = dep.department_id
anddep.department_name='Shipping';
?9.2:Update
updateemployeessetsalary_number = salary_number*1.15
wherejob_id ='it_prog'
updateit_employeessetsalary_number=
(
select avg(salary_number) fromit_employees
where job_id='it_prog'
)
whereemployee_id=11;
?9.3:Delete
deletefromit_employeeswhereemployee_id=31;
?9.4: Truncate
truncatetableemployees;
10、數據控制
?10.1 Grant語句
Grantselect on table it_employees to User1 ;
Grantallprivileges on table it_employees , jobs toUser2 ;
Grant selecton table department to public ;
Grant update(employee_id), select on tableit_employees to User4;
Grant insert on table departmentto user5 with grant option ;
Grant createtab on database db_employees toUser8 ;
?10.2Revoke語句
Revokeupdate(employee_id)on tableit_employees from user4 ;
Revokeselect on table departmentfrompublic;
Revokeinsert on table department from User5 ;
11、Oracle常用函數
?11.1字符類函數
11.1.1 ASCII()
Selectascii('A')big_a,ascii('a') small_afromdual ;
11.1.2CHR()
Selectchr(65) ,chr(97),chr(100)fromdual ;
11.1.3Concat( c1,c2 )
selectconcat('oracle','11g')fromdual ;
返回的是:
11.1.4initcap(C1)
selectinitcap('oracleuniversal installer')fromdual ;
返回的結果:
11.1.5 instr(c1,[c2,,[j]])
select instr('Moisossoppo','o',3,3) from dual;
返回的結果:
select instr('Moisossoppo','o',-2,3) fromdual ;
返回的結果:
11.1.6length(C1)
selectlength('oracle
11g') lgfromdual ;
結果:
11.1.7 lower(C1)
select*fromjobs;
結果:
selectlower(job_id)fromjobswherelower(job_id)like'it%'
結果:
11.1.8Ltrim(c1,c2)
selectltrim('Moisossoppo','Mois')fromdual ;
結果:
11.1.9replace(c1,c2,[c3])
selectreplace('feelblue','blue','yellow')fromdual ;
結果:
11.1.10substr(c1,,[j])
selectsubstr('Message',1,4)fromdual ;
Result :
?11.2數字類函數
?11.3日期類函數
?11.4轉換類函數
?11.5聚集類函數
第四章:Oracle PL/SQL語言及編程
?4.1 PL/SQL簡介
4.1.1pl/sql的基本結構
4.1.2pl/sql注釋
A:單行注釋
createtableclasses (
class_idnumber(6)primarykey,
departmentchar(3)
)
altertableclassesaddcoursenumber ;
createsequenceseq_class_id
incrementby1--每次增加1
startwith100--從100開始
nomaxvalue--不設置最大值
nocycle--一直累加不循環
cache10;
declare--單行注釋聲明
v_departmentchar(3);--保存3個字符的變量
--系統代碼
v_Coursenumber;--保存課程號的變量
begin
v_department:='tes';
v_Course :=19;
insertintoclasses(class_id,department , course)
values(seq_class_id.nextval,v_department,v_Course);
end;
commit;
B:多行注釋
/**
多行注釋
**/
declare
v_departmentchar(3);
v_Coursenumber;
begin
v_department :='duo';
v_Course :=99;
insertintoclasses(class_id,department ,course)
values(seq_class_id.nextval,v_department,v_Course);
end
;
commit;
4.1.3pl/sql字符集
A:合法字符集
B:分界符(delimiter)
4.1.4pl/sql數據類型
A:數字類型
B:字符類型
C:日期類型
D:布爾類型
E:type定義的數據類型(rowtype)
例:
/**
pl/sql數據類型使用type定義teacher_record記錄變量
**/
typeteacher_recordisRecord--該record定義之后,在以后的使用中就可以定義基于teacher_record的記錄變量
(
tidnumber(5)notnull:=0,
namevarchar2(50),
titlevarchar2(50),
sexchar(1)
)
--定義一個teacher_record類型的記錄變量
ateacher
teacher_record ;
4.1.5pl/sql變量和常量
A:定義常量
Pass_Scoreconstantinteger:=60;
B:定義變量
C:變量初始化
4.1.6pl/sql語句控制結構
A:選擇結構
(1)If語句
(2)Case語句
declare
v_gradevarchar2(20) :='及格';
v_scorevarchar2(50);
begin
v_score:=Casev_grade
when'不及格'then'成績< 60'
when'及格'then'60<=成績< 70 '
when'中等'then'70<=成績< 80 '
when'良好'then'80<=成績< 90 '
when'優秀'then'9 0<=成績< 100 '
else'輸入有誤'
end;
dbms_output.put_line(v_score);
end;
運行結果如下:
B:NULL結構
/**
null結構(添加變量是否為null的判斷)
**/
declare
v_number1number;
v_number2number;
v_resultvarchar2(7);
begin
ifv_number1isnullorv_number2isnullthen
v_result ='Unknown';
elsifv_number1
v_result ='yes'
elsev_result ='no'
end;
end;
C:循環結構
(1)Loop…exit … end語句
declare
control_valnumber:=0;--初始化control_val值為0
begin
loop--開始循環
dbms_output.put_line(control_val);--打印測試
ifcontrol_val >5then--如果control_val的值大于5則退出循環
exit;
endif;
control_val :=control_val+1;--否則改變control_val的值
endloop;--結束循環
end;
(2)Loop… exitwhen …end語句
declare
control_valnumber:=0;--初始化control_val值為0
begin
loop--開始循環
dbms_output.put_line(control_val);--打印測試
exitwhencontrol_val >6;--如果control_val的值大于6則退出循環
control_val:=control_val+1;
endloop;
end;
(3)While…loop…end;
(4)declare
(5)control_valnumber:=0;
(6)begin
(7)whilecontrol_val <=5--如果變量小于或等于5就循環
(8)loopcontrol_val:=control_val+1;
(9)dbms_output.put_line(control_val);--打印測試
(10)endloop;
(11)end;
(4)for… in … loop …end
這是個預知循環次數的循環控制語句:
declare
control_valnumber:=0;
begin
forcontrol_valin0.. .9loop
dbms_output.put_line(control_val);
null;
endloop;
end;
null為空操作語句,它表示什么也不做,在程序中用來標識此處可以加執行語句,起到一種記號的作用;
(5)GOTO語句示例
4.1.7pl/sql表達式
A:字符表達式
declare
hnvarchar2(20) :='hello';
wnvarchar2(20) :='world!';
rtnvarchar2(20) ;
begin
ifhisnotnullandwisnotnull
thenrt:=h||w;
dbms_output.put_line(rt);
endif;
end;
運行結果:
B:布爾表達式
begin
if 'Scott' not in ('Mike','John','Mary')
then dbms_output.put_line('false');
end if ;
end;
運行結果:
?4.2 PL/SQL的游標
4.2.1基本原理
4.2.2顯示游標
顯示游標的處理包括:聲明游標、打開游標、提取游標、關閉游標4個步驟;其操作過程如下圖:
注:聲明游標需要在塊的聲明部分進行,其他3步驟都在執行部分或異常處理中進行。
A:聲明游標
B:打開游標
Open <游標名>;
1)檢查聯偏變量的取值;
2)根據聯偏變量的取值,確定活動集;
3)活動集指針指向第一行;
C:提取游標
D:關閉游標
Close <游標名>;
查出employees表中的所有數據:
執行下邊定義的sql:
--1,游標的聲明
declare
FIRST_NAMEVARCHAR2(30);--定義四個變量來存放employees表中的內容
LAST_NAMEVARCHAR2(30);
EMAILVARCHAR2(30);
phone_numvarchar2(30);
cursoremployee_curis
selecte.first_name,e.last_name,e.email,e.phone_number
fromemployeese
wheree.employee_id<10;--選出編號大于5的所有雇員
--2,游標的開啟
begin
openemployee_cur;
--3,提取游標(fetch語句每執行一次,游標向后移動一行,直到結束;游標只能逐個向后移動,而不能跳躍移動或者向前移動)
fetchemployee_curintoFIRST_NAME,LAST_NAME,EMAIL,phone_num;
--4,關閉游標
loop
exitwhennotemployee_cur%found;--如果游標到尾則結束
ifFIRST_NAME='lq'then
dbms_output.put_line('名稱為:lq');
else
dbms_output.put_line('沒有合法用戶');
endif;
fetchemployee_curintoFIRST_NAME,LAST_NAME,EMAIL,phone_num;
endloop;
closeemployee_cur;
end;
得出的結果為:
注:使用顯式游標時,需要注意以下事項:
4.2.3隱式游標
4.2.4游標屬性
A:是否找到游標(%found)
B:是否沒找到游標(%found)
C:游標行數(%RowCount)
--1,游標的聲明
declare
FIRST_NAMEVARCHAR2(30);--定義四個變量來存放employees表中的內容
LAST_NAMEVARCHAR2(30);
EMAILVARCHAR2(30);
phone_numvarchar2(30);
cursoremployee_curis
selecte.first_name,e.last_name,e.email,e.phone_number
fromemployeese
wheree.employee_id<10;--選出編號大于5的所有雇員
--2,游標的開啟
begin
openemployee_cur;
--3,提取游標(fetch語句每執行一次,游標向后移動一行,直到結束;游標只能逐個向后移動,而不能跳躍移動或者向前移動)
fetchemployee_curintoFIRST_NAME,LAST_NAME,EMAIL,phone_num;
--4,關閉游標
loop--如果游標到尾則結束(判斷游標當前行數,即當前只抽取3條記錄)
exitwhennotemployee_cur%foundoremployee_cur%rowcount=3;
ifFIRST_NAME='lq'then
dbms_output.put_line('名稱為:lq');
else
dbms_output.put_line('沒有合法用戶');
endif;
fetchemployee_curintoFIRST_NAME,LAST_NAME,EMAIL,phone_num;
endloop;
closeemployee_cur;
end;
D:游標是否打開(%IsOpen)
E:參數化游標
--敲回車后會彈出輸入對話框,輸入即可。
--ACCEPT my_tid prompt 'please input the tid';
ACCEPTmy_tidprompt'please input the tid';
declare
my_tid
number:=10;--定義的參數或者直接用以上prompt輸入參數
FIRST_NAMEVARCHAR2(30);--定義四個變量來存放employees表中的內容
LAST_NAMEVARCHAR2(30);
EMAILVARCHAR2(30);
phone_numvarchar2(30);
cursoremployee_cur(cursor_idnumber)is--定義游標時帶上參數
selecte.first_name,e.last_name,e.email,e.phone_number
fromemployeese
wheree.employee_id
begin
ifemployee_cur%isopenthen
loop
fetchemployee_cur
intoFIRST_NAME,LAST_NAME,EMAIL,phone_num;
exitwhenemployee_cur%notfound;
endloop;
else
openemployee_cur(my_tid);--帶上實參數
loop
fetchemployee_cur
intoFIRST_NAME,LAST_NAME,EMAIL,phone_num;
exitwhenemployee_cur%notfound;
endloop;
endif;
closeemployee_cur;
end;
4.2.5游標變量
Oracle 11 G從入門到精通閱讀至126頁,文檔未完待續。