1.偽表,偽列
1.1.偽表dual
-
概念:
- 就是一個不真實存在的虛擬表.偽表的作用就是用來構造一個符合sql規則的select語句.簡單來說,偽表就是為讓select語句不出現錯誤.
-
應用場景
用來查詢系統參數
可以用來調用函數
-
可以用來查詢計算結果
-- 查詢一下的當前的登錄用戶 select user from dual; -- 查詢系統當前的時間 select sysdate from dual; -- 按照指定的格式輸出當前系統的時間 yyyy-MM-dd,調用函數 select to_char(sysdate,'yyyy-MM-dd HH:mm:ss') from dual; -- 查詢計算的結果 select 1+2 from dual;
1.2偽列rowid
-
在ORacle數據庫中插入數據的時候,Oracle數據庫會為該條數據創建一個ID.該ID號就是這條數據在磁盤上的物理地址.
-- rowid;注意:如果需要查詢*和其他的字段,就需要給*取別名 -- 如果只是單獨查詢*不需要別名 select rowid,e.* from emp e;
- 但是在實際開發中,一般是不會直接使用rowid的查詢表記錄,我們是根據主鍵列查詢表的記錄.
- 注意:rowid只能作為條件進行查詢,不可以修改rowid的值
1.3.偽列rownum
-
Oracle執行查詢的時候,rownum是根據sql查詢出的結果給每行分配一個邏輯編號;每次的查詢都會有不同的編號。編號從1開始.該編號就是偽列rownum,rownum的作用就是用來實現分頁的功能.
-- 查詢emp表中的第二頁的數據,每一頁顯示5行 select * from (select rownum r,e.* from emp e where rownum <= 10) where r >= 5;
注意:使用rownum進行查詢的時候,不可以使用大于,大于等于,等于號.如果是從1開始就除外.因為rownum是邏輯編號,如果新增了數據,rownum就會改變,所以等于號沒有意義.
2.運算符
-
算術運算符: + - * / 沒有%
-- 查詢員工的年薪(工資*12+獎金) select ename,sal*12+comm as 年薪 from emp;
-
比較運算符: > >= <= < = != in between...and is null is not null
-- 獲取工資大于等于2000,而且工資要小于等于3500的員工信息 select * from emp where sal between 2000 and 3000; -- 查詢所有獎金不為null的信息 select * from emp where comm is not null
邏輯運算符 and or not
連接運算符 ||
-- 查詢員工的職位信息
select ename || '的職位是:' || job from emp;
- 集合運算符
-
并集:union(去重復); union all(有重復)
-- 并集:有重復,就是查詢結果A中的子集與查詢結果B中的子集相加 select ename from emp where sal > 1000 and sal <3500 union all select ename from emp where sal > 1000 and sal < 2500 -- 并集:無重復,就是查詢結果A中的子集與查詢結果B中的子集相加然后取出重復部分 select ename from emp where sal > 1000 and sal <3500 union select ename from emp where sal > 1000 and sal < 2500
-
交集:intersect交集 minus 剪集
-- 交集 是AB的公共數據 select ename from emp where sal > 1000 and sal <3500 intersect select ename from emp where sal > 1000 and sal < 2500 -- 減集 是A-AB中的公共部分 select ename from emp where sal > 1000 and sal <3500 minus select ename from emp where sal > 1000 and sal < 2500
-
3.函數
- 數值函數
函數 | 說明 |
---|---|
mod(x,y) | 求余 |
round(x,y) | 四舍五入,如果參數y>0,那么就四舍五入到小數的第y位, 如果參數y<0,那么就四舍五入到小數點左邊的第y位, 如果參數y為0或者是不指定參數,對整數部分進行四舍五入 |
trunc(x,y) | 沒有四舍五入的功能,是截取 |
-- 數值函數
select mod(10,3) from dual;
select round(3.1415,3) from dual;
select round(1314.1415,0) from dual;
select trunc(1314.1415,3),trunc(1113.1415,-1) from dual;
- 字符型的函數
函數 | 說明 |
---|---|
length | 返回字符串的長度,是按照字符進行計算 |
replace(c1,c2,c3) | 把一個字符串里面的內容替換,把c1里面的c2全部替換成c3 |
substr(c1,c2,c3) | 從c1的c2位置開始截取c3個字符,不是索引,是從1個字符開始 |
-- 字符型函數
-- 查詢姓名長度大于5的員工信息
select * from emp where length(ename)>5
-- 替換
select replace('明天放假嗎?真的放假嗎?','放假','自習') from dual;
-- 截取電話號碼中的所有的8
select substr('13988888888',4,8) from dual;
- 日期函數
函數 | 說明 |
---|---|
sysdate/systimestamp | 用來獲取到當前的日期/時間 |
months_between(d1,d2) | 返回兩個日期相隔的月數 |
extract(c1 from d1) | 用來獲取日期時間中的某部分 |
interval | 用來獲取一個變動的日期或者是時間 |
-- 獲取到當前的時間
select systimestamp from dual;
-- 獲取某個日期的年份
select extract(year from sysdate) from dual;
-- 需求:查詢1987年入職的員工信息
select * from emp where extract(year from hiredate) = 1987
-- 獲取到昨天的日期
select sysdate - interval '1' day from dual;
select sysdate - interval '1' month from dual;
select systimestamp - interval '1' hour from dual;
- 轉換函數
函數 | 說明 |
---|---|
to_char | 把數值或者是日期類型的數據和轉換成字符串 |
to_date | 把字符串轉換為日期類型數據 |
to_timstamp | 把字符串轉換成時間類型的數據 |
-- 轉換函數
select ename,job,to_char(sal,'$999,999,999') from emp;
select ename,job,to_char(hiredate,'YYYY"年"MM"月"DD HH24:MM:SS') from emp;
select to_date('2017/4/02','yyyy/MM/dd') from dual;
select date '2017-04-01' from dual
select to_timestamp('2017/04/01 12:56:31','yyyy/MM/dd HH24:mi:ss') from dual;
select timestamp '2017-04-01 12:56:31' from dual
-
其他函數
函數 功能 nvl(exp1,exp2) 如果exp1為空,就返回exp2,否則返回exp1 decode(條件,值1,翻譯值1,值2,翻譯值2....值n,翻譯值n,缺省值) 判斷條件,如果等于值1,就返回翻譯值1,以此類推,如果都不等于,返回缺省值
-- 給所有入職超過1年的員工獎金加300塊
update emp
set comm = nvl(comm,0) + 300 -- 如果獎金為null就返回0,如果不為null就返回本身
where months_between(sysdate,hiredate) > 12
-- 查詢員工的部門名稱,如果10是對應accounting,如果是20對應.
select ename,deptno,decode(deptno,10,'ACCOUNTING',20,'RESEARCH',30,'SALES','無部門') from emp;
4.表空間
4.1 表空間的概念
- 表空間就是用來存儲用戶數據的地方.
- 一個Oracle數據庫可以有多個表空間,Oracle數據庫創建用戶的時候,Oracle數據庫會給該用戶分配一個表空間,也就是說,用戶的數據是默認保存在自己的表空間下面.一個表空間并不是一個用戶獨享的.用戶可以把數據保存在不同的表空間里面.
- 但是表空間值是一個存儲數據的邏輯單元.一個表空間里面包含了多個數據文件,用戶的數據就是保存在這些數據文件中.
- 一個數據庫中有多個表空間,一個表空間中有多個數據文件.
- 每一個數據庫中都有一個名為SYSTEM的表空間,就是系統表空間,該表空間是在創建數據庫或者數據庫的安裝的時候自動創建的,用于存儲系統的數據字典表,程序單元,過程,包和觸發器.
- 數據文件都是以DBF結尾的.
- 問題:是現有表空間還是先有用戶呢?
- 先有表空間,用戶創建好后分配表空間.
4.2 創建表空間
-
語法格式:
create tablespace 表空間名 datafile '數據文件的路徑'size 默認大小 [autoextend on] [next 擴展大小] [maxsize 最大容量]
- 注意:一個表空間至少要包含一個數據文件.
4.3 查詢表空間
- 語法 dba_data_files:查詢表空間以及數據文件的信息
- 問題:如果表空間中的數據文件容量超過了他的最大容量,怎么辦?
- 辦法一:修改數據文件的最大容量
- 辦法二:添加數據文件
- 注意:Oracle數據庫不允許修改數據文件.
4.4 擴展表空間
-
語法格式:
alter tablespace 表空間 add datafile '數據文件的路徑' size 默認大小 [autoextends on next 擴展大小] [maxsize 最大容量]
- 注意:Orcale用戶只會跟表空間打交道,而不會跟數據文件打交道.
4.5 刪除表空間
- 語法格式: drop tablespace 表空間 [including contents and datafiles];
- 如果指定了 including contents and datafiles 參數,刪除表空間的時候Oracle數據庫就會把表空間中的所有的數據文件也一起刪除
4.6 常用的表空間有哪些
臨時表空間:用來存儲一些中期活動的數據.(Oracle數據庫自動維護)
撤銷表空間:是用來保存未提交事務的數據.修改數據的時候,修改前的數據就會保存到撤銷表空間里面,如果執行了事務提交的操作,在撤銷表空間下的數據就會被清空,如果執行了事務回滾的操作,Oracle數據庫就會把撤銷表空間下的數據覆蓋修改后的數據.(Oracle數據庫的自動維護)
永久表空間,它是用來存儲用戶的永久數據的,包括了保存表,視圖,過程,索引等數據.(我們自己維護的一個表空間).
5.用戶管理
用戶 | 說明 |
---|---|
sys | 超級管理員,包括了所有的系統權限,必須要以sysdba身份去登錄 |
system | 普通的管理員,具有一些創建表空間,用戶管理,用戶授權等功能 |
scott | 測試用戶,需要解鎖才可以使用 |
5.1 查詢Oracle數據庫的用戶
- dba_users:查詢當前系統中所有用戶的詳細信息
5.2 創建用戶
語法格式:
create user 用戶名 identified by 密碼[default tablespace 表空間]
5.3 用戶授權
5.3.1 系統權限
- 系統權限:就是可以創建系統對象(表,索引,視圖,同義詞)的權限.
- 授予系統權限:grant create XXX to 用戶;
- create session: 用戶登錄的權限
- create tbale:創建表
- craete index:創建索引的權限
- .....注意只有管理員才有權利授予系統權利
- 模式Schema
- Oracle數據庫管理員創建用戶的時候,Oracle數據庫會為該用戶創建一個模式,模式就是一個用戶中所有對象的集合.一個用戶對應著一個模式.模式名與用戶名是相同的.如果我們要訪問其他用戶的對象,那么就必須要通過'模式.對象'進訪問.
5.3.2 對象權限
對象權限:就是對數據庫對象的操作權限.
授予對象權限的語法:
grant 操作 on 對象 to 用戶
常見的操作:
select; insert; delete; update; all
注意:只有系統管理員或者是對象的擁有者才有權利授權給其他用戶訪問該用戶的對象.
5.3.3 查看用戶權限
- user_sys_privs:查詢當前用戶的系統權限
- user_tab_privs:查詢當前用戶的對象權限
5.3.4 回收權限
-
回收對象權限
revoke 操作 on 對象 from 用戶
-
回收系統權限
revoke create XXX from 用戶
5.4 修改用戶密碼
- 修改密碼的語法:
alter user 用戶名 identified by 密碼
5.5 刪除用戶的語法
- 語法:drop user 用戶 [cascade];
- 如果刪除用戶的時候,如果該用戶下已經創建了對象,那么就需要指定cascade關鍵字把這些對象一起刪除.
6.視圖
6.1 視圖的概念
- 視圖是由一個或者是多個表組成的數據庫對象.這些表也稱之為視圖的基表,如果要創建視圖,就需要有create view的權限
- 限制對表中某些列的訪問
- 簡化select語句
6.2 創建視圖
-
創建視圖語法:
create or replace view 視圖名 as select 語句
-- 需求:授予lyric用戶訪問emp表,但是限制lyric訪問comm和sal create or replace view v_emp as select empno,ename,job,hiredate,deptno from emp; -- 使用視圖 select * from v_emp
注意:視圖本身是不保存數據的,視圖的數據是從視圖中的基表查詢出來的.
對視圖的操作實際上是對視圖中基表的操作.
6.3 刪除視圖
- 語法格式: drop view 視圖名稱;
7.同義詞
7.1 概念
- 同義詞就是一個對象的別名.
- 使用別名的好處:
- 簡化對對象的訪問
- 把對象的名字隱藏起來
7.2 創建同義詞(私有同義詞)
語法格式:create synonym 同義詞 for 對象
-
注意:如果要創建同義詞,必須要具有create synonym權限.
-- 創建一個表 create table itbaima_crm_dept_user_data ( id number(4) primary key, name nvarchar2(10) unique ) -- 創建同義詞(私有同義詞) create synonym syn_aa for itbaima_crm_dept_user_data; -- 使用同義詞 insert into syn_aa values (1,'狗娃'); select * from syn_aa
7.3 公有同義詞
公有同義詞是可以被public用戶組的所有用戶訪問.共有同義詞一般是由數據庫管理員負責創建,通常使用公有同義詞去代替一些普通的對象.
-
語法:
- create public synonym 公有同義詞 for 對象;
-
把公有同義詞授權給public權限組
grant select on 公有同義詞 to public;
注意:使用公有同義詞是不需要指定模式.
7.4 刪除同義詞
- 刪除私有的同義詞
`drop synonym 同義詞`
-
刪除公有的同義詞
drop public sysnonym 同義詞
- 注意:只有同義詞的創建者或者是管理員才可以刪除同義詞或者公有同義詞
8.索引
8.1 索引概念
索引就是創建在某一列或者是多列上面的數據庫對象.
作用:可以提高對表的查詢效率.
-
原理:
- 如果沒有索引:Oracle數據庫會從表的第1條數據一條一條往下查詢,直到找到滿足條件的記錄為止.
- 為什么對表的某一列創建索引之后會提高表的查詢效率?
- 如果對表的某一列創建了索引,那么查詢表數據的時候,Oracle數據庫就不會直接查詢目標表了,而是先去查詢索引(二叉樹的算法).找到之后就根據該索引值的rowid直接定位到目標表的某一行.
-
索引缺點:索引會影響到數據的更新效率.
- 因為創建了索引之后會對目標表的增刪改操作都要對索引進行增刪改操作.如果數據量越大,執行的效率就會越低.
8.2 創建索引
-
語法格式:
create [unique] index 索引名 on 表(列..)
-- 創建唯一索引 create unique index idx_emp_ename on emp(ename)
unique: 如果指定了unique關鍵字,那么這一列的數據就不允許重復.
注意:如果創建了索引之后,那么執行查詢的時候,Oracle數據庫就會先從索引表中查詢,而不會直接查詢目標表.
8.3 刪除索引
-
語法格式: drop index 索引名字
-- 刪除索引 drop index idx_emp_ename
8.4 使用索引的建議
- 如果執行查詢比較少,但是更新比較多的時候,不建議創建索引;
- 對于不經常查詢的列,也不適合創建索引.
- 有些數據類型不適合創建索引,比如:大文本類型,二進制類型;因為索引列不支持line關鍵字,'%關鍵字%'.
9.序列
9.1 概念
- 序列是一個用來生成唯一值的數據庫對象,一般序列是用來做為主鍵的自增長
- 一個表對應著一個序列.
9.2 創建序列
- 語法:
create sequence 序列名 start n -- 開始值 increment by n -- 步長 maxvalue n | minvalue n -- 指定序列的最大值或者是最小值 nocycle | cycle -- 是否循環正常 cache n; -- 預先會生成n個序列值保存在緩沖中, -- 創建一個序列 create sequence seq_emp_empno04 start with 1000 -- 開始值 increment by 2 -- 步長 maxvalue 9999 -- 最大值 nocycle -- 不循環生成 cache 10;
9.3 使用序列
- nextval:生成并返回一個序列值
- currval:返回當前的序列值
- 注意:如果創建了序列之后沒有調用nextval方法就調用了currval屬性,就會引發錯誤.
- 注意:序列保證唯一性,但是不能保證序列的連續性.
9.4 修改序列
- 語法格式:
alter sequence 序列名 increment by n -- 步長 maxvalue n | minvalue n -- 指定序列的最大值或者是最小值 nocycle | cycle -- 是否循環正常 cache n; -- 預先會生成n個序列值保存在緩沖中, -- 使用序列 select seq_emp_empno.nextval from dual; select seq_emp_empno.currval from dual; -- 插入數據 insert into emp (empno,ename) values (seq_emp_empno.nextval,'狗娃' || seq_emp_empno.currval);
9.5 刪除序列
-
語法格式:
drop sequence 序列名.
-
注意:序列是誰創建,誰就可以刪除,管理員也可以刪除.
-- 刪除序列 drop sequence seq_emp_empno04;
總結今天學習內容
- 偽表和偽列
- 運算符
- 函數
- Oracle表空間
- 用戶與權限(DDL)
- Oracle數據庫對象:視圖,同義詞,索引,序列