oracle表管理及常用命令

第三章 表的管理

一、表名命名規則

1.必須以字母開頭
2.長度不能超過30字符
3.不能使用oracle保留字
4.只能使用如下字符A-Z,a-z,0-9,$,#等

二、oracle支持的數據類型

1.字符型
char 定長,最長爲2000 例:create table users(userName char(10),...)
varchar2(),變長,最大4000字符
clob(character lager objiect)  字符型大對象,最大4G
2.數字型
number 範圍10的38次方,可以表示整數,也可以表示小數
例:number(5,2) 表示一個小數有5位有效數據,2爲小數。 範圍-999.99-999.99
例:number(5) 表示一個五位整數,範圍-99999-99999
3.日期類型
date 包含年月日和時分秒
timestamp 這是orcale9i對date數據類型的擴展
4.圖片
blob  二進制數據,可以存放圖片/聲音   4G
一般不會再數據庫中直接圖片視頻,一般存連接,若需要安全性非常高,則直接存入

三、表管理

1.創建表
SQL>create table student( --表名
xh number(4),  --學號
xm varchar2(20),--姓名
sex char(2), --性別
birthday date, --出生日期
sal number(7,2) --獎學金
);
SQL>creat table calsses(
classId number(2),
cname varchar2(40)
);
2.修改表
(1).添加一個字段
sql>alter table student add (calssid number(2));
(2).修改字段的長度
sql>alter table student modify (vm varchar2(30));
(3).修改字段的類型/或是名字(不能有數據)
sql>alter table student modify (xm char(30));
(4).刪除一個字段
sql>alter table student drop column sal;
(5).修改表名字
sql>rename student to stu
(6).刪除表
sql>drop table student;
3.添加數據
(1).sql>insert into student values('a001,'張三','man','1-10月-1999','2222');
注:oracle中默認的日期格式是:'DD-MON-YY'
(2).修改默認格式
sql>alter session set nls_date_format ='yyyy-mm-dd';
(3).添加空值
sql>insert into student(xh,xm,sex,birthday) values (3,'aa','女','null')
(4).查詢空值的數據
sql> select * from student where birthday is null
(5).改一個字段
sql>update student set sex='女' where xh='A001';
sql>update student set sal=sal/2 where sex='man';
sql>update student set sal=sal/2,calssId=3 where sex='man';
(6).修改含有null值的數據
is null
4.刪除數據
sql>delete from student ; 刪除所有記錄,表結構還在,寫日誌,可以恢復,速度慢
使用rollback恢復數據,前提是在delete之前有savepoint
sql>savepoint aa(保存點名稱)
sql>rollbock to aa;
sql>truncate table student; 刪除表中的所有記錄,表結構還在,不寫日誌,無法找回,速度快
sql>drop table student;  刪除表的結構和數據
5.查詢
(1). 查看錶機構
sql> desc 表名
(2).查詢指定列的速度>查詢所有列
sql>set timing on; 打開顯示操作時間的開關
(3).取消重複行
select distinct deptno,job from emp;
(4).使用算術表達式
sql>select sal*13 "年工資",ename from emp;
sql>select sal*13+nvl(comm,0)*13 "年工資",ename from emp;
(5).使用where子句
sql>select ename,sal from emp where sal>3000;
sql>select ename,hiredate from emp where hiredate>'1-1月-1982';
sql>select ename,sal from emp where sal>=2000 and sal<=2500;
(6).使用like操作符
%:表示任意0到多個字符
sql>select ename sal from emp where ename like 'S%';
_:表示任意單個字符
sql>select ename sal from emp where ename like '__O%';
(7)在where中使用in
sql>select * from emp where empno in (7844,234,456);
(8)使用 is null
sql>select * from emp where mgr is null;
(9)使用邏輯運算符
sql>select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';
(10)使用order by
sql>select * from emp order by sal (asc);
sql>select * from emp order by sal desc;
sql>select * from emp order by deptno asc,sal desc; 部門升序,工資降序
SQL>select ename ,sal*13 as "年薪" from emp order by "年薪";
6.oracle表複雜查詢
(1)數據分組-max,min,avg,sum,count
sql>select min(sal),max(sal) from emp ;
sql>select ename,sal from emp where sal =(select max(sal) from emp);
sql>select *from emp where sal<(select avg(sal) from emp);
(2)group by 和 having子句
sql>select avg(sal),max(sal),deptno from group by deptno;
sql>select avg(sal),min(sal),deptno,job from emp group by deptno,job;
sql>select deptno, avg(sal),max(sal)from emp group by deptno;
sql>select deptno, avg(sal),max(sal)from emp group by deptno having avg(sal)>2000;
注:1.分組函數只能出現在選擇列表、having、order by子句中
    2.如果在select語句中同時包含有group by,having,order by 那麼他們的順序是group by ,having, order by
    3.在選擇列中如果有列,表達式、分組函數,那麼這些列和表達式必須有一個出現在group by子句中,否則就會出錯
7.多表查詢和子查詢
1).
sql>select a1.ename,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;(笛卡爾積,條件>=表的數量-1)
sql>select a1.ename, a2.dname,a1.sal, from emp a1, dept a2 where a1.deptno=a2.deptno order by a2.dname;
2).自連接
sql>select worker.ename,boss.ename from emp worker,emp boss where worker.empno = boss.mgr;
sql>select worker.ename,boss.ename from emp worker,emp boss where worker.empno = boss.mgr and worker.ename = 'ford';
3).子查詢也叫嵌套查詢
sql>select ename from emp where deptno = (select deptno from emp where ename ='SMITH');
//數據庫在執行sql時從左向右,where條件中儘可能將能把篩掉大部分的數據放在左面
4).單行子查詢
如上
5).多行子查詢
sql>select * from emp where job in (select distinct job from emp where deptno =10 )
6).在多行子查詢中使用all操作符
sql>select ename,sal,deptno from emp where sal >all(select sal from emp where deptno =30);
sql>select ename,sal,deptno from emp where sal >(select max(sal) from emp where deptno=30);
第二句效率高
7).在多行子查詢中使用any操作符
sql>select ename,sal,deptno from emp where sal > any(select sal from emp where deptno =30);
8).多列子查詢
sql>select * from emp where (deptno,job)=(select deptno,job from emp where ename ='SMITH');
9).在from子句中使用子查詢
問題:顯示出高於自己部門平均工資的員工的信息
sql>select deptno, avg(sal) as mysal from emp group by deptno;
sql>select * from emp a2 ,(select deptno,avg(sal) as mysal from emp group by deptno) a1 where a1.deptno = a2.deptno and a1.mysal < a2.sal;
給表取別名時不要加as
10).使用子查詢插入數據
當處理行遷移或者裝載外部表的數據到數據庫中時
首先建表:
sql>create table kkk(myId number(4),myname varchar2(50).myDept number(5));
然後導數:
sql>insert into kkk(MyId,myname,mydept) select empno,ename,deptno from emp where deptno =10;
11).使用子查詢更新數據
sql>update emp set (job,sal,comm) =(select job,sal,comm from emp where ename ='SMITH') where ename='SCOTT'
8.分頁
oracle分頁一共三種方式
(1).rownum分頁
sql>select a1.*,rownum rn from (select * from emp) a1;
sql>select a1.*,rownum rn from (select * from emp) a1 where rownum<=10;
sql>select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10)where rownum>=6;
sql>select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal) a1 where rownum<=10)where rownum>=6;
(2).根據rowid來分
11.用查詢結果創建表
sql>create table myemp2 (id,ename,sal) as select empno,ename,sal from emp;
9.合併查詢
(1)union 去重複
sql>select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job ='MANAGER';
(2)union all 不去重複
(3)intersect 取交集
(4)minus 差集,顯示存在第一個集合中,而不存在第二個集合中的數據

四、創建新的數據庫

1.通過oracle工具嚮導

dbca(數據庫配置助手)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章