oracle詳解


Oracle 數據庫管理系統

1. 數據庫簡介

數據倉庫,數據管理軟。Oracle通過用戶的不同權限管理數據庫
優點:
支持數據類型
文件儲存安全
支持多用戶訪問
支持數據量大
服務:(以實例orcl)
OracleServiceOrcl Oracle核心服務
OracleORCLTNSLinstener Oracle接受外部訪問的服務
Oracle常用客戶端:
①SQL PLUS
②iSQL PLUS (http://localhost:1158/em)
③第三方客戶端 例如:PLSQL 、Navicat

2. sql – 簡單查詢、去重、排序、條件查詢

Structure Query Language
①. 簡單查詢
名詞:表(Table), 字段(Column), 行(Row), 主鍵(Primary key), 用戶(Account)
語法:select 列名1,列名2,… from 表;

a, 查詢部分列:
select 字段1,字段2 from 表;

b, 查詢所有列:
select 字段1,… 字段n from 表; (實際開發應用,可讀性好)
select * from 表;

c, 查詢結果的字段重命名(別名)
select 列名1 as 別名1,列名2 as 別名2 from 表;

d, 對查詢結果進行字符串拼接(‘||’)
select first_name || ‘·’ || last_name from employees;

e, 對查詢的結果做算術運算(+ - * /)
select salary * 10 from employees;

f, 增加篩選條件
select salary form employees where employee_id = 100;
②. 去重
select distinct 列名 from 表;
③. 排序
select * from 表 order by 字段1 asc/desc,字段2 asc/desc; (先對字段1排序,如果相同,再對字段2排序)
④. 條件查詢
a, 等值查詢
select * form employees where salary = 7000;

b, 多條件查詢
	select * form employees where employee_id = 100 and salary = 7000;
	select * form employees where salary = 2300 or salary = 7000;

c, 不等值查詢(邏輯判斷:>  <  >=  <=  <>不等於  !=不等於)
	select * from employees where salary > 1000;		

d, 區間查詢( 閉區間 [臨近小值, 臨近大值] )
	select * from employees where salary >= 1000 and salary <= 10000;
	select * from employees where salary between 1000 and 10000;

e, is null 、is not null
	select * form employees where commission_pct is null;

select * form employees where commission_pct is not null;

f, 枚舉查詢(in)
	select * from employees where employee_id in(100, 103, 104);
	也可以用or語句
g, 模糊查詢 (like 、 not like ) 、(‘_’占位符, ‘%’通配符)
	select * from employees where first_name is not like ‘%L%’; (名字不含L)

select * from employees where first_name is like ‘_ _ _ _%’; (名字長度至少是4)

3. sql – dual、sysdate、systimestamp、單行(組)函數、sql書寫(執行)順序

①. 特殊關鍵字dual、sysdate、systimestamp
dual:虛表,一行一列的表
1.站在數據的角度,無意義
2.作用是維護sql語句的完整性

	例如:
	select 1000*1000 from dual;

sysdate: 當前系統時間(年 月 日 時 分 秒)
	select sysdate from dual;
systimestamp: 時間戳,也是當前系統時間 (年 月 日 時 分 秒 毫秒)
	select systimestamp form dual;

②. 函數-單行函數
對查詢的每條數據進行一條函數的處理

常用:
	to_char( 被轉化的日期,’日期格式關鍵詞’); 			將日期轉化為字符串
	to_date( ‘被轉化的日期字符串’,’日期格式關鍵詞’);	將字符串轉化為日期

日期格式關鍵詞:yyyy(年),mm(月),dd(日),hh24(時,24小時制),mi(分),ss(秒),day(星期)

用法:
	select to_char(sysdate, ‘yyyy-mm-dd’) from dual; 		查詢日期轉化為日期字符串:年 月 日
	select to_date(‘2001-3-23’, ‘yyyy-mm-dd’) from dual;  	將日期字符串轉化為日期
	select to_char(to_date(‘2000-12-2’, ‘yyyy-mm-dd’), ‘day’) form dual; 	將日期字符串最后轉為日期:星期

③. 函數-組函數
查詢表數據進行分組、對每組數據處理產生一條結果

常見組函數:
	max(字段)			所查詢字段的最大值
	min(字段)			所查詢字段的最小值
	avg(字段)				所查詢字段的平均值
	sum(字段)			所查詢字段的總和
	count(字段 或 *)		所查詢字段的行數
注意:組函數對null不做任何統計,自動忽略

分組:
	語法:group by 字段名1,字段名2;
	注意:	①group by 在where條件篩選之后
			②select后可以查詢分組的依據字段,組函數的統計(其他不能查詢)

分組的過濾:
	語法:group by 字段 having 條件;
	注意:	①where是在分組前對數據過濾
			②having是在分組后對數據驚醒過濾
			③如果where和having同時滿足查詢要求時,優先選擇where

④. sql語句順序
①書寫順序:select…from…where…group by…having…order by [asc/desc]
②執行順序:from(確定表) ---> where(分組前過濾) ---> group by(分組) ---> having(分組后過濾) ---> select(查詢) ---> order by(排序)

4. sql – 子查詢、偽列、分頁查詢、表連接

①. 子查詢
子查詢可代替表、屬性值

①子查詢結果是1行1列
例:查詢工資最高的員工信息
select * from employees where salary = (select max(salary) from employees);
②子查詢結果是n行1列
例:查詢和“king”一個姓的並且在同一部門的員工的信息
select * from employees where department_id in(select department_id from employees where last_name = ‘king’);
③子查詢結果是n行n列
例:查詢工資前五位到前十位之間的員工信息
select * from (select employee_id, first_name, last_name,rownum as rn from (select * from employees order by salary desc)) where rn >= 5 and rn <= 10
②. 偽列、分頁查詢
偽列:
rowid 行的物理地址,不存在於任何表,可查詢
rownum 對查詢滿足條件的結果數據進行編號(從1開始)
用法:
select rowid,rownum,其他字段 from 表;
分頁:
利用子查詢,將查詢所有表數據再加上序列(rownum)作為一個臨時表

例如:
①查詢薪資從第五到第十位的員工信息
**先按工資降序排序,在加上序號字段形成臨時表
select * from (select employees_id, first_name, last_name, salary, rownum as rn from (select * from employees order by salary desc)) where rn >= 5 and rn <= 10

②對表加序號
select employees.*, rownum as rn from employees;
③. 表連接

4. 將多張表連接為一張表進行處理(放在from后)

  1. 內連接
    關鍵詞:…(inner)join … on inner可以省略
    語法:表1 (inner)join 表2 on 表1.xxx = 表2.xxx
    特點:①合並表1存在且表2也與之對應存在的數據②不保留表1存在且在表2中對應不存在的元組數據(與外連接對比)
  2. 外連接
    ①左外連
    關鍵詞:left (outer) join … on outer可以省略
    語法:表1 left join 表2 on 表1.xxx = 表2.xxx
    特點:合並表1和表2,並且會保留表1存在且表2對應不存在的元組,並對其補充為空
    ②右外連
    語法:表1 right join 表2 on 條件
  3. 擴展
    如果有兩張以上的表進行連接時,先連接兩個后成為一個表,再連接下一個,依次連接

5. 表(數據類型、約束)、修改表結構

表的創建:create table 表名(字段名 數據類型 [約束]);
表的刪除:drop table 表名;

oracle表包括: 表名、字段、數據類型、[約束]
其中:
(1)數據類型
①數字
number 默認長度為38,小數長度為0
number(n) 最大長度為n
number(n,m) 最大長度為n,其中小數部分長度為m
integer 相當於number(38)
②字符串
char(n) 字符串長度固定為n,不足的用空白字符補充
varchar2(n) 字符串最大長度為n,長度為填入的字符串長度
注:char的數據管理效率高,但空白字符浪費空間,varchar2節省空間
例:名字 varchar2
手機號 char(11) (因為不作運算和比較)
郵箱 varchar2
③日期
date 精確到秒
例:insert into 表(日期屬性) values(to_date(‘1999-8-9’, ‘yyyy-mm-dd’));

(2)約束
①主鍵約束 primary key
(非空、唯一)

②唯一約束	unique
	(表明列值不重復,例如手機號)

③非空約束	not null
	(表明列值不為空)

④檢查約束	check(約束語法)
	例如:	--- phone_num char(11) check(length(phone_num) = 11)
			--- email varchar2(100) check(email like ‘%@%’)
			--- sex char(2) check(sex in(‘男’, ‘女’))
	
⑥外鍵約束(forienkey)		references 其他表名(字段名)
	例如:  --- stu_class char(20) references classes(class_id),

(3)修改表結構:
①編輯表的字段:
語法:ALTER TABLE 表名 MODIFY(列名,數據類型);
  eg1a:alter table skate_test modify (author number(10,0) )
在修改列的長度時候,只能編輯比現有字段實際存的長度還要大
eg2:alter table skate_test modify (author varchar2(10) )
在修改列的數據類型的時候,所修改的列必須為空
②增加一個列:
語法: ALTER TABLE 表名 ADD(列名,數據類型);
eg1:ALTER TABLE skate_test ADD(author NUMBER(38,0) not null);
③改列名:
語法:ALTER TABLE 表名 RENAME COLUMN 當前列名 TO 新列名;
eg1:ALTER TABLE skate_test RENAME COLUMN author TO authorer_new
④刪除一個列:
語法:ALTER TABLE 表名 DROP COLUMN 列名;
eg1:alter table skate_test drop column author
⑤改表名:
語法:ALTER TABLE 當前表名 RENAME TO 新表名;
eg1:alter table skate_test rename to test_sakte
⑥給表加注釋:
comment column on 表名.列名 is '注釋內容'; //修改表的列的注釋
COMMENT ON TABLE MOVO_NEW.TEST_SAKTE IS '注釋內容'; //修改表的注釋

6. 視圖、序列、索引

刪除:drop view/sequence/index 視圖名/序列名/索引

① 視圖:將查詢結果作為視圖,供查詢使用,虛擬表
創建視圖:create view 視圖名 as select語句;
查看視圖:select 列名 from 視圖名;
優點:①簡化SQL語句 ②安全性,可以實現對開發人員屏蔽原表名和字段名
注意:視圖不會提高查詢效率,本質是存儲了select語句,基本不占用硬盤空間

② 序列:oracle提供的工具,產生一系列連續且不重復的值;
創建序列:create sequence 序列名 [start with 數字] // 不寫start,默認從1開始;
獲取序列值:序列名.nextval

例如:
	create sequence seq_keyValue start whith 100001;
	…
	insert into employee(id, name) values(seq_keyValue.nextval, ‘xyz’);

③ 索引:
創建索引:create index 索引名 on 表名(字段名);
使用序列:不需要手動使用,默認會使用索引的字段條件查詢,此時的數據會自動使用索引查找數據
特點:
①本身會占用磁盤空間
②對於增、刪、改,會有維護,降低DML效率
⑤主鍵(primary key)和唯一(unique) 數據庫會自動添加索引

7. 事務

概念:是數據庫的最小單元,有多個sql語句組成的一個整體
執行結果:對個sql語句執行一個功能,要么全部成功,要么全部失敗
成功結束:commit 提交
失敗結束:rollback 回滾
實現原理:
①數據庫會為每個客戶端都分配一個獨立的回滾段(臨時空間- rollback seagment)
②commit是將回滾段中的sql執行結果一次性同步到數據庫中;rollback是將回滾段里的結果舍棄

事務特性:
A(Atomic) 原子性:對個sql為一個整體
C(Consistency) 一致性:無論執行成功與否,數據都會合理
I(Isolation) 隔離性:事務與事務之間是相互獨立的
D(Durability) 持久性:事務結束,對數據修改是永久性的

8. 復制表結構、批量添加設計、數據復制

(1)復制表結構
create table newtable as select * from tablename where 1=2;
(2)批量添加設計
insert into 表名 select 序列名.nextval , t.* from
(select 字段1, 字段2,… from dual
union select 字段1, 字段2,… from dual
union select 字段1, 字段2,… from dual

) t;
補充:將t_text1表中的數據復制到t_text2表中
insert into t_text2 (id2,name2,sex2) select id,name,sex from t_text1;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM