每一個知識點的掌握程度:
1,重點:表示須要掌握,會寫出來
2,理解:改代碼
3,瞭解:不須要掌握
一個好的技術只能決定你的開始,而不能決定你的之後。
一個好的職場人員:技術,項目管理,CMM,心理學,會計,金融。
對於如今的軟件開發,最重要的是構建商用體系,無紙化辦公,OA,ERP,CRM
ruby
編程習慣:必定要有良好的編程習慣
1,oracle簡介
oracle是如今全世界最大的數據庫提供商,編程語言提供商,應用軟件提供商
oracle由Ellison創辦
oracle 8i/9i/10i i:internet覺得着oracle開始向網絡發展
oracle 10g/11g g表明網絡計算
2,oracle安裝(重點)
1,關閉防火牆,斷開網絡
2,啓動安裝程序
3,選擇企業版
4,修改全局數據庫名:soukenan
5,選中 建立帶數據庫樣本的數據庫
若是沒有選中,就不會有大數據用戶出現
6,設置口令 oracle oracle
7,啓動安裝程序,自行安裝,不要進行任何操做
8,用戶介紹:oracle經常使用一下四個用戶:
在安裝完成以後設置
1,超級管理員 sys/change_on_install
2,普通管理員 system/manager
3,普通用戶 scott/tiger 默認是被鎖定的
4,大數據用戶 sh/sh
9,退出
注意:
10,把全部的oracle服務修改成手動啓動
11,重要的服務
監聽服務: 。。。Listener : 若是有程序要操做數據庫,或者是一些遠程的客戶端要鏈接數據庫
數據庫的實例服務 OracleServiceSID 全局數據庫名
3,oracle卸載步驟
1,直接運行卸載程序
2,刪除硬盤上的殘留文件
3,刪除註冊表中全部與oracle有關的配置項
4,監聽問題:
1,註冊表項被刪除(註冊表優化)
2,計算機名改變( 10g 和它之前的版本)
5,sqlplus
1,dos風格: sqlplus.exe
2,windows風格:sqlplusw.exe(能夠進行數據顯示的調整)
6,sqlplusw
select * from emp;
1.set linesize 300 設置沒行的字符數
2.set pagesize 30 設置每頁顯示的數據個數
select * from emp;
3,在sqlplusw中 方向鍵只能控制屏幕的移動,沒有辦法控制光標
4, ed a 建立a.sql來編輯sql
@a 執行a.sql
@d:\demo.txt 若是這個文件是demo.sql能夠這樣寫
@d:\demo === @d:demo
7,select * from tab ; 查看全部的表
8,show user 查看當前的登陸用戶
9,切換用戶
conn 用戶名/密碼 [as sysdba]
10,每一張表都與其屬於的用戶,因此代表完整是
用戶名 表名
11,select * from scott.emp ;
12,使用超級管理員能夠關閉數據庫
shutdown immediate;
這個時候,用戶沒法鏈接sqlplusw
此時能夠先用/nolog登錄,以後用管理員登錄,啓動數據庫
執行下列語句
C:>SQLPLUS /nolog
startup
13, 在sqlplusw中使用windows系統命令,須要在前面加上 host
host notepad;
14. 在scott用戶下四個表,查看錶結構
desc emp;
1,部門表 dept
deptno number(2) 兩位數字
dname varchar2(14)
loc varchar2(13)
2,僱員表 emp
empno number(4)
ename
job
mgr
hirdate
sal number(7,2) 基本工資
comm 獎金
deptno number(2)
3,工資等級表 salgrade
grade
losal
hisal
4,工資表bonus
ename
job
sal
comm
15,簡單查詢
select * from emp;
16,sql分類
dml 數據操做語言 用於檢索或者修改數據
ddl 數據定義語言 用戶修改數據的結構
dcl 數據控制語言 用戶定義數據庫用戶的權限
17.簡單查詢
select [distinct] * from emp [別名]
1,select emp.ename from emp;
2,select job from emp;
3.select distinct job from emp;
4,select ename,job,sal*12 from emp; (四則運算
5,select ename,job,sal*12 income from emp; 起別名
6,select ename,job,(sal+300)*12 income from emp; 使用()改變運算等級
7,字符鏈接
select eno || ename from emp;
select eno || ':' || ename from emp;
8,必定要記住:
別名上的內容不能用' 括起來,而只有select子句以後的內容才用 '括起來
18,限定查詢
1, select * from emp where sal>1500;
2, 在oracle中是區分大小寫的
select * from emp where job='clerk';
==>
select * from emp where job='CLERK';
3,
select * from emp where sal between 1500 and 3000;
==>
select * from emp where sal>=1500 and sal<=3000;
4,
select * from emp where (job='CLERK' or job='SALESMAN') and sal > 2000;
5, between and 還能夠限制日期範圍
6,查詢出全部領取獎金的員工
select * from emp where not comm is null
7,in操做
select * from emp where empno = 7369 or empno = 7766;
select * from emp where empno in (7369,7766);
8,關於 not in 和 in 問題
in 的範圍中有 null 沒有問題
not in 的範圍有null 不會返回任何結果 , not in 的範圍裏存在了 null 則表示就是查詢所有數據
9. like _匹配單個字符 % 匹配多個字符
select * from emp where ename like 'A%';
select * from emp where ename like '_A%';
select * from emp where ename like '%A%';
select * from emp where ename not like '%A%';
like不必定只能用在字符串上
select * from emp where hiredate like '%9%' or sal like '5%';
關於like子句的使用注意
like '%%' 查詢所有
19,數據的排序
數據默認按照編號排序: asc 正序:默認,不寫就是升序 desc 降序
1,select * from emp order by sal desc;
2,select * from emp order by sal asc;
3,select * from emp
order by sal , hirdate ;
單行函數
20,字符函數
1,
upper
lower
initcap 首字母大寫
length
replace
substr
2,
1,select upper('hello') from dual;
2,select lower('hello') from dual;
3,select initcap(ename) from emp;
4,select * from emp
where length(ename) = 5;
5,select replace(ename,'A','*') from emp;
6.select ename,substr(ename,3) from emp;
select ename,substr(ename,3,7) from emp;
設置負數,表示從後面截取
select ename,substr(ename,-3) from emp;
面試題:
請問substr函數截取的時候下標是從0仍是從1開始?
在oracle數據庫中,substr函數從0仍是1開始都是同樣的
21,數字函數
1,round (數字|列,[保留小數的位數]) 四捨五入
2,trunc (數字|列,[保留小數的位數]) 捨棄指定位置的內容
3,mod(數字1,數字2) 取餘數
例子:
1,select round(903.54) from dual;
2,select round(-903.54) from dual;
3,select round(903.54,-1) from dual;
4,select round(903.54,1) from dual;
5,select trunc(903.54) from dual;
6,select trunc(-903.54) from dual;
7,select trunc(903.54,-1) from dual;
8,select trunc(903.54,1) from dual;
9,select mod(10,3) from dual;
22,日期函數
1,如何取得當前日期
select sysdate from dual;
2, 日期+ 數字 表示多少天以後的日期
select sysdate+300 from emp;
日期-數字表示多少天以前的日期
select sysdate - 300 from emp;
日期-日期 表示兩個日期之間的天數 確定是大日期-小日期
select sysdate-hirdate from emp;
3, last_day (日期) 日期的月份的最後一天
select last_day(sysdate) from dual;
next_day(日期,星期數) 求出下一個指定星期X的日期
select next_day(sysdate,'星期一') from dual;
add_months(日期,數字) 求出若干月以後的日期
select add_months(sysdate,4) from dual;
months_between(日期1,日期2) 兩個日期經歷的月份
select months_between(sysdate,hirdate) from emp;
select trunc( months_between(sysdate,hirdate)) from emp;
23,轉換函數 核心
to_char to_date to_number
to_char
標記: yyyy年 mm月 dd日 hh時 hh24 24小時 mi分 ss秒
1,select to_char (sysdate,'yyyy mm dd') from dual;
2, select to_char(sysdate , 'yyyy') from dual;
3, select to_char(sysdate,'fmyyyy mm dd') from dual; fm用來去除o
4, select to_char(sysdate,'yyyy mm dd hh24:mi:ss');
s, select to_char(23424234234234,'L999,999,999,999,999') from dual;
L表示運行環境所在的地的貨幣單位
6,select to_date('2012-3-4','yyyy-mm-dd') from dual;
7, select to_number('1') from dual;
select to _number('1') + to_number('2') from dual;
select '1'+'2' from dual;
24,通用函數 核心
nvl
1,select (sal+comm) *12 from emp;
select (sal+nvl(comm))*12 from emp;
decode 多值判斷
1, select ename,
decode(job, 'CLERK','辦事員' ,'SALESMAN','銷售人員 ')
from emp;
25.大數據用戶主要是爲了作講解中的測試使用
26,多表查詢
1,查詢記錄數
select count(*) from emp;
2,select * from emp,dept;
3,select * from emp,dept where
emp.deptno = dept.deptno
select * from emp e,dept d where
e.deptno = d.deptno ;
這個查詢從根本上尚未消除笛卡兒積
這個會進行逐條進行比較
在大數據的時候這個效率會很是低
4,
select e.ename,e.job,l.empno
from emp e,emp l
where e.mgr = l.empno;
5, select e.empno,e.ename,e.sal,d.dname,s.grade
from emp e,dept d,sal s
where e.deptno = d.deptno and
e.sal >= s.losal and
e.sal <= s.hisal;
27,左右鏈接
1,select * from emp e,dept d
where e.deptno = d.deptno ;
+放在左邊表示是左鏈接
+放在右邊表示是右鏈接
28, SQL:1999語法
1,交叉鏈接(cross join) 用於產生笛卡兒積
select * from emp cross join dept;
2,天然鏈接 natural join 自動找到匹配的關聯字段,消除笛卡兒積
select * from emp natural join dept;
3,join -- using
select * from emp join dept using (deptno);
4,join -- on
select * from emp join dept on (emp.deptno = dept.deptno);
5, left outer join -- on 左鏈接
right outer join -- on 右鏈接
full outer join -- on 全鏈接 ,把兩張表中沒有的數據所有顯示
29,統計函數和分組查詢
1,count
2,avg
3,sum
4,max
5,min
select count(empno),sum(sal),avg(sal) from emp;
select max(sal),min(sal) from emp;
若是一個空表:count返回0
其餘分組函數返回null,沒有記錄
分組查詢
當有數據有重複的時候分組纔有意義
1,
select max(sal),deptno from emp group by deptno;
各個語句的順序
select
from
where
group by
order by
2,平均工資最高的工資
select max(avg(sal)) from emp group by job;
3,多字段分組
select d.deptno,d.dname,count(e.empno),nvl(avg(e.sal))
from dept d,emp e
where d.deptno = e.deptno(+)
group by d.dname,d.deptno;
4,having 放在group by以後 和where不一樣的是 having子句中可使用分組函數
select d.deptno,d.dname,count(e.empno),nvl(avg(e.sal),0)
from dept d,emp e
where d.deptno = e.deptno(+)
group by d.dname,d.deptno
having avg (e.sal) > 2000;
30,子查詢 能夠替代多表查詢
通常出如今where和from子句中
1,select * from emp where sal >
( select sal from emp where ename = 'SMITH' ) ;
2,where 返回單行多列的狀況
select * from emp
where ( job,sal ) = (
select job,sal from emp where ename = 'ALLEN'
);
3,where 中 子查詢返回多行單列的狀況 in ( not in 在子查詢中,若是有一個null 不會返回任何結果)
select * from emp
where sal in(
select sal from emp where job = 'MANAGER'
);
any操做 任意一個匹配上便可
select * from emp
where sal = any(
select sal from emp where job = 'MANAGER'
);
select * from emp
where sal > any(
select sal from emp where job = 'MANAGER'
); 比子查詢中返回的最小的大
select * from emp
where sal < any(
select sal from emp where job = 'MANAGER'
); 比子查詢中返回記錄的最大的小
select * from emp
where sal > all(
select sal from emp where job = 'MANAGER'
);
select * from emp
where sal < all(
select sal from emp where job = 'MANAGER'
);
4,出如今from中:
多表查詢
select d.deptno,d.dname,count(e.empno),avg(e.sal)
from emp e,dept d
where e.deptno(+) = d.deptno
group by d.deptno,d.dname;
子查詢:效率更高
select d.deptno,d.dname,cempno,asal from(
select deptno,count(e.empno) cempno,avg(e.sal) asal
from emp e group by e.deptno
) temp,dept d where temp.deptno(+) = d.deptno;
31,數據的更新操做 update insert delete
複製數據庫表
create table myemp as select * from emp;
1,.insert into myemp
(empno,ename,hiredate)
values (2323,'kenan',sysdate);
2, update myemp set ename = 'lele' where empno = 2323;
3,數據刪除
delete from myemp where empno = 2323 ;
32,事務處理
全部的事務處理操做對應一個session
rollback 事務回滾
commit 提交事務
某一個session在更新數據庫表的時候,這個表處於鎖定狀態
其餘session是沒法更新的,必須等待以前的session提交後才能夠。
寫完sql 必需要提交 ,不然不會提交到數據庫
33,數據僞列
數據僞列指的是不須要用戶處理,oracle自定維護的數據列
rownum,rowid
1,select rownum,empno,ename from emp;
rownum:行號
2, 查詢 6-10條數據 來用來子查詢
select * from
(
select rownum rn,empno,ename from emp where rownum <=10
)where rn>=6;
以來上面能夠實現分頁
34,rowid 瞭解:表示每一行數據保存的物理地址的編號
select rowid,empno,ename from emp;
rowid不會重複
35,面試題:刪除數據庫表中重複的記錄 dept
select min(rowid)
from dept group by dname,loc
以上數據是不能刪除的
delete from dept
where rowid not in (
select min(rowid)
from dept group by dname,loc);
36,練習題
列出至少有一個員工的全部部門的編號,名稱
並統計出這些部門的平均工資,最低工資和最高工資
select d.deptno,d.dname,temp.avgsal,temp.maxsal,temp.minsal
from dept d,(
select deptno,avg(sal) avgsal,max(sal) maxsal,min(sal) minsal
from emp group by deptno) temp
where d.deptno = temp.deptno;
列出薪金比SMITH 或 ALLEN多的員工的編號姓名,部門名稱,其領導姓名
select e.empno,e.ename,d.dname,m.ename
from emp e ,dept d,emp m
where e.sal > all (
select sal
from emp
where ename in ('SMITH','ALLEN'))
and e.deptno = d.deptno
and e.mgr = m.empno;
select e.empno,e.ename,d.dname,m.ename
from emp e join dept d on (e.deptno = d.deptno) join emp m on( e.mgr = m.empno )
where e.sal > all (
select sal
from emp
where ename in ('SMITH','ALLEN'));
列出全部員工的編號,姓名及其直接上級的編號姓名,顯示結果按照領導的年工資的降序排列
select e.empno,e.ename,m.empno,m.ename,(m.sal+nvl(m.comm,0))*12
from emp e,emp m
where e.mgr = m.empno
order by (m.sal+nvl(m.comm,0))*12 desc;
37,
經常使用的數據字段
字符串 varchar2(n)
數字 number(n)
小數 number(n,m)
日期 date
大文本 CLOB 能夠存儲海量文字(4G)
大對象 BLOB 存放二進制數據
38,建立表
create table table_name(
column type default_value,
column type default_value,
column type default_value
);
create table member(
name varchar2(50),
age number(3),
birthday date default sysdate,
content clob
);
insert into member values('kenan',3,sysdate,'kekekekekek');
39表的複製:僅oracle支持如下語法 瞭解
create table copy_table_name as child_select;
create table emp20 as select * from emp where deptno = 20;
create table emp20 as select * from emp where 1 = 2 ;
40,表的重命名:oracle支持如下語法 瞭解
rename emp20 to emp30;
41,刪除表數據能夠進行數據的回滾
若是但願完全清空表示表數據,沒法回滾
truncate table emp30;
42,表的刪除
drop table emp30;
表刪除後,會進入一個回收站中(閃回技術)
查看回收站
show recyclebin;
恢復表
flashback table emp30 to before drop;
刪除回收站中的數據
purge table emp30;
purge recyclebin; 清空回收站
若是但願刪除不進入回收站
deop table table_name purge;
43,修改表結構
create table member(
mid number,
name varchar(45)
);
alter table member add(
age number default 0); //有默認值的話會爲全部的已有列設置默認
alter table member modify(
name varchar2(2));
世界上性能最高的數據庫是 IMB DB2 有一個平臺的限制
跨平臺的數據庫 oracle性能最高
在 IMB DB2數據庫之中時不容許修改表結構的
44,約束:保證表中的數據的合法性
非空約束 not null
檢查約束
外鍵約束
1, create table temp(
id number not null);
2,惟一約束
create table temp(
email varchar(34) unique;
);
3,主鍵約束
create table temp(
id number(3)primary key
);
4,檢查約束check CK
create table temp(
name varchar2(43),
age number(3),
constraint ck_temp_age check(age between 1 and 20),
constraint ck_temp_name check(name in ('kenan','na'))
);
45,外鍵約束
drop table member purge ;
drop table book purge ;
create table member(
id number primary key,
name varchar2(34)
);
create table book(
id number primary key,
mid number,
title varchar2(20),
constraint fk_book_member foreign key (mid) references member(id)
on delete cascade
);
1,外鍵約束 級聯刪除 ondelete cascade
2,刪除數據的時候,將相關的子記錄設爲null
on delete set null
3,不關心字表是否存在,直接強制刪除父表
drop table member cascade constraint purge;
4,合理作法:
先刪除字表,而後刪除父表
5,修改約束 用 alter指令
alter table table_name add constraint 約束名 約束類型
alter table table_name drop constraint 約束名
46,查詢約束
oracle全部的對象保存在數據字典中,
而約束也是同樣保存在數據字典中。
1, select* from user_constraints;
ower: 全部者 查詢約束
2,查詢約束對應的字段
select * from user_cons_columns;
3,格式化顯示的列的長度 col ower(列) for A14;
47,集合操做
union 相同的部分不顯示
create table emp20 as select * from emp where deptno = 20;
select * from emp
union
select * from emp20;
union all 相同的部分顯示
select * from emp
union all
select * from emp20;
intersect 返回相同的部分
select * from emp
intersect
select * from emp20;
minus 返回不一樣部分 減去
select * from emp
minus
select * from emp20;
48,序列:自動增加列
1,建立序列
create sequence myseq;
2,select myseq.nextval from dual;
select myseq.currval from dual;
3,使用序列
insert into temp values(myseq.nextval);
49,視圖
1,建立視圖
create[ or replace ] view view_name
as 子查詢;
2,查詢視圖
select * from view_name;
3, 建立視圖的其餘選項
1,with check option
限制修改視圖條件
2,with read only
限制修改視圖
50,同義詞 瞭解
select sysdate from dual;
通過查詢dual表格屬於 sys
爲何在 scott中能夠直接訪問 dual
這個是由於同義詞
create synonym myemp for scott.emp;
conn sys/change_on_install as sysdba;
create public synonym myemp for scott.emp;
51, 索引 理解 dba
select * from emp where sal > 1500 ;
這裏採用的是逐行判斷的方式
在oracle建立索引有如下兩種方式:
1,主鍵約束
2,手工建立
create index emp_sal on emp(sal);
若是這個字段須要常常更新的話,那麼這個索引也要所有更改,反而下降的性能
因此索引通常創建在不常常修改的列中
52,用戶管理 瞭解 dba的工做 dcl
grant 受權 revoke 回收
1,建立用戶
conn sys/change_on_install as sysdba;
create user dog identified by wangwang;
這個用戶並不能登錄,沒有登錄權限,沒有建立session的權限
2,受權
grant create session to dog;
3,登錄 dog/wangwang
4,沒有建立表和序列的權限
在oracle中 表空間保存在硬盤上,表數據保存在表空間上
5, grant create table to dog;
//這裏給了建立表的權限,並無操做表空間的權限,因此依然沒法建立表
爲了解決用戶的受權操做,在oracle之中提供了許多的角色,每個角色包含多個權限,而角色主要有兩個: connect resource
6,受權
grant connect,resource to dog;
7,修改用戶的密碼
conn sys/change_on_install;
alter user dog identified by miaomiao;
管理員能夠是密碼失效,讓用戶登錄的時候,修改密碼:
alter user dog password expire;
鎖定用戶
alter user dog account lock;
解鎖
alter user dog account unlock;
8,select * from scott.emp;
這個新人沒法訪問別人的表
9, 受權其餘用戶表的操做權限
grant select on scott.emp to dog;
10,回收權限
revoke select on scott.emp from dog;
invoke connect,resource,create table,create session from dog;
11,刪除用戶
drop user dog cascade;
53,數據庫的備份
數據庫的導入和導出
1,數據的導出
1,exp
2,輸入用戶名和密碼
3,回車
2,數據的導入
1,進入備份文件所在文件夾
2,imp
3,輸入用戶名和密碼
4,回車
可是以上的狀況適合於數據小的狀況
54,數據的冷備份
在數據操做之中,有可能用戶不會進行事務的提交,
那麼這種狀況下沒法進行完整的備份操做,而所謂的冷備份
指的就是在關閉數據庫實例的狀況下進行的數據備份操做的實現
若是要進行冷備份,則須要備份數據庫中的一些幾個核心內容:
1,控制文件:數據庫的實例服務的核心文件,經過 v$controlfile 找到
2,重作日誌文件,能夠進行數據的災難性回覆,經過 v$logfile 找到
3,數據文件,表空間文件 經過 v$datafile 和 v$tablespace 找到
4,核心操做的配置文件 pfile 經過 show parameter pfile 找到
從實際的oracle的部署來說,全部的文件爲了達到io的平衡操做,要分別保存在不一樣的硬盤上
查找文件
1,使用sys登錄
2, 查找全部的控制文件目錄
select * from v$controlfile;
3,備份重作日誌文件
select * from v$logfile;
4,查找表空間文件
select * from v$tablespace;
select * from v$datafile;
5,找到pfile文件
show parameter pfile;
6, 關閉數據庫實例
shutdown immediate;
7,將全部查找到的數據庫備份到磁盤上
8, 啓動數據實例
startup
55,數據庫設計範式:可讓數據表更好的進行數據的保存,指的是數據庫的設計原則。
56,第一範式:
數據庫表中的數據列不可再分:
所謂的不可分割就是全部的數據類型都使用數據庫提供的數據類型
57,第二範式:
數據表的非關鍵字段對任一候選關鍵字段的部分函數依賴
兩種方式理解:
1,列之間不存在函數關係
sal number,yearsal number
2,多對多關係設計,避免列重複,使用中間表實現
58,第三範式:
用的是一對多的實現,避免列重複
59,power Designer
1,創建數據庫表結構
使用物理數據模型
2,生成數據庫的建立腳本
Ctrl+G Database-->Database Generation
3,如何從數據庫中倒入表結構
配置數據源
1, 管理工具--〉數據源
2,系統dsn
3,添加oracle
倒入數據庫數據
4,power designer
-->File
-->Reverse Engineer
-->Database
面試