一、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語句
(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
其他環境參數的使用也是大同小異
創建用戶,需要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是口令限制,資源限制的命令集合。當建立數據庫時,oracle會自動建立名稱為default的profile。當建立用戶沒有制定profile選項,那oracle就會將default分配給用戶。
指定登錄時最多可以輸入密碼的次數,也可以指定用戶鎖定的時間,以天為單位。一般用dba的身份去執行命令例如:指定stu最多只能嘗試三次登錄,鎖定時間為2天
sql>create profile lock_account limit failed_login_attempts 3 password_lock_time 2;
sql>alter user stu profile lock_account;
sql>alter user stu account unlock;
為了讓用戶定期修改密碼,可以使用終止口令的指令完成,同樣這個命令也要dba身份來操作 給stu創建一個profile文件,要求該用戶每隔10天要修改登錄密碼,寬限期2天
sql>create profile stu limit password_life_time 10 password_grace_time 2;
sql>alter user stu profile stu;
解鎖方式同上
如果希望用戶在修改密碼時,不能使用以前用過的密碼,可以使用口令歷史,這樣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天後口令可重復使用
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即可將重復數據略去
首先,介紹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;