一、卸載安裝(來自百度經驗)
完全卸載:
1. 停止相關服務
2. 運行Universal Installer,卸載產品
3. 清理注冊表
4. 重啟電腦,刪除目錄(Oracle文件夾和app文件夾)
安裝:
1. 運行setup.exe
2.取消勾選“接收安全更新”選項
3. 選擇創建和配置數據庫
4. 桌面類
5. 企業版
6. 使用utf-8字符集
7. 口令管理,將Scott解鎖,設置密碼tiger
打開sql plus用設置好的賬戶登錄測試一下
二、配置
1. 確保服務(service和listener)開啟
2. 打開Net Manager配置listener和Oracle主目錄
3. 打開net configuration assistant配置監聽程序和本地網絡服務名配置
三、配置PLSQL
1. tools-->preferences Oracle Home:Oracle主目錄
2. 查看主目錄/network/admin/下是否有tnsnames.ora文件和listener.ora
問題匯總:TNS無法解析制定的連接符標識https://www.cnblogs.com/justlove/p/8252779.html
可以試着把主機名改為本計算機名
四、SQL數據庫用戶操作語句
新建用戶:create user [username] identified by [password]
分配表空間:alter user [username] default tablespace users temporary tablespace temp profile default
新建用戶同時分配表空間:create user zhangsan identified by 123456 default tablespace users temporary tablespace temp profile default
賦予權限:grant connect to zhangsan; grant resource to zhangsan; 給查詢權限:grant select on emp to zhangsan;
一次賦予多種權限用逗號隔開,如: grant connect,resource to zhangsan
刪除用戶:drop user zhangsan
去除權限:revoke connect from zhangsan
修改用戶密碼:alter user zhangsan identified by newpassword
鎖定用戶:alter user zhangsan account lock
五、Oracle中的數據類型
number(10)表示數字類型,長度為10
number(5,2)表示總長度為5,小數位占其中的2位
char(10)字符型,最多放2000個字符
varchar()或者varchar2()可變長度字符,最多放4000個字符
date日期類型,系統默認日期格式:2-3月-2019
timestamp日期精確到毫秒
blob大數據,存儲二進制數據,最大4G
六、SQL表操作語句
創建表:
create table student(
sid number(10),
sname varchar(20),
cid number(10),
......
)
修改表:
追加列:alter table student add(sex varchar(5))
修改列:alter table student modify(sname varchar(15))
刪除列:alter table student drop column sex
修改列名:alter table student rename column sex to gender
修改表名:rename student to students
刪除表:drop table student
約束 (分為列級約束和表級約束)
種類:主鍵primary key、唯一unique、非空not null、外鍵foreign key references、檢查check
添加列級約束:
create table student(
sid number(10) primary key,
sname varchar(20) not null,
cid number(10) references class,
......
)
添加表級約束:
create table student(
sid number(10) ,
sname varchar(20) ,
cid number(10) ,
......
constraint student_sid_pk primary key(sid),
constraint student_cid_fk foreign key(cid) references class(cid),
......
)
或者alter table add constraint ...
七、數據處理
Crete table 表名 As Select * from 表名
創建一個表,並將查詢出來的數據插入到新的表中
去掉數據復制表結構:
Create table 表名 As Select * from 表名 Where 添加一個沒有結果的條件 empno=null
八、查詢語句
||連接查詢結果
在sql中,所有的空值運算之后都為空
Nvl(comm,0)空值處理
Nvl處理空值 第一個參數為列,第二參數表示為如果列中的值為空,用0來代替
去掉重復 關鍵字:distinct
在sql語句中,字符、日期都必須用單引號引起來
數值的比較,字符串的比較,日期的比較,between…and….(在兩者之間,包含兩個邊界),like(_,%)(模糊查詢,關鍵字查詢),in(匹配查詢)
Is null表示空 is not null 表示非空
Between。。and。。格式: select * from 表明 where 列明 between XX and XX
比較符:> < >= <= !=或<> = sql中的賦值符號: := 賦值符號
邏輯運算符: and 與 or或 not非
排序關鍵字:order by asc 升序 為默認排序可以省略 desc 降序
九、函數
單行函數:只對一行數據影響的函數叫單行函數
單行函數:字符、數值、日期、轉換、通用
字符函數:lower 將字符轉換為小寫;upper 將字符轉換為大寫
instr(列,str1) 查詢字符 str1在列中的字符
--concat 連接 將兩個字符連接 類似於||
select concat(ename,job) from emp
--length 返回字符串的長度
select length(ename) from emp
數值函數:
--dual 這個表沒有具體的數據,只是在查詢的時候,我們查詢的格式為 select 列 from 表名,當不需要用到表而用到查詢結構的時候用dual占位
Turnc() 數字截斷
round()四舍五入
mod() 求余
日期函數: sysdate 分為日期和時間
Months_between 獲得兩者之間的月份數
--獲得1987/4/19到1981/2/20這個日期間的月份差
select months_between('19-4月-1987','19-4月-1981') from dual
add_months 向指定的日期中添加若干月份
last_day 獲得本月的最后一天
round (日期,年/月/日) 日期同樣有四舍五入
trunc 日期的截斷
轉換函數: 分為兩種形式:隱式轉換 顯示轉換
隱式轉換:自動類型轉換
顯示轉換:對數據用方法進行轉換
To_char 轉換為字符
To_number 轉換為數字
To_date 轉換為日期
To_char(date\number,’字符格式’)
將日期轉換為字符串 to_char(sysdate,’yyyy-mm-dd’);
將數字轉換為字符串 to_char(sal,’00000.00或者9999.99’);
格式中的9的位數,一定要大於等於要轉換的數字的位數
如果是貨幣可以在前面加上$或者L(本地貨幣)為字符串
To_date(‘字符’,‘日期格式’)
yyyy 代表年 mm代表月 dd代表日 hh時 mi分 ss秒
--插入一條數據到數據庫表emp 將日期轉換為指定格式
insert into emp values(7856,'lisi','SALESMAN',7698,to_date('1982-12-12','yyyy-mm-dd'),6000,200,10)
To_number(‘字符’,’數字格式’)
--將¥1234.55轉換為數字
select to_number('¥1234.55','L999999999.000') from dual
如果字符含有貨幣符號,那么格式中也必須有貨幣符號
通用函數:
Nvl(參數1,參數2)處理空值
Nvl2(參數1,參數2,參數3) 參數1列中的數據,如果不為空執行參數2,如果為空執行參數3
Case 參數 when 列值 then 返回數據
[when 列值2 then 返回數據2
.......]
Else 返回數據
End [別名]
通過每一列查出的值作為參數匹配when后面的值,入果匹配上了則返回then后面的值,如果都沒匹配上 則返回else中的值,整個函數只是一列
Decode(參數,列值1,返回值1,列值2,返回值2,列值3,返回值3,返回值)
分組函數:min、max、avg、sum、count
十、高級查詢
分組查詢:通過關鍵字group by分組的查詢
規則:select中出現的非組函數列,在group by 中必須出現
group by 中出現的列,select中可以沒有
order by 放在最后排序
having:針對已分組的數據再次過濾,可以使用組函數,而where不能!
多表查詢:兩張表及兩張表以上的查詢叫多表查詢。
內連接:inner join 效率高於等值查詢
外連接:outer join 分為左外連接和右外連接查詢。
滿連接:full outer join
子查詢:查詢的嵌套,用括號扣起來的查詢語句。分為單行子查詢和多行子查詢。
in:匹配任意一個結果
any:用於否定?(有點懵逼)
all:匹配所有?(有點懵逼)
合並查詢:union並集、union all不取消重復行、intersect交集、minus差集
分頁查詢:
select * from emp
delete from emp where empno=7999
--在Oracle查詢中系統會為每張表提供一個rownum的偽列,rownum是一個永遠從1到最大條數的有序排列
--rownum只能從1開始,所以如果數據不從一開始,需要先將rownum查詢出來成為一個獨自列
--如果分頁查詢的時候需要排序,一定要在查詢rownum之前排序
select *
from (select e.*,rownum r from (
select * from emp order by sal
) e
where rownum<=3*5)
where r>(3-1)*5
--此處查詢第三頁數據,五條數據為一頁
十一、事務管理
隱式提交:DDL語句(操作表結構)自動保存
顯式提交:commit手動提交
隱式回滾:異常關閉數據庫,自動回滾
顯示回滾:rollback 回滾到前一個提交點
savepoint 創建保存點
rollback to 保存點名字
十二、視圖
虛表,數據來源於表,一般用於查看
create or replace view as...
十三、序列
主要用於提供主鍵值
create sequence 序列名
[Increment by n] --序列的步長,默認值為1
[start with n] --序列初始位置,不能小於最小值
[minvalue n] --最小值
[maxvalue n] --最大值
[cycle/nocycle] --序列是否可以循環再取
[cache n] --序列的緩存
十四、觸發
//創建一個觸發器:create trigger 觸發器名稱
結合序列使用,首先創建一個序列:
--序列:可以供多個用戶來產生唯一數值的數據庫對象,提供有規律的數值
create sequence emp2_seq
increment by 1 --設計序列的步長
minvalue 1 --最小值
maxvalue 9999999 ---最大值
start with 1 --起始值
nocycle --是否循環
cache 20 --緩沖 一般設置為20
--使用序列
--獲取序列的下一個值 通過 序列名.nextval
insert into emp2 values(null,'MORRIS','CLREK',7499,'10-2月-1981',1100,50,10)
select * from emp2
--獲取序列的當前值
select emp2_seq.currval from dual
--觸發:在執行某一動作的時候,觸發其他動作的執行
create or replace trigger emp2_trg --創建觸發
before insert on emp2 --在emp2表插入之前觸發
for each row --循環每一行
declare
begin
select emp2_seq.nextval into:new.empno from dual; --查詢序列中的下一個值,into賦值給新的主鍵
end emp2_trg;
十五、索引
--創建索引
create index ename_index on emp(ename)
--刪除索引
drop index ename_index
十六、PLSQL基礎
賦值符號: :=
引用類型: V_name table_name.column_name%type
聲明式記錄類型: Type record_name is record(
v_name type(number),
......
);
引用式記錄類型:v_emp emp%rowtype;
選擇結構:
if...then...
elsif...then...
else....
end if;
case結構:
case ... when...then ...
when...then...
else...
end case;
循環結構:
loop...exit when...end loop;
while... loop...end loop;
for v_i (計數器) in [reverse] 下限...上限 loop...end loop;
goto順序結構:
通過標簽跳轉,一般用於結束循環
注意:標簽不能緊鄰end;
十七、游標
顯式游標:
-
- 聲明游標:cursor 名字(參數...) is 查詢語句(where條件);
- 打開游標:open 名字(參數...);
- 提取游標數據:fetch 名字 into 記錄類型變量/變量列表;
- 關閉游標:close 名字;
例子: declare
cursor emp_cur is select * from emp;
vemp emp%rowtype;
begin
open emp_cur;
fetch emp_cur into vemp;
while emp_cur%found loop
dbms_output.put_line(vemp.empno||" "||vemp.ename);
fetch emp_cur into vemp;
end loop;
close emp_cur;
end;
帶返回值的游標:
帶參帶返回值:
declare
cursor emp_cur(vjob varchar2)
return emp%rowtype --設置返回值類型,用於規定select查詢結果
is select * from emp
where job=vjob;
vemp emp%rowtype;
begin
open emp_cur('CLERK');
loop
fetch emp_cur into vemp;
exit when emp_cur%notfound;
if vemp.sal <1200 then
update emp set sal=sal+50 where empno = vemp.empno;
end if;
end loop;
end;
FOR循環游標:
for 接收變量 in 游標名字(參數...) loop
..........
end loop;
接收變量不需要聲明!不需要打開游標!
declare
cursor emp_cur(vdname varchar2) is select * from emp where deptno =
(select deptno from dept where dname=vdname);
begin
-- open emp_cur('SALES'); 隱含打開游標啊
for vemp in emp_cur('SALES') loop
--隱含提取游標
dbms_output.put_line('員工編號為:'||vemp.empno||',姓名為:'||vemp.ename||',職位為:'||vemp.job||',工資為:'||vemp.sal);
--隱含關閉游標
end loop;
end;
begin
for vemp in (select * from emp) loop
dbms_output.put_line('員工編號為:'||vemp.empno||',姓名為:'||vemp.ename||',職位為:'||vemp.job||',工資為:'||vemp.sal);
end loop;
end;
隱式游標:
begin
update emp set comm=500 where empno=7499;
-- if sql%found then
--DBMS_OUTPUT.PUT_LINE('更新數據成功!');
--end if;
if sql%rowcount>0 then
DBMS_OUTPUT.PUT_LINE('更新數據'||sql%rowcount||'條成功!');
end if;
end;
游標變量:
定義:type 類型名 is ref cursor [返回類型]
聲明:變量名 類型名
打開:open...
提取:fetch ...into...
關閉:close...
十八、異常處理
分為:系統異常和手動異常
手動異常:
declare
too_data_nofind exception; --聲明異常 關鍵字exception
begin
update emp set sal=sal+1 where deptno=50;--一個沒有不能找到的條件
if sql%notfound then
raise too_data_nofind;--拋出異常,關鍵字raise
end if;
--拋出異常后代碼不會被執行
dbms_output.put_line('今天天氣不錯,適合游泳!');
exception
when too_data_nofind then --匹配異常
dbms_output.put_line('找不到此部門中的人!!');
end;
十九、存儲過程及函數
區別就是存儲函數有返回值。
create [or replace] procedure/function 名字(參數...)
[return...]
as -- 相當於declare
begin
...........
[return ...]
end 名字;
執行存儲過程:exec 名字;
或者begin 名字 end;
參數有in、out、in out之分。