Oracle
Oracle起源
創始人:拉里-埃里森
用戶分類
管理員用戶:具有資料庫中最高權限,可以任意訪問所有用戶的資料
普通用戶:被管理員創建,所有的權限來自管理員的分配
創建普通用戶
? 默認創建用戶的時候,普通用戶是沒有權限的,需要管理員分配
create user 用戶名 identified by 用戶密碼;
Oracle默認的管理員:sys,sysdba
能夠賦予的權限:
| 權限 | 意義 |
|---|---|
| connect | 連接(允許用戶登錄) |
| resource | 資源(允許用戶創建資料) |
| dba |
使用管理員用戶賦予權限
# 賦予權限
grant connect to 用戶名;
grant resource to 用戶名;
grant connect,resource to 用戶名;
# 撤回權限
revoke connect from wyf;
revoke resource from wyf;
用戶狀態 - lock/unlock
? 一般情況下,在創建用戶的時候默認都是解鎖狀態
create user 用戶名 identified by 密碼 account lock;
# 解鎖scott用戶:是Oracle中的一個特殊用戶,默認具有所有權限,但是默認被鎖定
alter user scott account unlock;
# 修改scott用戶密碼為123456
alter user scott identified by a12345;
Oracle的基礎存盤單元
表:
表名:訪問表的時候需要提供表的名稱以及表所屬的用戶,
!如果訪問表,來自于當前用戶自己,則用戶名可以省略
select * from scott.EMP;
# 使用用戶scott
select * from EMP;
欄位:決定了表中的每一行資料能夠存盤的資料
欄位值:代表表里欄位的具體數值
!表的欄位再定義的時候,必須指定欄位的資料型別
# 創建用戶資訊表
# 定義資料表的時候,表名可以使用下劃線連接
create table user_info(
id number(8), # number代表的是數字型別
money number(10,2), # ()里面的數字第一位表示整數最高位數,第二位代表小數最高位數
name varchar2(20), # 最多容納20個位元組大小的文字
# varchar2代表不定長出具型別,占用的空間大小于內容有關
gender char(3), # 常見儲存字符的資料型別char(),varchar()
# char代表定長資料型別,占用的空間大小于內容無關,存盤資料不足規定的空間則使用空格填充
# char是一個典型的空間換時間的資料型別
# 阿里的開發手冊中規定,如果欄位存盤的資料長度幾乎一致,則使用char型別
addr varchar2(200),
birthday date #存盤日期型別的資料
);
? 文字所占據的大小是和文字所使用的字符集有關,文字再計算機底層進行存盤的時候,存盤的并不是文字本身,而是文字所對應的字符集編碼
字符集
? 類似于字典(每一頁只存放一個字),頁碼及對應的是字符集編碼.第一版字符集(ASCII碼)其中的一個字符占據一個位元組(八位二進制)
? gb2312字符集,一共收錄了6700個漢字,此字符集中,中文字符的存盤使用兩個位元組,英文字符使用一個位元組,不支持絕大部分的生僻字和繁體字
? gbk 相當于gb2312字符集的拓展,兼容gb2312的同時,收錄了20000個漢字 (包括生僻字,繁體字)
? gb18030 完全兼容gb2312 和gbk 并且收納了中國國內少數民族的文字,收錄了日韓漢字,一共收錄了70000個字符
? big5 主要針對繁體中文,收錄了13000+漢字(彎彎使用)
? ANSI 編碼,并不是一個固定的編碼,計算機作業系統使用的編碼是什么,ANSI 就代表什么
? !國內windows使用的編碼為(gbk編碼)
? unicode 萬國碼 美國發明,包含了世界上幾乎所有國家的所有文字,unicode 存盤的字符量太大,因此Unicode使用的最多位元組數量為4位元組
? Unicode拓展字符集:UTF-8(使用1-4個位元組), UTF-16(使用2個或4個位元組) , UTF-32(所有字符使用4個位元組),UTF-8nm4(支持emoji表情)
? ! 計算機在使用字符集的時候分為兩種,一種是寫入文本的時候使用的字符集,一種是讀取文本的時候使用的字符集,兩者使用的字符集必須一致!
? !資料庫對字符集編碼支持是不一樣的,在安裝Oracle的時候,定義的字符集為UTF-8,英文字符存盤使用一個位元組,中文字符存盤使用三個位元組
約束
? 為了限制某些不符合要求的資料
create table student(
sno number(8) primary key, # 主鍵約束,代表資料的唯一性,一張表里只能有一個主鍵,不可以重復,不可以為空
sname char(12),
gender char(3),
major char(30),
classno number(4),
age number(2),
addr varchar2(200),
enrolldate date
);
# 檢查約束: alter table 表名 add constraint 約束名稱 check(約束內容);
# 約束命名規范:見名知意
# 插入欄位值如果非法,則報錯
alter table student add constraint ch_stu_gen check(gender = '男' or gender = '女');
alter table student add constraint ch_stu_age check(age between 18 and 25);
# 非空約束
alter table student modify(sname not null);
# 默認約束 再插入資料的時候如果沒有土工欄位值,則約束提供默認值
alter table student modify(addr default '南京');
# 唯一約束 限制欄位中插入的值不可以重復
alter table student add constraint un_stu_addr unique(addr);
# 查看表中的約束(表名為大寫!)
select * from user_constraints where table_name = '表名';
插入資料(insert)
# 全欄位插入,按照表中欄位順序,為所有欄位提供值,數字可以直接使用,字串用單引號
# sysdate是Oracle自帶的函式,表示的是當前時間
insert into student values(20260322,'吳亦凡','男','坐牢',1101,22,'北京看守所',sysdate);
insert into student values(20260323,'wyf','男','網工',1101,22,'紫金',sysdate);
# to_date函式,指定日期型別資料插入,引數一:需要轉換日期格式的字串,引數二:對應的日期格式
insert into student values(20260324,'tmp1','男','軟工',1101,21,'南郵',to_date('2020-09-01','YYYY-MM-DD'));
# 指定欄位插入,只給部分欄位提供值,需要宣告欄位名,欄位值與其一一對應
insert into student
(sno,sname,gender,major,classno,age,enrolldate)
values
(20260325,'tmp2','男','網工',1101,21,sysdate);
更新陳述句(update)
update 表名 set 更改內容 where 表格主鍵;
# 同時修改多的值用逗號隔開
update product set name = '七喜', price = 77 where id=2;
# 多條件查詢,條件之間用and/or隔開
update product set price = 3, addr = '南京新港' where price > 3 and addr = '南京';
洗掉陳述句(delete)
# 根據你提供的體哦啊緝拿洗掉指定行的資料
delete from product where name ='可樂';
delete from product where id<8 and addr = '南京新港';
# 如果沒有寫條件,默認洗掉表內的所有資訊
delete from product;
修改欄位(alter)
# 添加欄位
alter table student add mary char(6);
# 洗掉欄位
alter table student drop column marry;
# 重命名欄位
alter table studnet rename column sno to sid; # 將sno重命名為sid
# 修改欄位的資料型別
# 如果原本是字串型別,不可以修改為number和其他,必須保證修改后,資料庫的內容不被影響
alter table studnet modify classno number(10);
# 可以用來修改密碼,修改用戶的鎖定狀態
alter user 用戶名 identified by 新密碼; # 修改密碼
alter user 用戶名 account unlock; # 解鎖用戶
陳述句分類
1.DDL陳述句(資料定義語言)
? create(建表) drop(刪表) alter(修改欄位) truncate(清空表資料,并且不可恢復)
2.DML陳述句(資料操縱語言)
? insert (插入)update(更新) .....
? Oracle規定所有的DML操作的資料,不會直接提交到資料庫中,而是保存在本地會話所對應的日志檔案中(快取),當用戶執行commit指令的時候,會話才會將本地日志檔案中的資料上傳到資料庫上,并且在提交的同時,會清空日志檔案,
? Oracle的設計目的是為了降低資料庫底層磁盤的讀寫次數,提高資料效率,
TCL事務控制語言
1.commit 提交當前會話中的日志檔案中的資料到資料庫中,并且清空本地日志檔案的內容
2.savepoint 記錄當前日志檔案中的資料狀態,類似單機游戲的存檔
3.rollback 資料回滾,將日志檔案中的資料回滾到指定savepoint的狀態
!plsql 會在用戶關閉視窗或者是切換用戶的時候,對檔案進行自動提交(僅限普通的正常退出方式,任務管理器強制退出不行)
rollback to 存檔點名稱;
# 如果直接使用rollback,則將資料的狀態回滾到上一次commit的時候
insert into test values(1);
insert into test values(2);
savepoint A;
insert into test values(3);
insert into test values(4);
rollback to A;
# 執行以上指令后,日志檔案里有兩條資料1,2,但是資料庫內一條資料都沒有
insert into test values(1);
insert into test values(2);
savepoint A;
insert into test values(3);
insert into test values(4);
commit;
rollback to A;
select * from test;
# 執行以上指令后,資料庫里有4條資料,select查詢可以查到4條資料
# 當commit進行提交之后,會清空日志,同時會清空A存檔點,因此回滾的時候就找不到A存檔點,會報錯,,,
什么是事務:
? 多個DML操作可以當作是一個事務,
# 舉個栗子:
# A給B轉100rmb, 經歷了兩個程序,A余額-100,B余額+100
update wallet set money = money - 100 where name = 'A';
update wallet set money = money + 100 where name = 'B';
# 一張兩條陳述句就可以當作一個整體,也就是事務
資料庫事務特性
原子性
? 事務所對應的sql陳述句,要么全部提交,要么全部不提交,保證資料是完全正確的才能提交,目的是保證資料的安全性,
一致性
? 所有用戶所獲取的統一資料應該是一致的,
持久性
? 確保所有資料都能夠長期的存盤在資料庫中,執行完DML操作之后,必須進行commit提交,
隔離性
? 兩個事務不可以同時操作同一條資料,A事務操作資料的時候,B事務要么在A操作之前操作,要么等到A事務結束再執行,
外鍵約束(完整性約束)
? 外鍵的作用是用來保證資料的完整性,
外鍵約束的特性:
? 1.附表在插入資料的程序中,必須在主表中有關聯的記錄,否則資料無法插入
? 2.洗掉主表的資料之氣那,必須洗掉附表中的關聯的全部資料,否則無法洗掉主表資料
# 測驗環境
# 學生表(student)
create table student(
stuid varchar2(8) primary key, # 學生學號
sname char(15) # 姓名
);
# 成績表(score)
create table score(
scid number(8) primary key, # 試卷編號
term varchar2(2) check(term='s1' or term='s2'), # 學期
stuid varchar2(8), # 學生學號
exam varchar2(20) not null, # 考試科目
grade number(4,1) default 0 not null, # 考試成績
constraint fk_stu_score_stuid foreign key(stuid) references student(stuid) # 設定外鍵
);
# 當向成績表插入資料的時候,成績表的學生id必須能夠在學生表里找到對應的主鍵id,否則無法插入資料
insert into student values ('10001','測驗學生1');
insert into score values (1,'s1','10001','科目1',100);
# 以上可以成功插入資料
insert into score values (1,'s1','10002','科目1',100);
# 不能插入,因為student表中并沒有stuid為10002中的對應資料
# 添加外鍵約束(建表后)
# 建表
create table worker(
wid number(4) primary key,
wname varchar2(20),
manager number(4),
deptno number(4)
);
create table dep(
depno number(4) primary key,
dname varchar2(20)
);
insert into dep values(1,'開發部門');
insert into dep values(2,'測驗部門');
# 建立外鍵約束
alter table 表名 add constraint 外鍵約束名稱 foreign key (欄位名) references 主表名(關聯欄位名);
# 不同表相互關聯的外鍵約束
alter table worker add constraint fk_worker_dep_depno foreign key(deptno) references dep(depno);
# 同一張表內部關聯的外鍵約束
alter table worker add constraint fk_worker_wid_manager foreign key(manager) references worker(wid);
# 插入資料
insert into worker values(1,'員工1',null,1);
insert into worker values(2,'員工2',1,1);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/548527.html
標籤:Oracle
下一篇:Oracle入門2
