oracle基礎總結
1. 使用者管理:
a) create user 使用者名稱 identified by密碼 defaulttablespace
表空間名temporary tablespace 臨時表空間名 ACCOUNT UNLOCK;
GRANT CONNECT TO 使用者名稱; 連線資料庫
GRANT RESOURCE TO 使用者名稱;
grant alter,delete,update,insert,select on 表名 to 使用者名稱;
revoke alter,delete,update,insert,select on表名 from使用者名稱;
如果要讓賦權後的得使用者也可以把許可權付給別人就在賦權得語句中加入,with grant option(
注意:如果回收初始賦權使用者得許可權,那麼通過他給其他使用者的許可權也會被回收;
有時會出現使用者被鎖,使用alter user使用者名稱account unlock;
Oracle單表查詢
資料型別:char 定長最大2000字元;
varchar2(20) 最大長度4000字元;
clob字元型的大物件,最大為4G
number(m,n) 表示m位有效數,n表示小數位數;
date日期型別包括年月日時分秒預設格式’DD-MON-YY’
alertsession set nls_date_format=’yyyy-mm-dd’ //修改日期的格式
timestamp這是date的擴充套件,比date更加具體
blob二進位制資料,用來儲存圖片、視屏、聲音等4G
建立表:
createtable stu( --表名
connumber(4) ,--學號
numevarchar2(20),--姓名
sexchar(2),--性別
birthdaydate,--出生日期 );
修改表結構:
alert table 表名 add(列);//增加列
alerttable 表名 modify (列);//修改列
alerttable 表名 drop column 列;//刪除列
rename 表名 to 新表名;//修改表名
droptable 表名;//刪除表
新增資料:
instert into 表名 values (1, ‘李康’,’ 男’,’24-11月-1991’);
instert into 表(列,列…)values (值,值,值…)
插入空置
instert into 表 values (null,null…)
is null /is not null 查詢空
修改資料;
update 表名 set 具體列 where 條件
刪除資料:
delate from 表名;
delete 刪除所有紀錄,表的結構還在,寫日誌,可以利用rollback to(回滾點)回滾命令恢復,速度慢
truncate table 表名;
truncate 刪除表的所有資料,表結構不變,不寫日誌,不可回覆
drop table 表;drop 輸出表喝資料;
savepoint 回滾點;
查詢資料:
desc 表名; --查詢表結構
select 列名1,列2,列3 from 表名;
count 統計記錄條數
distinct 去掉重複記錄
* 如果在oracle表示式中有一個位null那麼這個表示式就為null
* nvl函式處理null值。nvl(值1,值2) //如果值1 位null那麼就去值2的值,值1不為null就去值1.
* like操作符%代表多個字元、_代表一個字元
* in 代替多個or
* is null判斷空
第九講
order by 查詢排序,預設asc為從小到大 desc 從大到小
按照部門號升序並且按照員工待遇降序:
select * from emp order by deptno aasc,sal desc;
*在使用多欄位排序,order by 後面直接跟要排序的欄位並註明升序還是降序
使用別名: select ename ,(sal+nvl(comm,0)) as “年薪” from emp order by “年薪”
複雜查詢:
max、min、avg、sum、count //分組函式必須喝分組函式一起或者獨立使用。
最高工資\最低工資:select max (sal),min(sal) from emp;
//查詢最高工資的員工資訊
select * from emp t where t.sal=(select max(sal) from emp);
//查詢比平均
select * from emp twhere t.sal>(select avg(sal) from emp);
group by 用於對查詢的結果分組統計
* 使用group by分組時,欄位必須要先查出來在分組。。
having 子句用於分組顯示結果//對分組的結果在篩選。
//分組統計平均工資
select avg(sal).max(sal) , deptno from emp t group bydeptno;
//根據多個條件分組
select avg(sal),max(sal),deptno,job from emp t group bydeptno,job;
//工資小於2000 的部門號,最大工資,平均工資
select avg(sal),max(sal) ,deptno from emp group by deptnohaving avg(sal)<2000;
總結:
1. 分組函式只能出現選擇列、having、order by子句中
2. 如果select語句中出現group by 、having、order by 那麼他們的順序只能為group by、having,order by
select avg(sal),max(sal),deptno from emp group by deptnohaving avg(sal)>2000 order by avg(sal);
3. 在選擇列中如果有列、表示式、個分組函式那麼這些列和表示式必須有一個出現在group by 子句中,否則會出錯。
多表查詢:
select t1.ename,t1.sal,t2.dname from emp t1,dept t2 wheret1.deptno=t2.deptno;
笛卡爾集 emp 表與 dept表要進行笛卡爾集組合
多表查詢的條件至少不少於表的個數-1 //消除笛卡爾集廉潔的多餘項
自連結:在同一張表的連結查詢
顯示一個員工的上級姓名
子查詢:資料庫在執行sql是從左到右,儘可能把過濾多的資料先執行
all 所有 any任何一個
多列子查詢:select * from emp where (deptno,job)=(select deptno,job from emp where ename=’liakng’);
說明:當在from子句中使用子查詢時,該子查詢會被作為一個試圖來使用,當在from子句中使用子查詢時,必須給子查詢指定表名;在給表去別名時不使用 as
分頁查詢:
oracle 一個有三種方式:
1. rownum (select * from emp)//子查詢
2. 顯示rownum [oracle 分配的]
select a1.*,rownum rn from (select * from emp) a1;
3. select a1.*,rownum rn from(select * from emp) a1 whererowmun<10;//返回10條記錄
4. 如果要查詢5-10的記錄必須先查訓1-10,在把查詢的結果在進行一次查詢5-10;
select a2.* from (select a1.*,rownum rn from(select * fromemp) a1 where rownum<=10) a2 where rn>5;//查詢6-10的記錄
a. 指定查詢列,只需要修改最裡面的子查詢;
b. 要進行排序,只需在裡層進行排序
用查詢結果建立表
create table 表1( 列,列…) as select 列,列… from 表1;
inster into 表名1(列,列…) select (列,列…) from 表2;
update 表明1 set (列,列…)=(select (列,列…) from 表2 where ….)where 更新條件;
合併查詢:在實際操作中,為了合併多個select語句的結果,可以使用集合操作符號union,union all,intersect,minus;
union:該操作符用於取得兩個結果的並集,當使用該操作符時會自動去掉結果集中的重複行。
Union all:操作與union相似,但是不會取消重複行,也不會排序;
Interest:取兩個結果集的交集;
Minus:使用該操作符取兩個結果的差集,他只會顯示存在第一個集合中,而不會存在第二個集合中的資料;