程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> [轉載]Oracle基礎知識,轉載oracle基礎知識

[轉載]Oracle基礎知識,轉載oracle基礎知識

編輯:Oracle教程

[轉載]Oracle基礎知識,轉載oracle基礎知識


一、oracle安裝過程略

二、sys用戶和system用戶

(1)sys用戶是超級用戶,具有最高權限,具有sysdba角色,有create database的權限

默認密碼是change_oninstall

(2)system用戶是管理操作員,權限也很大,具有sysoper角色,但沒有create database的權限,默認密碼為manager

(3)一般對數據庫的維護,使用system用戶登錄就足夠了

三、oracle的啟動

所謂的啟動是指啟動oracle的實例,即OracleServiceORCL,在使用java連接數據庫時必須要啟動監聽器,否則就不能夠使用JDBC。

四、oracle的數據對象

在oracle中表、視圖、存儲過程、觸發器在oracle中被稱為數據對象

五、oracle管理工具

sqlplus是oracle自帶的工具軟件,主要用來執行sql語句

 

 

 

一、以下是sqlplus常用命令

(1)conn[ect]

用法:conn 用戶名/密碼@網絡服務名[as sysbda/sysoper]

當用戶是特權用戶時必須帶上as sysbda/sysoper

例如:conn system/manager

(2)disc[onnect]

斷開連接

(3)passw[ord]

修改密碼,當想要修改其他用戶密碼用sys或system登錄

(4)show user

顯示當前用戶

(5)exit

斷開連接,並退出sqlplus

二、文件操作命令

(1)start、@

說明:運行sql腳本

如:在d: 下有a.sql這個文件,運行下面的命令即可執行a.sql中的內容

sql>@ d:a.sql 或者

sql>start d:a.sql

(2)edit

編輯指定的sql腳本

sql>edit d:a.sql

(3)spool

該命令可以將sqlplus屏幕上的內容輸出到制定的文件中去

sql>spool d:b.sql

sql>select * from emp;

spl>spool off

說明:spool命令將select * from emp;的查詢結果輸出到指定位置的文件中 然後spool off類似於IO的開啟/關閉

三、交互式命令

(1)&

可以替代變量,而該變量在執行時需要用戶輸入

sql>select * from emp where job='&job';

oracle會提示用戶輸入值

四、顯示和設置環境變量

可以用來控制輸出的各種格式,如果希望永久的保存相關設置,可以修改glogin.sql腳本

(1)linesize

設置顯示行的寬,默認是80個自己字符

sql>show linesize

sql>set linesize 120

(2)pagesize

設置每頁顯示的行數默認是14,用法同linesize

其他環境參數的使用也是大同小異

 

 

一、Oracle用戶管理

創建用戶,需要DBA權限

命令:create user 【用戶名】identified by 【密碼】

修改密碼

命令:password 【用戶名】 ( 在用戶已經連接的情況下 )

注意:在給其他用戶修改密碼時  需要具有DBA的權限或擁有alter user的系統權限

命令:alter user 【用戶名】 identified by 【新密碼】

刪除用戶

一般以DBA身份去刪除用戶

如果要刪除的用戶,已經創建了表,要在刪除時加上一個參數 cascade

命令:drop user 【用戶名】 [cascade]

二、權限和角色

剛剛創建完的新用戶是沒有任何權限的,甚至連登錄數據庫的權限都沒有。這是時候使用conn 【用戶名】/【密碼】會提示沒有權限。

在新建一個用戶之後還要對這個用戶進行授權操作。當然了,要使用有能力授權的用戶,如sys、system

權限包含系統權限和對象權限

系統權限:用戶對數據庫的相關權限

對象權限:用戶對其他用戶的數據對象操作的權限

角色

角色是指由系統權限集合。通常給某個用戶授予權限時如果沒有角色存在的話,那麼需要一條一條的操作,角色的存在

就是使得授權變得很方便。通常一個角色由多個系統權限組成。常用的角色有三個connect(7種權限)、dba、resource(在任何表空間建表)。

這裡只是簡單的提一下,在以後會作為一個專題進行研究。

使用grant命令給用戶分配權限

grant 【權限名】 to 【用戶名】

分配角色

grant 【角色名】 to 【用戶名】

收回權限

revoke 【權限名】 from 【用戶名】

舉個例子來說明:

1、創建用戶

create user stu identified by stu;

2、使stu能夠被連接

grant create session to stu;

3、讓stu能夠在任何表空間下建表

grant resource to stu

3、創建一個簡單的表

create table users(name varchar2(10),age number(2));

4、插入幾條數據

insert into users values('houjinxin',22);

5、登錄到scott給stu授權讓stu可以查看scott下的emp表

grant select on emp to stu;

6、登錄到stu下查看emp表

select * from scott.emp;

如果這時想要更新scott.emp中的數據

update scott.emp set ename='ok2' where ename='ok';

會提示ORA-01031: 權限不足 。因為scott只給了stu查看的權利,如果仍然想更新,要到scott下進行授權

7、登錄到system下收回resource角色

revoke resource from stu;

8、登錄scott下收回select 權限

