版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。
本文連結:https://blog.csdn.net/zhao1299002788/article/details/101758010
/*
起别名使用雙引号 處理特殊字元使用
資料庫裡的字元串都是使用單引号
*/
/*
DDL語句 是資料定義語言 使用語句建立資料庫的對象
表空間 是執行個體配置設定的一塊空間 用于開發使用
建立文法: create tablespace 表空間名
datafile 檔案的路徑
size 檔案大小
autoextend on
next 擴充大小
*/
--示範表空間建立 需要使用管理者操作
create tablespace baidu
datafile 'c:\baidu.dbf'---linux系統
size 100m
autoextend on
next 10m
---------------------------------
/*
開發使用管理者建立配置設定的使用者
使用者的建立
create user 使用者名
identified by 密碼
default tablespace 表空間名
*/
---建立使用者
create user baidu
identified by baidu
default tablespace baidu
--建立完成使用者 登陸測試 缺少權限
/*
授權文法:
grant 權限 to 使用者
權限的分類
connect 連接配接的權限可以連接配接資料庫
resource 進階一點的權限 可以建表
dba 最進階的權限 相當于管理者
*/
---授權connect給baidu使用者 測試登陸
grant connect to baidu
--授予dba權限
grant dba to baidu
------
create table p(
pid number(9),
pname varchar(10)
)
---------------------------------------------------------------
---plsql developer 圖形化工具 instanclient
/*
對表結構的設計
表中含有多少個字段 根據需求來
表中字段都是什麼資料類型
主鍵外鍵 限制
資料類型
數值類型
int double bigint --mySql支援的資料類型
number(16,v2) v1是數值的總長度 v2是數值的小數位數 預設為0
number(6,2)---9999.99
字元類型
char() --固定長度的字元類型 char(20) zs
實際長度是 2 占用空間 20個長度
varchar() --可變長度的字元類型 varchar(20) zs 張三 utf8 6 gbk 4
實際長度是 2 占用空間 2個長度
varchar2() --可變長度的字元類型 varchar(20) zs 張三 utf8 6 gbk 4
實際長度是 2 占用空間 2個長度 推薦使用
日期類型
date mySql格式 yyyy-mm-dd
oracle 格式 yyyy-mm-dd hh:mi:ss
datetime mySql格式 yyyy-mm-dd hh:mi:ss
oracle 格式 yyyy-mm-dd hh:mi:ss 精确到後面的9位納秒
大文本類型
clob 字元類型大文本 最大支援4G的長度
資料庫存放網頁的源代碼
blob 二進制類型大文本 最大支援4G的長度
long 長文本 最大支援2g的長度
*/
/*
限制
主鍵限制 primary key 非空加唯一
外鍵限制 foreign key
唯一限制 unique 唯一
非空限制 not null 非空
檢查限制 check (gender in (0,1)) 判斷數值是否違反表達式
手動使用關鍵字指定限制 constraint 限制名稱 限制類型(列)
*/
---使用資料類型和限制建表操作
create table person(
pid number(11) ,
pname varchar2(11) not null,
phone varchar2(11) unique,
gender number(1) check (gender in (0,1)),
constraint pk_person_pid primary key(pid)
)
---插入資料測試限制 oracel事務必須手動選擇送出或者復原
insert into person values(1,'zs','11122223333',1);
insert into person values(1,'zs','11122223333',1);--違反主鍵限制
insert into person values(2,'zs','11122223333',1);--違反唯一限制
insert into person values(2,'zs','11122224444',1);
insert into person values(3,null,'11122225555',1);--違反非空限制
insert into person values(3,'','11122225555',1); --空串違反非空限制
insert into person values(3,' ','11122225555',1);
insert into person values(4,'zs','11122226666',3);--違反檢查限制
insert into person values(4,'zs','11122226666',0);
commit;
/*
表結構的修改
增加一列 alter table 表名 add(列名 數值類型)
修改一列 alter table 表名 modify(列名 數值類型)
重命名列 alter table 表名 rename column 舊列名 to 新列名
删除一列 alter table 表名 drop column 列名
*/
--給person表增加位址一列
alter table person add(address varchar2(20));
--修改address為char 類型 10個長度
alter table person modify(address char(10));
alter table person modify(pname number(11)); --列如有有資料不可以修改類型 報錯
--重命名gender性别為sex
alter table person rename column gender to sex
--删除位址address
alter table person drop column address
/*
DML語句 資料操作語言 對表中資料做增删改
插入資料 insert into 表名 values(.....)
insert into person values(1,'zs',1); --不能插入 列數量不比對
insert into person(pid,pname,sex) values(1,'zs',1); --指定列名插入資料
修改資料
update 表名 set 列名=值 where 條件 修改滿足條件的記錄
删除資料
delete from 表名 where 條件 删除比對的資料
delete from 表名 删除所有記錄 一條條删除
效率低 可以加條件
truncate table 表名 摧毀表結構 再重建表結構
效率高 不能加條件
*/
--想使用emp表的資料做測試
select * from emp;
--建立表的同時拷貝表的資料 scott使用者下的emp
create table emp as select * from scott.emp;
--修改SMITH使用者更改名稱為SSSS
update emp set ename='SSSS' where ename='SMITH';
commit;
/*
存在主外鍵的情況下 直接删除主表的記錄
一、 1.先删除從表記錄
2.再删除主表記錄
二、級聯删除 on delete cascade
三、直接删除主表
*/
--建立主表訂單 orders表
create table orders(
oid number(11) primary key,
oname varchar2(11) ,
oprice number(6,2)
)
--建立字表訂單明細表 order_detail
create table order_detail(
detail_id number(11) primary key,
detail_name varchar2(11) ,
detail_price number(6,2),
oid number(11),
constraint fk_detail_oid foreign key(oid) references orders(oid)
-- on delete cascade
)
--插入主表和從表的記錄
insert into orders values(1,'訂單1',1000);
--insert into order_detail values(1,'訂單1',1000,2);--違反外鍵限制
insert into order_detail values(1,'訂單1',1000,1);
commit;
----
select * from orders;
select * from order_detail;
----直接删除主表記錄測試
delete from orders where oid=1;
delete from order_detail where detail_id = 1;
commit;
drop table order_detail;
--直接删除主表 強制删除 不建議使用
drop table orders cascade constraint
/*
事務 作為一個邏輯操作單元 執行的任務全部成功,或者全部失敗
特性:ACID (原子性 持久性 隔離性 一緻性)
沒有隔離級别 髒讀 幻讀 不可重複讀
調整隔離級别
oracel資料庫隔離級别 READ COMMITED ,SERIALIZABLE,READ ONLY
預設隔離級别是READ COMMITED
事務的儲存點:
事務儲存點的概念: 儲存起執行成功的任務
意義:可以保證執行成功的任務正常送出
使用方法:
聲明事務儲存點 savepoin 儲存點名
出現錯誤復原到儲存點 rollback to 儲存點
再繼續送出 commit
spring管理事務 在servie層切入點
*/
declare
begin
insert into orders values(1,'訂單1',1000);
insert into orders values(2,'訂單1',1000);
insert into orders values(3,'訂單1',1000);
insert into orders values(4,'訂單1',1000);
insert into orders values(5,'訂單1',1000);
savepoint s1; --聲明儲存點
insert into orders values(6,'訂單1',1000);
insert into order_detail values(1,'訂單1',1000,100);
commit;
exception
when others then
rollback to s1;
commit;
end;
/*
資料庫其餘對象
視圖 是一個虛拟的表 不存放資料 資料來源為原始表
意義是: 為了資料的安全
為了權限的細分
建立視圖 檢視特定的資料
create view 視圖名 as select * from 表
*/
--檢視員工資訊
select * from emp;
--建立視圖
create view emp_view as select empno,ename,job,deptno from emp;
--查詢視圖
select * from emp_view
--修改視圖
update emp_view set ename='SMITH' where ename='SSSS';
commit;
--建立隻讀的視圖
create view e_view as select empno,ename,job,deptno from emp with read only
update e_view set ename='SSSS' where ename='SMITH';
commit;
/*
序列 是oracle資料生成的一系列數值 用來實作 (序列是對象,是以有屬性)
表中記錄id的自增長
建立序列
create sequence 序列名稱
序列的屬性
nextval --下一個值
currval --目前值
create sequence sequence
[INCREMENT BY n] 表示自增長,每次增長n個
[START WITH n] 表示初始值,n就是初始值.
[{MAXVALUE n | NOMAXVALUE}] 表示最大值
[{MINVALUE n | NOMINVALUE}] 表示最小值
[{CYCLE | NOCYCLE}] 表示循環 表示如果設定了最大值,當數字達到最大值以後,會進行循環的設定值,這個不适用于自動增長的主鍵(非空唯一的)
[{CACHE n | NOCACHE}] 表示緩存,表示緩存n個,如果n是10,表示一次緩存10個序列.
*/
--建立序列
create sequence order_sequence
select order_sequence.nextval from dual; --序列預設值從1開始 nextval生成不會因為插入失敗回退
select order_sequence.currval from dual; --檢視目前值 必須先生成nextval
insert into orders values(order_sequence.nextval,'訂單1',1000);
commit;
/*
索引 了解為一本書的目錄
沒有目錄找到特定章節 費時很長
意義:為了提升查詢資料的速度(通過id,建立樹結構,來提升查詢效率)
前提 : 隻有資料量非常大的情況下 才有意義
建立索引
單行索引 create index 索引名稱 on 表(列)
複合索引 create index 索引名稱 on 表(列,列2)
create index index_order on orders(oname)
建立索引是在資料庫中建立索引結構,放的是索引的列的數值rowid,将oname的數值按照從小到大的排序,
當where oid = 139,通過條件去索引結構定義記錄的位置,資料庫會通過rowid真實位址去查找資料.
優點 : 提升查詢速度.
缺點 : 占用空間.
增删改資料效率降低,需要更新索引結構,如果表中有主鍵和唯一限制會自動建立索引.
索引使用規範 : 用在于列的數值重複資料很少情況.例如 : 當gender列都是1,會影響索引的查詢效率
索引分類 : 常用的是 unique唯一索引,normal普通索引.
*/
--建立大資料量的表
--序列生成的屬性 在同一sql語句中隻會生成一次
declare
begin
for i in 1..5000000 loop
insert into orders values(order_sequence.nextval,'訂單'||order_sequence.nextval,1000);
commit;
end loop;
end;
select count(*) from orders
--先查詢資料 記錄耗時
select * from orders where oname='訂單3333333' --2.234 15 18 19
--建立索引
create index index_order on orders(oname) --一分多鐘
--建立索引後 查詢同樣的記錄 耗時
select * from orders where oname='訂單3333333' ---0.204
--多個條件作為查詢 不是觸發單行索引
select * from orders where oname='訂單3333333' and oprice=1000
--自動建立索引,根據oid建立的.
select * from orders where oid=4444444
/*
rowid 是資料庫在儲存資料時候 生成的真實實體位址
差別rownum 是一個僞列 是在查詢資料時候才會生成的,可變
rowid 是插入資料就已經生成了 固定的實體位址 唯一不變
*/
--通過以下查詢,可以對表進行直接修改.
select rowid,emp.* from emp;
/*
同義詞 可以了解為一個對象的别名
意義: 為了資料的安全
為了權限的細分
建立同義詞
create synonym 同義詞名 for 使用者.對象
oracel的from後面可以跟同義詞,視圖,表,這三種對象.
*/
--查詢員工表
select * from scott.emp;
create synonym syn_emp for scott.emp;
---查詢同義詞
select * from syn_emp
/*
資料庫的導入導出
1.為了資料安全 備份和還原使用
2.為了伺服器的遷移 把以前舊伺服器的整個資料庫遷移到新伺服器
3.開發人員的操作 是為了部署項目導入表結構
開發是在測試環境 開發完成 需要上線
代碼 上傳到伺服器 tomcat
開發的資料庫表 上傳到伺服器資料庫
去資料庫建表 直接new 有風險
公司裡一般都是 導出建立的表結構 通過指令運作
導入導出實作
通過指令行導入導出 需要安裝oracel資料庫伺服器
導出指令 exp
整個資料庫導入 exp 使用者名/密碼 file=檔案.dmp full = y
按照使用者導出 exp 使用者名/密碼 owner= 使用者 file=檔案.dmp
按照表來導出 exp 使用者名/密碼 file=檔案.dmp tables=表名,表名2
導入 将exp 換成 imp
通過圖形化工具導入導出
tools --export user objects 導出表結構 不能備份資料 包含所有的對象
tools --exprot tables 導出表可以備份結構和資料 預設情況隻能備份資料
oracel資料庫格式 .dmp檔案 伺服器才能做
sql檔案格式 .sql檔案
圖形化工具格式 .pde檔案
*/
複制