oracle資料庫的安裝和基礎使用
一、安裝Oracle資料庫
二、創建資料庫
三、資料庫相關概念
四、使用oem管理資料庫
五、SQL語句
=================================================
(1)安裝包下載
百度雲盤鏈接:【https://pan.baidu.com/s/1nSH1StEDtcEkWEiGVV0K0g】 提取密碼:8ec3
(2)開始安裝
解壓下載下來的安裝包,解壓完成後,到相應路徑下,找到【setup.exe】,雙擊運行,開始安裝Oracle 11g。
(3)點擊安裝包中的setup.exe,進入Oracle安裝界面首頁
(4)跳過配置安全更新,可以選擇不需要更新,直接下一步。
(5)安裝選項中,選擇「創建和配置資料庫」。
(安裝完資料庫管理軟體後,系統會自動創建一個資料庫實例)
(6) 系統類,直接選擇默認的桌面類就可以了。
(7)典型安裝。#重要步驟
建議只需要將Oracle基目錄自己設置下,目錄路徑不要含有中文或其它的特殊字元。全局資料庫名可以默認,且口令密碼,必須要牢記。密碼輸入時,要盡量符合Oracle的規則:必須是大寫字母加小寫字母加數字,而且必須是8位以上。
(8)先決條件檢查。
安裝程序會檢查軟硬體系統是否滿足安裝此Oracle版本的最低要求。只要都成功,就直接下一步。
(9)概要。
安裝前的一些相關選擇配置信息。可以保存成文件或不保存文件,直接點完成即可。
(10)安裝產品
耐心等待安裝產品過程完成。大約20分鐘左右可以完成。
資料庫管理軟體文件及dbms文件安裝完後,會自動創建安裝一個實例資料庫默認前面的orcl名稱的資料庫。
實例資料庫創建完成了,系統默認是把所有賬戶都鎖定不可用了(除sys和system賬戶可用外),建議點右邊的口令管理,嘗試將一個常用的scott賬戶解鎖並輸入密碼。
設置完成以後可以查看是否設置成功
註:在Oracle系統中,有兩個用戶賬號非常重要,介紹一下:
超級管理員:sys,具有資料庫所有許可權,包括啟動和關閉資料庫。
系統管理員:system,許可權僅次於sys,用於日常資料庫管理操作。
Database Control URL 為 https://localhost:1158/em(OEM資料庫管理系統)
(11)安裝完成
(12)安裝完成後,測試一下
win+R 輸入cmd sqlplus 用戶名/密碼 as sysdba #as sysdba 表示使用管理員用戶 eg:sqlplus sys/Test1234 as sysdba
顯示進入SQL即代表安裝成功
或者:
在開始菜單裡面--oracle--應用程序開發--sql developer
注意:第一啟動sql developer,需要設置java.exe
例如:D:myOracleproduct11.2.0dbhome_1jdkjrein
如果彈出sql developer窗口,安裝成功.
或者:
在瀏覽器中輸入https://localhost:1158/em #OEM資料庫管理系統
查看是否可以成功登錄
(1)win:開始--所有選項--配置和移植工具--database configuration Assistant(DBCA)
(2)創建資料庫
(3)選擇一般用途
(4)資料庫標識,修改資料庫名
(5)管理選項,默認
(6)資料庫身份確認,使用統一管理口令
(7)資料庫所在位置,默認即可
(8)恢復配置,默認
(9)資料庫內容,可以勾選示例方案
(10)初始化參數,默認
(11)資料庫存儲,默認
(12)創建選項,點擊完成
(13)等待系統自己創建,完成後一樣設置一個Scott的賬號
此時設置完後,點擊退出就可以完成創建了。
注意:安裝中可能會出現的問題
問題一:使用Database Control配置資料庫時,要求在當前Oracle主目錄中配置監聽程序
必須運行Netca以配置監聽程序,然後才能繼續
解決方法:
打開cmd命令輸入:lsnrctl start
打開windows任務管理器——服務——找到OracleListener右擊點擊重新啟動,然後再創建新的資料庫
問題二:ORACLE 11g 創建資料庫時 Enterprise Manager配置失敗的解決辦法 無法打開OEM
在listener.ora中增加對ip地址的偵聽,具體步驟如下
啟動Net Manager,在「監聽程序」--Listener下添加一個地址,主機名寫計算機名字或者ip,埠號還是1521,然後保存
重啟監聽服務
重新配置監聽程序:net configuration--監聽程序配置--重新配置--
檢驗資料庫是否安裝成功:
1.查看伺服器是否啟動
#查看oracle win+r services.msc
2.使用sqlplus登錄資料庫
win+r----cmd----sqlplus sys/Test1234 as sysdba
登錄:
sqlplus 用戶/密碼
注意:
如果用戶是sys,需要加上 as sysdba,格式:sqlplus 用戶/密碼 as sysdba
查看當前數據實例名:
show parameter instance_name; show parameter db_name;
3.登錄oem數據管理系統
打開瀏覽器---輸入oem網址
如果用戶名是sys,那麼連接身份選擇sysdba
創建的每一個資料庫都有一個對應的oem網址,不同的oem網址區別在埠號不一樣
如果忘記了oem網址:安裝文件中有保存地址
例如:D:oracleproduct11.2.0dbhome_1install
在這個路徑下,portlist文件和readme文件都可以找到
4.區域網訪問
(1)打開net manager -- 連接資料庫
(2)打開本地的服務命名,點擊左邊的+號
(3)填寫服務名(這個自己定義的)
(4)網路協議:tcp/ip協議
(5)協議設置:填寫要訪問的IP地址
(6)填寫要訪問的資料庫名(服務名)
(7)進行連接測試
(8)測試完成後點擊完成,就會在列表中看到對應的連接
如果是訪問不同的資料庫,在登錄的時候要在後面加上@服務名(資料庫名字)
訪問資料庫格式:sqlplus 用戶名/密碼@服務名
1.數據(data)
2.資料庫(database DB)
3.資料庫管理系統(database manager system DBMS)
4.資料庫系統(database system DBS)
5.數據模型
(1)概念模型
實體-聯繫模型(E-R)
(2)邏輯模型
是具體DBMS所支持的數據模型,任何一個DBMS都基於某種邏輯模型
1)層次模型
最早期資料庫使用的數據模型,就是一個「有向樹」。最典型的層次模型是組織結構
2)網狀模型
層次模型的擴展
3)關係模型
二維表
4)面向對象模型
面向對象模型是一種新興的數據模型,它採用面向對象的方法來設計資料庫。面向對象的資料庫存儲對象是以對象為單位,每個對象包含對象的屬性和方法,具有類和繼承等特點。
(3)物理模型
數據在存儲介質上的組織結構,物理和操作系統,計算機的硬體。。有關
每種邏輯模型都會有對應的物理模型進行存儲
6.關係資料庫
數據模型使用關係模型作為邏輯數據模型,目前使用最廣泛的資料庫
關係資料庫的組織結構是:二維表
表(table):也叫做關係,由表明,行,列組成。
在一個資料庫中,表一是唯一。
列(field):也叫做欄位,屬性。
在同一個表中,欄位名不能重複,在不同的表中,欄位名可以重複
在同一列,數據類型相同
行(row):也叫做元組(tuple),記錄(record)。一行代表一條數據,行中的每一個欄位的代表的是對象的屬性。
主鍵:能夠唯一確定一條數據的屬性,只能有一個
候選鍵:如果表格中有多個屬性能夠唯一確定一個元組,這些屬性都叫做候選鍵
外鍵:表中的一個屬性不是當前表的主鍵,是另外一個表的主鍵
7.資料庫設計
(1)需求分析
(2)設計概念模型
E-R圖
(3)設計邏輯模型
關係模型
E-R圖-----關係模型
(4)物理模型
邏輯模型對應的物理模型
(5)資料庫執行
(6)資料庫維護
如何把E-R圖轉換成關係模型:
E-R:
實體:entity
屬性:Attribute
聯繫:relation
關係模型:
行
欄位
實體:
實體轉換成關係(table),屬性轉換成欄位(列)
聯繫:
轉換成關係:關係的屬性是與聯繫相連的各個實體的主鍵以及聯繫本身的屬性
一對一(1:1):可以轉換成一個關係,也可以與聯繫相連的任意一端合併。
一對多(1:N):可以轉換成一個關係,也可以與N端的實體合併
多對多(M:N):只能單獨轉換成一個關係
例子:
二維圖:
1.oem地址:
D:oracleproduct11.2.0dbhome_1install eadme.txt
https://localhost:1158/em
登錄的時候,如果使用sys用戶登錄,連接身份選擇「sysdba」
2.創建表空間
用來存儲資料庫對象(表,用戶,索引。。。)。如果想要正常使用資料庫,一定要創建表空間。
伺服器---表空間(存儲)--創建--表空間名字--添加
文件名:表空間名.dbf
數據文件滿後自動擴展:勾選
繼續--確定
3.創建用戶
表空間創建好以後,只有sys和system用戶可以訪問,一般會創建一些普通用戶來操作資料庫
伺服器--用戶(安全性)--創建
名稱:用戶名
口令:密碼
默認表空間:自己創建的表空間
臨時表空間:temp
狀態:未鎖定
用戶創建好以後,需要賦予角色(每個角色會有不同的許可權)
給新用戶賦予角色:
一般用戶賦予:connect,resource
角色--編輯列表--移動resource到所選角色--確定
管理選項不要勾選
每個角色都用對應的許可權:
如何查看角色有哪些許可權:
伺服器--角色--點擊角色查看對應的許可權
給用戶添加單個許可權:
選中用戶--系統許可權--編輯列表--確定
在現實使用中,會創建一個新角色,然後把需要的許可權都添加都新的角色中,然後創建的新用戶知己賦予新的角色
如何創新角色:
伺服器--角色--創建--系統許可權--編輯列表--選擇需要的許可權--確定
4.創建表
方案--表--創建--
5.添加約束
主鍵約束:
不能為空,不能重複
候選鍵約束
不能重複,可以為空
外鍵約束:
外鍵對應的表格一定要存在
外鍵的值來源於關聯表格的主鍵值
刪除外鍵的時候,先要刪除關聯表格中主鍵對應的值
檢查約束:
sex 比如:姓名(『男』或者『女』)
address: (武漢,北京,上海,廣州)
sex in (男』,女)
address in (武漢,北京,上海)
非空:
not null
sql(structured query language):結構化查詢語言
1.數據定義語言(DDL)
操作資料庫對象:表,索引。。。
create:創建
alter:添加
drop:刪除
2.數據操縱語言(DML)
操作數據
(1)insert:添加
(2)delete:刪除
(3)update:修改
(4)select:查詢 數據查詢(DQL )
3.數據控制語言(DCL)
操作許可權
grant
revoke
============================================
1.數據定義
[ ]:可選
(1)創建表:
create table 表名(
欄位1 數據類型 [約束],
欄位2 數據類型 [約束],
....
欄位n 數據類型 [約束]
);
create table student( sid varchar2(10), sname varchar(10), ssex varchar2(5), sage int, sphone varchar2(12), primary key(sid), constraint ck_student_ssex check(ssex in (男,女)) ); create table course( cid varchar2(10), cname varchar2(20), chour int, tname varchar2(10), primary key(cid) ); create table score( scid int, sid varchar2(10), cid varchar2(10), grade int, primary key(scid), foreign key(sid) references student(sid), foreign key(cid) references course(cid) );
創建完成以後查詢表結構:desc 表名
(2)刪除表
drop table 表名;
(3)修改表
alter table 表名 modify 欄位 數據類型 #修改數據類型
alter table 表名 change 舊欄位名 新欄位名 數據類型 [約束]
(4)添加約束
主鍵:
欄位n 數據類型 [約束],
primary key(欄位)
候選鍵
unique(欄位)
外鍵
foreign key(本表欄位) references 關聯表(主鍵)
alter table 表名 add primary key(欄位);
alter table score add primary key(scid);
外鍵:
alter table 表名 add [constraint 外鍵名] foreign key(本表欄位) references 關聯表(主鍵);
alter table score add constraint fK_score_sid foreign key(sid) references student(sid); alter table score add constraint fK_score_cid foreign key(cid) references course(cid);
(5)刪除約束
alter table 表名 drop primary key;
alter table score drop primary key;
alter table 表名 drop constraint 外鍵名;
alter table score drop constraint fk_score_sid; alter table score drop constraint fk_score_cid;
(6)添加check約束
constraint 約束名 check(約束內容)
alter table 表名 add constraint 約束名 check(約束條件);
alter table student add constraint ck_student_ssex check(ssex in(男,女)); alter table student add (constraint sage check(sage>18 and sage<36));
2.數據操縱
(1)添加:insert
添加所有欄位
insert into 表名 values(值1,值2...);
insert into student values(110,小明,男,12,123456)
添加某些欄位
insert into 表名(欄位1,欄位2...) values(值1,值2...)
insert into student(sid,sname) values(111,小紅);
(2)修改:update
update 表名 set 欄位=值,欄位=值...
update student set ssex=女, sage=15,sphone=11111;
注意:
如果沒有加過濾條件,修改的是表中所有的數據
update student set ssex=男,sage=12,sphone=123456 where sid=110;
(3)刪除:delete
delete from 表名
delete from student
如果沒有加過濾條件,刪除的表中所有的數據
delete from student where sid=111;
3.數據查詢:select
select 欄位列表
from 表名
where 條件
group by ... having....
order by ...
(1)欄位列表就是要查詢的內容
如果要查詢所有欄位,可以用 *
select * from student;
select sname from student;
可以給欄位列表去別名: 欄位名 [as] 別名
select sname as 姓名,ssex 性別 from student;
(2)from:數據來源
(3)where :查詢條件
查詢條件:
①比較
②範圍
③集合
④字元匹配
⑤非空
⑥and or
比較:
>
<
>=
<=
=
<>
查詢年齡大於30歲的
select * from student where sage>30;
範圍:between
between A and B
select * from student where sage between 20 and 30;
集合:in
字元匹配:like
通配符:% _
非空:
is not null
空:
is null
and/or:範圍
20---30
sage>=20 and sage<=30
(4)order by:排序
asc(默認) 升序 1 2 3
desc 降序 3 2 1
(5)group by分組聚合查詢
聚合函數:
count():求總個數
sum():求總和
max():最大值
min():最小值
avg():平均值
having:
對分組查詢後的結果進行過濾
select * from student; -- 查詢年齡大於30歲的 select * from student where sage>30; -- 查詢性別為男的 select * from student where ssex=M; -- 查詢年齡在20-30之間的 select * from student where sage between 20 and 25; -- 地址在北京/上海/武漢的人 select * from student where saddress in(北京,上海,武漢); -- 查詢姓名以金開頭的人 select * from student where sname like 金%; -- 查詢姓名以文結尾的人 select * from student where sname like %文; -- 查詢姓名中包含文的人 select * from student where sname like %文%; -- 年齡不為空的人 select * from student where sage is null; -- 查詢年齡在20-30之間的 select * from student where sage>=20 and sage<=30; -- 按年齡排序 select * from student order by sage desc; -- 在score表中,按課程分類查詢,查每門課程報考的人數 select cid,count(*) from score group by cid; -- 在score表中,按課程分類查詢,查每門課程的總成績 select cid,sum(grade) from score group by cid; -- 在score表中,按課程分類查詢,查每門課程的平均成績 select cid,avg(grade) from score group by cid; -- 在score表中,按課程分類查詢,查每門課程成績最高的人 select cid,max(grade) from score group by cid; -- 在score表中,按課程分類查詢,查每門課程的平均成績,平均成績要>80 select cid,avg(grade) from score group by cid having avg(grade)>80;
4.多表查詢
(1)內連接
inner join
格式一:
select 欄位
from 表名1 inner join 表名2 on 連接條件
inner join 表3 on 連接條件
格式二:
from 表名1 , 表名2
where 連接條件 and 過濾條件
給表取別名:
表名 [as] 表別名
(2)外連接
左外連接(左連接)
left join
格式:
from 表名1 left join 表名2 on 連接條件
left join 表3 on 連接條件
右外連接(右連接)
right join
from 表名1 right join 表名2 on 連接條件
right join 表3 on 連接條件
(3)聯合查詢 union
select 語句
union
;
--查詢學生的id,姓名,課程名,成績 select a.sid as 學號,a.sname 姓名,c.cname 課程名,b.grade 成績 from student a inner join score b on a.sid=b.sid inner join course c on c.cid=b.cid;
select a.sid 學號,a.sname 姓名,c.cname 課程名,b.grade 成績 from student a left join score b on a.sid=b.sid left join course c on c.cid=b.cid order by a.sname,b.grade ;
--聯合查詢 select * from STUDENT where ssex=M union select * from STUDENT where ssex=F;
5.子查詢(嵌套查詢)
一個查詢語句A中嵌套另外一個查詢語句B,查詢語句A叫做父查詢(外層查詢),查詢語句B叫做子查詢(內層查詢).
執行原理:
先執行子查詢,得到查詢結果
再執行父查詢,把子查詢的結果作為父查詢的過濾條件
格式:
select 欄位 from 表名
where 子查詢
(1)in關鍵字的子查詢
(2)帶比較運算符的子查詢
子查詢結果一定是一個值,如果結果是一個範圍,需要配合any/some/all
any/some:和範圍中的值進行比較,只要有一個成立,返回結果
all:和範圍中的每個值比較,都成立,才返回結果
12>any(11,15,30) 滿足任意條件即可
31>all(11,15,30) 需要滿足所有的條件
(3)exists子查詢
where exists 子查詢
原理:
先進行子查詢,如果子查詢有結果,那麼exists子句結果為true,再進行父查詢
如果子查詢沒有結果,那麼exists子句,結果為false,不進行父查詢
子查詢的欄位沒有意義: 只需要知道子查詢能否查出內容,不需要管查的是什麼內容
select * from student; --1.帶in關鍵字的子查詢 -- 在學生表中查詢和王五,陳文,張璐在同一個城市的人 --先要查詢王五,陳文.夏曉燕所在城市 select saddress from student where sname=王五 or sname=陳文 or sname=夏曉燕 --學生中和他們在同一個城市的人 學生的地址在子查詢的範圍內 select * from student where saddress in (select saddress from student where sname=王五 or sname=陳文 or sname=夏曉燕); --2.帶比較運算符的子查詢 -- (1)和王五性別相同的人 -- 子查詢:查詢王五的性別 select ssex from student where sname=王五 --父查詢中:讓學生的性別=王五的性別 select * from student where ssex=(select ssex from student where sname=王五) --(2)年齡比夏曉燕大的學生 --子查詢:查詢夏曉燕的年齡 select sage from student where sname=夏曉燕 --父查詢:查詢年齡比夏曉燕大的學生 select * from student where sage>(select sage from student where sname=夏曉燕)
--some/any/all select * from student where sage>all(23,30) select * from student where sage>any(23,30)
--帶exists的子查詢 --查詢score中的數據,但是score中age值必須在student表中 select * from score where exists (select * from student where student.sage=score.age)
綜合練習:
員工表(emp): ( empno NUMBER(4)notnull, --員工編號,表示唯一 ename VARCHAR2(10), --員工姓名 job VARCHAR2(9), --員工工作職位 mgr NUMBER(4), --員工上級領導編號 hiredate DATE, --員工入職日期 sal NUMBER(7,2), --員工薪水 comm NUMBER(7,2), --員工獎金 deptno NUMBER(2) —員工部門編號 )
部門表(dept) ( deptno NUMBER(2),notnull, --部門編號 dname VARCHAR2(14), --部門名稱 loc VARCHAR2(13) --部門地址 )
1.找出獎金高於薪水60%的員工信息。 2.找出部門10中所有經理(MANAGER)和部門20中所有辦事員(CLERK)的詳細資料。 3.統計各部門的薪水總和。 4.找出部門10中所有經理理(MANAGER),和部門20中所有辦事員(CLERK),和既不是經理又不是辦事員但其薪水大於或等2000的所有員工的詳細資料。 5.列出各種工作的最低工資。 6.列出各個部門的MANAGER(經理)的最低薪水。 7.找出收取獎金的員工的不同工作。 8.找出不收取獎金或收取的獎金小於等於300的員工。 9.找出在1981年入職的所有員工。 10.顯示所有員工的姓名,首字母大寫。 11.顯示正好為5個字元的員工的姓名。 12.顯示不帶有「R」的員工姓名。 13.列出 員工編號、員工姓名、管理者姓名、部門名、部門地址,並按照部門名、員工名升序輸出。 14.列出emp表中最低工資小於2000的部門中,job為『CLERK』的員工的部門號、最高工資、最低工資 按部門號降序排列。 15.查詢 部門地址不在DALLAS並且薪水大於部門平均薪水的員工姓名、部門名稱、薪水 按薪水降序排列
參考:
--1.找出獎金高於薪水60%的員工信息。 select * from emp where comm>sal*0.6;
--2.找出部門10中所有經理(MANAGER)和部門20中所有辦事員(CLERK)的詳細資料。 select * from emp where (deptno=10 and job=經理) or (deptno=20 and job=辦事員) order by deptno;
--3.統計各部門的薪水總和。 select deptno, sum(sal) from emp group by deptno;
/*4. 找出部門10中所有經理理(MANAGER),和部門20中所有辦事員(CLERK), 和既不是經理又不是辦事員但其薪水大於或等2000的所有員工的詳細資料。 */ select * from emp where (deptno=10 and job=經理) or (deptno=20 and job=辦事員) or (job not in(辦事員,經理) and sal>2000) order by job;
--5.列出各種工作的最低工資。 select job,min(sal) from emp group by job;
--6.列出各個部門的MANAGER(經理)的最低薪水。 --找出每個部門的最低工資,這個人必須是經理 select e.deptno,min(sal) from emp e where e.job=經理 group by e.deptno ;
--7.找出收取獎金的員工的不同工作。//有獎金的工作有哪些? select distinct job from emp where comm is not null; --查詢出有獎金的員工? select * from emp where comm is not null and job=員工;
--8.找出不收取獎金或收取的獎金小於等於300的員工。 select * from emp where comm is null or comm<300;
--9.找出在2018年入職的所有員工。 select * from emp where to_char(hiredate,YYYY-MM-DD HH24:MI:SS) like 2018%
select * from emp where hiredate >to_date(2018-01-01 00:00:00,YYYY-MM-DD HH24:MI:SS) and hiredate < to_date(2019-01-01 00:00:00,YYYY-MM-DD HH24:MI:SS);
--10.顯示所有員工的姓名,首字母大寫。 select upper(ename) from emp; select lower(ename) from emp; select initcap(ename) from emp;
--11.顯示正好為5個字元的員工的姓名。 select ename from emp where length(ename) =5;
--12.顯示不帶有「小」的員工姓名。 select ename from emp where ename not like %小%
--13.列出 員工編號、員工姓名、部門名、部門地址,並按照部門名、員工名升序輸出。 select e.empno 員工編號,e.ename 員工姓名,d.dname 部門名,d.loc 部門地址 from emp e left join dept d on e.deptno=d.deptno order by d.dname,e.ename;
--14.列出emp表中最低工資小於2000的部門中,job為『辦事員』的員工的部門號、最高工資、最低工資 按部門號降序排列。 --先找出最低工資小於2000的部門 select deptno from emp group by deptno having min(sal)<2000 --然後在查詢job為辦事員的員工中找出最高工資、最低工資並且辦事員要在工資小於2000的部門中 select deptno, max(sal),min(sal) from emp where job=辦事員 and deptno in(select deptno from emp group by deptno having min(sal)<2000) group by deptno order by deptno desc;
--15.查詢 部門地址不在武漢並且薪水大於部門平均薪水的員工姓名、部門名稱、薪水 按薪水降序排列 --查出部門的平均薪水 select e.ename,d.deptno,d.dname,e.sal,d.loc from emp e left join dept d on e.deptno=d.deptno where d.loc <>武漢 and sal>(select avg(sal) from emp where emp.deptno=e.deptno group by deptno)
By:談老弟的軟測之路