revoke select on emp from stu;

這是stu就不能再查詢scott.emp的數據了

權限的傳遞

當希望stu用戶可以去查詢scott的emp表時,還希望stu能夠把這個權限繼續傳給其他用戶時

如果要傳遞的是對象權限,就加入with grant option

grant select on emp to stu with grant option

如果是系統權限:就加上with admin option

grant connect to stu with admin option

當system給stu授權時,會給stu給其他用戶授權的能力

做個實驗來驗證下

1、登錄到system用戶下,重新建立兩個用戶

create user hou identified by hou;

create user jin identified by jin;

並為hou分配connect角色

grant connect to hou with admin option;

2、登錄到scott下個hou授權

grant select on emp to hou with grant option;

3、登錄到hou下開始對jin授權

grant select on scott.emp to jin;

grant connect to jin;

4、登錄到jin下查詢scott.emp

select * from scott.emp;

到目前位置都正常,問題來了!

如果system收回分配給hou的權限,那麼jin的權限會不會也被一起收回,繼續實驗。

5、登錄到scott下收回hou的權限

revoke select on emp from hou;

revoke connect from hou;

6、登錄到jin下看現象

發現仍然能夠登錄到jin上這說明connect角色並未被收回

而當查詢scott.emp時卻提示ORA-00942: 表或視圖不存在

這說明系統權限和對象權限是不同的。對於系統權限,hou分配給jin之後不再收回,對象權限卻隨著hou的權限被收回也被同時收回了

 

 

使用profile 管理用戶口令  

profile是口令限制,資源限制的命令集合。當建立數據庫時,oracle會自動建立名稱為default的profile。當建立用戶沒有制定profile選項,那oracle就會將default分配給用戶。  

(1)帳號鎖定  

指定登錄時最多可以輸入密碼的次數,也可以指定用戶鎖定的時間,以天為單位。一般用dba的身份去執行命令例如:指定stu最多只能嘗試三次登錄,鎖定時間為2天

sql>create profile lock_account limit failed_login_attempts 3 password_lock_time 2;

sql>alter user stu profile lock_account;  

(2)給賬戶解鎖  

sql>alter user stu account unlock;

(3)終止口令  

為了讓用戶定期修改密碼,可以使用終止口令的指令完成,同樣這個命令也要dba身份來操作  給stu創建一個profile文件,要求該用戶每隔10天要修改登錄密碼,寬限期2天

 sql>create profile stu limit password_life_time 10 password_grace_time 2;

 sql>alter user stu profile stu;

 解鎖方式同上

 (4)口令歷史  

如果希望用戶在修改密碼時,不能使用以前用過的密碼,可以使用口令歷史,這樣oracle就會將口令修改的信息存放在數據字典中,這樣當用戶修改密碼時,oracle就會對新密碼與就得進行對比,如果一樣提示用戶重新輸入。

  例如:

 sql>create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10  

sql>alter user stu profile password_history;

password_reuse_time 10 表示10天後口令可重復使用

 (5)刪除profile  

 drop profile password_history [cascade]

 cascade表示如果已經將profile分配給某個用戶時,仍要刪除profile,就要加上cascade

 

 

表的管理 

一、表名和列的命名規范

1.必須以字母開頭

2.長度不能超過30個字符

3.不能使用oracle的保留字

4.只能使用如下字符串,A-->Z,a-->z,0-->9,$,#等

二、oracle支持的數據類型

1、字符型

char 定長,最長2000字符

例如:char(10) 存儲內容為“小韓”時,前4個字符放‘小韓’,後六位由空格補齊

優點是:效率高,查詢速率快。如身份證的字段可以設置成char(18)。

varchar2 變長 最大4000字符(oracle推薦使用)

varchar2(10) 存儲內容為“小韓”時 oracle分配4個字符

clob(character large object) 字符型大對象

最大4G

2、數字類型

number范圍-10的38次方到10的38次方

可以是整數,也可以是小數

number(5,2)表示一個小數有5位有效數字,2位是小數

例如:定義一個范圍在-999.99-999.99的數字可以用number(5,2)

定義一個范圍在-99999-99999可以用number(5)

3、日期類型

date 包含年月日和時分秒

timestamp oracle對date類型的擴展

4、圖片類型

blob 二進制數據,可以存放圖片,音頻,視頻最大4G

這個類型允許我們將大文件存儲進數據庫,但是一般在數據庫裡,存放的應該是這些文件的路徑,如果對安全性有要求,可以將文件放入數據庫

三、建表語句

1)建表

sql>create table student(--表名

Idnumber(4), --學號

Namevarchar(20), --姓名

Sex char(2),--性別

birthday date);--出生日期

上面的語句足以建立一個簡單的學生表

2)向已經建立的表中添加字段

sql>alter table student add(ClassId number(2));

3)修改字段的長度

sql>alter table studentmodify(Name varchar2(50) );

4)修改字段的類型/或名字(不能有數據)

sql>alter table student modify(Name char(20));

sql>alter table student rename Name to Sname;

5)刪除一個字段(慎重使用)

alter table student drop column Sex;

6)修改表的名字

sql>rename student to stu;

7)刪除表

drop table student;

8)查看表結構

desc student;

四、操作表

1、添加數據,所有字段必須都插入

insert into student values(1,'張三','男','01-5月-05');

不要以為這裡寫錯了,oracle中默認的日期格式‘DD-MON-YY’ (日-月-年)

想要修改日期的默認格式可以這樣做

sql>alter session set nls_date_format='YYYY-MM-DD';

修改以後就可以用我們熟悉的格式來添加類型

insert into student values(1,'張三','男','2000-08-31');

但是這裡的修改只是臨時成立的,要想永久改變日期輸入格式是需要改注冊表的,還有一個方法是使用函數,暫且略過

2、插入部分字段,前提是未插入的字段允許為null

insert into student(Id,Name) values(1,'張三');

3、插入空值

insert into student(Id,Name,Sex) values('1',null,null);

4、查詢Name為空的一條記錄

按照正常的邏輯,許多人會這樣做

select * from studentwhere Name=null;

但是這樣的結果是什麼都查不到,正確的方法如下

select * from student where Name is null;

查詢所有非空的就在is後面加上not

5、修改一個字段

update student set sex=‘女’ where Id=‘1’;

6、修改多個字段

update student set sex=‘男’,Name='趙四' whereId=‘1’;

7、修改含有null值的字段

update student set Name=‘張三’ where Name is null;

8、刪除數據(三中方式)

1)刪除一條記錄

delete from student where Id=‘1’;

2)刪除所有記錄,表結構還在,會記錄日志,這種刪除是可以恢復的,速度會稍慢

delete from student;

3)刪除表的結構和數據

drop table student ;

4)刪除所有記錄,表結構還在,不記錄日記,所有這種刪除無法找回數據,但是速度很快

truncate table student;

9、恢復數據

用delete from student 時數據可恢

1)首先要設置一個保存點

savepoint sp;--sp是保存點名稱,可以隨意起名,作用是將數據保存在日志中

2)刪除數據

delete from student ;

3)查詢驗證數據是否被刪掉

select * from student;

結果是肯定的,沒有數據

4)回滾數據

rollback to sp;

5)在查詢驗證數據回滾是否成功

select * from student;

結果還是肯定的數據回來了!

當然可以設置多個保存點,但是如果不做處理,新的保存點會默認覆蓋前一個保存點

10、取消重復行

select distinct deptno,job from emp;

在查詢時select後面加上distinct即可將重復數據略去

 

 

Oracle的基本查詢

首先,介紹PL/SQL軟件中兩個命令

1.清屏命令

  clear

2.關閉/打開顯示操作時間命令

    set timing off/on

其次,是兩個sql技巧

1.快速向數據庫中插入大量數據

insert into users(userid,username,userpass)

       select * from user;

使用這個語句的前提是表中至少要有一條數據

2.查詢所有記錄數

select count(*) from user;

需要注意的是在寫SQL 語句時,要注意大小寫問題

Orace的字段不區分大小寫,實體卻區分大小寫

一、使用算數表達式

? 顯示每個雇員的年工資

可以使用列的別名

select ename "姓名",sal*12 as "年收入" from emp;

這裡的中文最好用引號引上,盡量不要用中文

?如果計算表達式中有一個null值那麼計算結果就為null,如何處理null值?

使用nvl函數處理

select sal*13+nvl(comm,0) "年工資" ,ename from emp;

nvl(comm,0)的意思是如果comm為null,那麼按0計算,不是0按本身計算

?如何連接字符串

用"||"

select ename || ' is a ' || job from emp;

二、使用where子句

?如何顯示工資高於3000的員工

select ename,sal from emp where sal >3000;

?如何查找1982.1.1後入職的員工

select ename from emp where hiredate>'1-1月-1982';

?查找工資在2000-2500之間的員工

select ename from emp where sal>=2000 and sal <=2500;

三、如何使用like操作符

%: 表示0到多個字符

_:表示任意單個字符

?如何顯示首字母為s的員工

select ename from emp where ename like ‘s%’;

?如何顯示第三個字母為大寫O的所有員工的姓名和工資

select ename, sal from emp where ename like '__O%';

四、在where條件中使用in

?如何顯示empno為123,456,234的雇員情況

select * from emp where empno in(123,234,456);

這種查詢效率很高

五、使用is null操作符

? 如何顯示沒有上級的雇員情況

select * from emp where mgr is null;

六、使用邏輯操作符號

?查詢工資高於500或是崗位為MANAGER的雇員,同時還要滿足他們的姓名首寫字母為大寫的T

select * from emp where (sal>500 or job='MANAGER') and ename like 'T%';

這裡的括號不可以忘記,否則條件就變了,因為and的優先級高於or

七、使用order by 子句

?如何按照工資從高到低的順序顯示雇員

select ename from emp order by sal desc;

desc 為逆序 asc為順序(默認)

?按照部門號升序而雇員工資降序排列

select * from emp order by deptno asc,sal desc;

八、使用列的別名排序

select ename ,sal*12 "年薪" from emp order by "年薪" asc;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved