从零开始学习Oracle—安装及删除
-.要求:
?? ORACLE9i? 9.0.1? 空間1.76G
?? ORACLE9i? 9.0.2? 空間2.86G
??? 事務處理 --? 增 刪除 修改頻繁
??? 數據倉庫 -- 查詢 頻繁
??? GBK??? --多200個字左右(偏僻字)
??? GB2312??
?SETUP.exe 雙擊
?啟動ORACLE數據庫? OracleServiceOrac? 服務? 多啟動幾次
????????????????? OracleOraHome90TNSListener 服務
??? 如果啟動不了Listener(監聽器)
???? <1>改注冊表?
?????????? ImagePath? D:\oracle\ora90\BIN\TNSLSNR
???? <2>用命令行啟動
??????????? cmd? ->?? tnslsnr 最小化
??????????? tNSlsnter? 監聽器? 如果無法啟動
??????????? 運行cmd 切換到DOS界面 敲tnslsnr 窗口不要關閉
???? <3>D:\oracle\ora90\network\ADMIN
??????????????? listener.ora 文本文件
???????????? HOST=localhost或機器名
????????????? 存盤
?2,操作Oracle數據庫的工具
?? ORACLE SQL*PLUS 字符界面 ORACLE自帶
???? sqlplusw.exe windows窗口下的sqlplus
???? sqlplus.exe?? DOS下的sqlplus??????????
????????
?????? 用戶名scott 密碼tiger 普通用戶
???????????? system??? manager?? 超級用戶
???????????? sys?????? change_on_install? 超級用戶? 比system權限還要大
?
???? SQLPLUS下的常用命令
?????? show user 察看用戶
?????? connect 用戶名/密碼? 連接到指定用戶
??????????? connect scott/tiger???
??????? select * from tab where tabtype='TABLE';? 察看當前用戶下的表??????
?????? select count(*) from dept;? 查詢表dept中記錄的行數
?????? desc dept???????????? 察看表dept的結構
?????? quit/exit???????????? 退出
?????? clear screen????????? 清除屏幕
?????? set linesize 200????? 設置一行顯示200個字符
?????? set pagesize 20?????? 設置每頁顯示20行
?????? spool 文件名 (spool c:\abc.txt) 作日志文件命令????????
?????? spool off
???????
?????? 修改D:\oracle\ora90\sqlplus\admin\glogin.sql文件
?可以設置SQLPLUS的環境
?????????? set linesize 200
?????????? set pagesize 20??
?? ORACLE 企業管理器 (OEM)? 圖形界面
?? PL/SQL Developer 第三方軟件 ORACLE不帶的
? SQLPLUS? /nolog??? nolog是不登陸
? 瀏覽器使用oracle (isqlplus)
???? D:\oracle\ora90\Apache\Apache\conf\httpd.conf
?????????? 修改80端口?? -> 8001
??? http://localhost:8001/isqlplus
????????? 用工具 ORACLE SQL*PLUS驗證數據庫是否啟動
??????????? 用戶名system?? 密碼manager
??????????? 出現 連接到 和 SQL>符號 說明數據庫已經可用了
??????? 默認用戶:
????????? 超級用戶: 用戶名system/密碼manager
?????????????????? 用戶名sys/密碼change_on_install
????????? 普通的用戶: 用戶名scott/密碼tiger
?注意的問題:安裝的源程序放在什么目錄下??
??????? <1>目錄中不要出現中文名字的目錄
??????? <2>數據庫的名字不要是中文,8個字符以內
??????? <3>字符集用默認的ZHS16GBK
3,Oracle中的數據類型
?
?
ORACLE中字段的數據類型
?? 字符型???
?????????????? ?char??????? ?最大2000個字節 定長
?????????????? ?char(10)?? '張三' 后添空格6個把10個字節補滿? '張三????? '
????????????????char(2)???? '男'
?????????????? ?varchar2??? 最大4000個字節 變長
????????????????varchar2(10)? '張三'????? 在數據庫中'張三'
??????????????? 大對象 字符型大對象 >4000字節 最大4G
??????????????? CLOB (Character Large OBject)????
????
?? 數字???? number???? 范圍? 10的-38次方 到10的38次方??????????
????????????? 可以表示小數 也可以表示整數??
???????????? number(4)?? 最大表示4位整數? -9999 到 9999
???????????? number(5,2)?? 表示5位有效數字 2位小數的 一個小數? -999.99 到 999.99
??????????????????
????????????
?? 日期???? date????? 包含年月日和時分秒? 7個字節
?? 圖片???? blob????? 二進制大對象??? 圖像/聲音? 4G
?4,如何建表,以及相關操作。
?? 學生表student
??????? create table student( --學生表
?????????? xh number(4), --學號
?????????? xm varchar2(10), --姓名
?????????? sex char(2), --性別
?????????? birthday date, --日期
?????????? sal number(7,2) --獎學金
??????? );
?? 班級class
?????? create table class( --班級表
????????? classid number(2), --班級編號
????????? cname varchar2(20) --班級名字
?????? );
? 添加字段(學生所在班級classid)
????? alter table student add (classid number(2));
? 修改字段的長度
????? alter table student modify (xm varchar2(12)) ;
? 修改字段的類型(不能有記錄的)
????? alter table student modify (xh varchar2(5));
? 刪除一個字段
????? alter table student drop column sal;
? 刪除表
????? drop table student;
? 表的名字修改
????? rename student to stu;
? 字段如何改名字
????? --先刪除
????? a)alter table student drop column sal;????????
????? --再添加
????? b)alter table student add (salary number(7,2));
如何插入數據
? 插入數據 insert語句
????? 所有字段都插入
?????? insert into student values ('A001','張三','男','01-5月-05',10);
??????????? ORACLE中默認的日期格式'DD-MON-YY'?? dd 日子(天)? mon 月份 yy 2位的年
???????????? '09-6月-99' 1999年6月9號
??????????? 改日期的默認格式
???????????????? alter session set nls_date_format = 'yyyy-mm-dd';
????
?????? insert into student values ('A002','MIKE','男','1905-05-06',10);
?????????? 恢復ORACLE默認格式
?????????????? alter session set nls_date_format = 'dd-mon-yy';
?????????? 察看日期的格式
?????????????? set linesize 1000
?????????????? select * from nls_session_parameters
???????????????? where parameter='NLS_DATE_FORMAT';
?????????? 永久設置日期格式
?????????????? 改注冊表oracle/HOME0 加字符串NLS_DATE_FORMAT 值yyyy-mm-dd
???? 部分字段插入
?????? insert into student(xh,xm,sex) values ('A003','JOHN','女');
???? 插入空值
?????? insert into student(xh,xm,sex,birthday) values ('A004','MARTIN','男',null);
? 修改? update
????? 改一個字段?
?????? update student set sex='女' where xh='A001';
????? 改多個字段
?????? update student set sex='男',
????????????????????????? birthday='1980-04-01'
????????????? where xh='A001';
????? 改為空值 (修改為空時=null)
?????? update student set birthday=null where xh='A001';
????? 把生日為空的人的班級編號改為20(條件中的空是is null / is not null)
????????? update student set classid=20 where birthday is null;
???????? 錯誤的沒有達到要求
???????? update student set classid=20
?????????? where birthday=null;
???????? 不表示空值 表示xm是null的字符串????????
???????? update student set classid=20 where xm='null';
?
???
? 刪除 delete
????? delete from student;? 刪除所有記錄,表結構還在,寫日志,可以恢復的,速度慢
????? drop table student;? 刪除表的結構和數據
????? delete from student where xh='A001';? 刪除一條記錄
????? truncate table student; 刪除表中的所有記錄,表結構還在,不寫日志,無法找回刪除的記錄,速度快
? 查詢 select???
????? select * from student;
????? select xh,xm,sex from student;????
????? select * from student where xh like 'A%1'; %任意多個字符
????? select * from student where xh like 'A__1'; _1個字符
????? select * from student where xh like '%A%';???????????? select * from student where xh like 'A%';
select * from student where xh like '%A';??????????????????????????????
????? select * from student where xh = 'A%';
???????????????????????
??
????? select * from student
????? order by birthday ;? 升序 (order by birthday asc;)
?
????? select * from student
????? order by birthday desc; --降序
??
????? select * from student
????? order by birthday desc,xh asc; --按birthday 降序 按xh升序(asc/默認)
????????????????
????? select * from student
????? where sex='女' or birthday='1999-02-01';
????? select * from student
????? where sex='女' and birthday='1999-02-01';
????? select * from student
?????? where salary > 20 and xh <> 'B002'; (!=)
ORALCE的函數
?? 單行函數?? 返回值只有一個
?????
?? 分組函數?? 返回值是多條記錄
????? group by
????? sum
????? avg???????????
?????
單行函數
? 字符函數
??? concat 連接? ||
?? <1>顯示dname和loc中間用-分隔
???? select deptno,dname||'----'||loc from dept;
????
???? dual啞元表?? 沒有表需要查詢的時候 可以用它
???????? select 'Hello World' from dual;
???????? select 1+1 from dual;
???????? 查詢系統時間
????????? select sysdate from dual;
?? <2>? initcap 首字母大寫
?????? select ename,initcap(ename) from emp;
?? <3>? lower?? 轉換為小寫字符
??????? select ename,lower(ename) from emp;
?? <4> upper 轉換為大寫
??????? update dept set loc=lower(loc);
??????? update dept set loc=upper(loc);
?? <5> LPAD 左填充
??????? select deptno,lpad(dname,10,' '),loc from dept;
?? <6> RPAD 右填充
?? <7> LTRIM 去除左邊的空格
?????? RTRIM 去除右邊的空格
?????? ALLTRIM? 去除兩邊的空格
?? <8>replace??? 替換
????? translate? 轉換
?????? select ename,replace(ename,'S','s') from emp;
?????????? 用's'去替換ename中的'S'
??????? select ename,translate(ename,'S','a') from emp;
?? <9> ASCII 求ASC碼
?????? chr?? asc碼變字符
???????? select ascii('A') from dual;
???????? select chr(97) from dual;
???????? select 'Hello'||chr(9)||'World' from dual;
?????????????????????????? '\t' ascii碼是 9
?????????????????????????? '\n' ascii碼是 10
???????? select 'Hello'||'\t'||'World' from dual;????
?? <10> substr 字符截取函數
?????????? select ename,substr(ename,1,3) from emp;
?????????????? 從第1個位置開始 顯示3個字符
?????????? select ename,substr(ename,4) from emp;
????????????? 從第4個位置開始顯示后面所有的字符
?? <11> instr 測試字符串出現的位置
????????? select ename,instr(ename,'S') from emp;
???????????? 'S'第1次出現的位置
? select ename,instr(ename,'T',1,2) from emp;????????????????
???????????? 從第1個位置開始 測試'T'第2次出現的位置?
? <12> length 字符串的長度
??????? select ename,length(ename) from emp;
??????
日期和 時間函數
?? <1> sysdate 系統時間
??????? select sysdate from dual;
??????? select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
??????? select to_char(sysdate,'DDD') from dual??
????? select to_char(sysdate,'D') from dual
????? select to_char(sysdate,'DAY') from dual
????? select to_char(sysdate,'yyyy-mm-dd') from dual;
? select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual;
?
?select '''' from dual;
select to_char(sysdate,'SSSSS') from dual;
? --從今天零點以后的秒數
?? <2> ADD_MONTHS 添加月份 得到一個新的日期
??????? select add_months(sysdate,1) from dual;
?????? select add_months(sysdate,-1) from dual;
?????? select trunc(sysdate)-to_date('20050101','yyyymmdd') from dual;
?????? select add_months(sysdate,12) from dual;
?????????? 一年以后的今天
select add_months(sysdate,-12) from dual;
?????????? 一年以前的今天
???? trunc(sysdate) 截取年月日
?
?select sysdate+2 from dual;
??????? 數字代表的是天數
???? 兩個日期之間的差值代表天數
?? <3> last_day? 某月的最后一天
?????? select last_day(sysdate) from dual;
??????
?????? select add_months(last_day(sysdate)+3,-1) from dual;
??????????? 本月第3天的日期
? <4>? months_between 兩個日期之間的月數
???????? select months_between(sysdate,'2005-02-01') from dual;
???????????????? 方向 sysdate - '2005-02-01'
????? select months_between('2005-02-01',sysdate) from dual;
????
?轉換函數
?? to_char?? 把日期或數字類型變為字符串
?????? select to_char(sysdate,'hh24:mi:ss') from dual;
?????? select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;
?????? select sal,to_char(sal,'L9,999') from emp;
???????????? L本地貨幣
? to_number?? 把字符串變成數字
????? select to_number('19990801') from dual;
?
? to_date???? 把字符串變成日期
????? select to_date('19800101','yyyymmdd') from dual;
????? select to_char(to_date('19800101','yyyymmdd'),
??????? 'yyyy"年"mm"月"dd"日"') from dual;?????
?數學函數
??? ceil(x)? 不小于x的最小整數
??????? ceil(12.4)?? 13
??????? ceil(-12.4)?? -12
??? floor(x)? 不大于x的最大整數
??????? floor(12.5)? 12
??????? floor(-12.4)? -13
?? round(x)? 四舍五入
???? round(12.5)?? 13
???? round(12.456,2) 12.46
?? trunc(x)? 舍去尾數
???? trunc(12.5)? 12
???? trunc(12.456,2)? 12.45
??? 舍去日期的小時部分
???? select to_char(trunc(sysdate),'yyyymmdd hh24:mi:ss') from dual;
?? mod(x,n)? x除以n以后的余數
???? mod(5,2) 1
???? mod(4,2) 0
?? power(x,y)? x的y次方
??? select power(3,3) from dual;
????
?
混合函數
????? 求最大值
?? select greatest(100,90,80,101,01,19) from dual;
??
????? 求最小值
?? select least(100,0,-9,10) from dual;
????? 空值轉換函數 nvl(comm,0) 字段為空值 那么就返回0 否則返回本身
?? select comm,nvl(comm,0) from emp;
????? comm 類型和 值的類型是 一致的
??
復雜的函數
?? decode?? 選擇結構? (if ... elseif .... elesif ... else結構)
???
要求:
?? sal=800? 顯示低工資??
?? sal=3000? 正常工資
?? sal=5000? 高工資
??? 只能做等值比較
? select sal,decode(sal,800,'低工資',3000,'正常工資',5000,'高工資','沒判斷')
? from emp;
?表示如下的if? else 結構
???? if sal=800 then
??????? '低工資'
???? else if sal =3000 then
??????? '正常工資'
???? else if? sal = 5000 then
???????? '高工資'
???? else
??????? '沒判斷'
???? end if
?????????
?? sal > 800?????????? sal -800 > 0??
?判斷正負
? sign(x)?? x是正? 1
??????????? x是負? -1
??????????? x是0?? 0
??? select sign(-5) from? dual;
?如何做大于小于的比較????
? sal<1000? 顯示低工資?? sal-1000<0?? sign(sal-1000) = -1
?? 1000<=sal<=3000? 正常工資
?? 3000<sal<=5000? 高工資
?? select sal,decode(
???????????? sign(sal-1000),-1,'低工資',
??????????? decode(sign(sal-3000),-1,'正常工資',
??????????????????????????? 0,'正常工資',1,
??????????? decode(sign(sal-5000),-1,'高工資','高工資')
???????????? )) as 工資狀態 from emp;
?????
? 一般的情況? decode(x,y1,z1,y2,z2,z3)
????? if x= y1 then
????????? z1?????????
????? else if x = y2 then
????????? z2
????? else
???????? z3
????? end if?
分組函數?? 返回值是多條記錄 或計算后的結果
????? group by
????? sum
????? avg
<1>? 計算記錄的條數 count
? select count(*) from emp;
? select count(1) from emp;
? select count(comm) from emp; 字段上count 會忽略空值
????? comm不為空值的記錄的條數
? 統計emp表中不同工作的個數 ????
?? select count(distinct job) from emp;
?? select distinct job from emp;
?? select distinct job,empno from emp;
?? select job,empno from emp;
??? 得到的效果是一樣的,distinct 是消去重復行
?????????????????????? 不是消去重復的列
?<2>group? by 分組統計
???? --在沒有分組函數的時候
???? --相當于distinct 的功能
???? select job from emp group by job;
???? select distinct job from emp;
?? --有分組函數的時候
?? --分組統計的功能
?? 統計每種工作的工資總額是多少??
???? select job,sum(sal) from emp
????????? group by job;?????? --行之間的數據相加
???? select sum(sal) from emp;? --公司的工資總額
?統計每種工作的平均工資是多少???
???? select job,avg(sal) from emp
????????? group by job;???
??? select avg(saL) from emp; --整個公司的平均工資
?顯示平均工資>2000的工作???
?? <1>統計每種工作的平均工資是多少
?? <2>塞選出平均工資>2000的工作?????
??? 從分組的結果中篩選 having
?? select job,avg(sal) from emp
????????? group by job
????????? having avg(sal) > 2000;
?? group by 經常和having搭配來篩選
計算工資在2000以上的各種工作的平均工資????
? select job,avg(sal) from emp
????????? where sal > 2000
????????? group by job
????????? having avg(sal) > 3000;
??? 一般group by? 和 having搭配
??????? 表示對分組后的結果的篩選
???? where子句 --- 用于對表中數據的篩選??
?
? <3> max min
?? select max(sal) from emp;
???? 公司的最高工資
?? select min(sal) from emp ;
???? 公司的最低工資
找每個部門的最高和最低的工資??
? select deptno,max(sal),min(sal) from emp
???? group by deptno;
找每個工作的最高和最低的工資??
? select job,max(sal),min(sal) from emp
???? group by job;
找每個部門中每種工作的最高和最低的工資??
? select deptno,job,max(sal),min(sal)
?? from emp
?? group by deptno,job;
?select max(sal),min(sal)
?? from emp
?? group by deptno,job;
??? 單個字段如果沒有被分組函數所包含,
?????? 而其他字段又是分組函數的話?????
????? 一定要把這個字段放到group by中去
?<4>關聯查詢
????? 多張表,而表與表之間是有聯系的
?????? 是通過字段中的數據的內在聯系來發生
?????? 而不是靠相同的字段名來聯系的或者是否有主外鍵的聯系是沒有關系的
????? select dname,ename from emp,dept;
???????? 笛卡爾積? (無意義的)
????? --當2個表作關聯查詢的時候一定要寫關聯的條件
????? --N個表 關聯條件一定有N-1個
????? select dname,ename from mydept,myemp
?????? where mydept.no = myemp.deptno;
????? 多表查詢的時候一定要有關聯的條件
??????? --使用的表的全名
??????? select dname,ename from emp,dept
???????? where emp.deptno = dept.deptno ;
???????
??????? --使用表的別名
???????? select dname,ename,a.deptno from emp a,dept b
???????? where a.deptno = b.deptno and a.deptno = 10;
?????? --等值連接(內連接-兩個表的數據作匹配a.deptno = b.deptno )
???????? select dname,ename,a.deptno from
???????? emp a inner join dept b
???????? on a.deptno = b.deptno;
???????? where a.deptno = 10;
?????? --on寫連接條件的
?????? --where中寫別的條件
?????? --使用where/on
???????? select dname,ename,a.deptno from emp a,dept b
???????? where a.deptno = b.deptno and a.deptno=10;
????????
????????? --on中寫連接條件
????????? --where中寫其他的條件
????????? select dname,ename,a.deptno from
???????? emp a inner join dept b
???????? on a.deptno = b.deptno
???????? where a.deptno = 10 ;
?????? --外連接
???????? 左外連接 右外連接? 全外連接
???????? (+)寫法只有在ORACLE中有效
??????? select dname,ename,b.deptno
??????? from emp a,dept b
??????? where a.deptno(+) = b.deptno;
?????? --標準寫法
???????? select dname,ename,b.deptno
??????? from emp a right outer join dept b
??????? on a.deptno = b.deptno;????????
??????? select dname,ename,b.deptno
??????? from emp a,dept b
??????? where a.deptno = b.deptno(+);
??? --標準寫法
???????? select dname,ename,b.deptno
??????? from emp a left outer join dept b
??????? on a.deptno = b.deptno;????????
??? --標準寫法(全外聯)?
?????????? select dname,ename,b.deptno
??????? from emp a full outer join dept b
??????? on a.deptno = b.deptno;????
??
??? --自連接
??????? select a.ename as 員工姓名,b.ename as 經理名字 from emp a,emp b
??????? where a.mgr = b.empno(+);
????????????? a.empno = b.mgr? ???????
?
?<5>子查詢
??? 在select語句中嵌套了另一個select語句
???? 1)where 子句中嵌套子查詢
???? 2)用子查詢的結果 作為字段來出現
--1)where 子句中嵌套子查詢,執行順序是
????? 先執行子查詢 再執行主查詢
? 找出工資高于公司平均工資的所有員工??
?? select * from emp where sal+nvl(comm,0) > (select avg(sal+nvl(comm,0)) from emp);
?? 高于部門30中員工最高工資的其他員工???
????
? select * from emp where? sal+nvl(comm,0) > all (select sal+nvl(comm,0) from emp
?????????????? where deptno = 30);
?? 低于部門30中員工工資的其他員工???
? select * from emp where? sal+nvl(comm,0) < all (select sal+nvl(comm,0) from emp
?????????????? where deptno = 30);
? select * from emp where? sal+nvl(comm,0) < any (select sal+nvl(comm,0) from emp
?????????????? where deptno = 30);
--2)用子查詢的結果 作為字段來出現?
????? 先執行主查詢 再執行子查詢
? <1>找員工姓名和直接上級的名字
?? select ename as 員工姓名,(select ename from emp where empno = a.mgr) as 經理姓名
?? from emp a;??????
?<2>顯示部門名稱和人數
? select dname,(select count(*) from emp where deptno=a.deptno) as rs from dept a;
?<3>顯示每個部門的最高工資的員工
??? select * from emp a where (deptno, sal) in? (? select deptno,max(sal) from emp group by deptno);
?
?select a.* from emp a,(? select deptno,max(sal) as msal from emp group by deptno) c where a.deptno = c.deptno and
a.sal = c.msal;
--最大值和最小值的比較 轉化為人數的比較
select * from emp a where (select count(*) from
?emp where deptno = a.deptno and
?sal > a.sal) = 0 and a.deptno is not null;
?<4>顯示每個部門的工資前2名的員工
select * from emp a where (select count(*) from
?emp where deptno = a.deptno and
?sal > a.sal) <=1 and a.deptno is not null;
<6> 層次查詢
--level 偽列 層次查詢的時候可以使用的? 層的編號
? select lpad('+',level,' ')||ename from emp
???? connect by prior empno = mgr --父子關系 父結點中的empno = 子節點中的mgr
???? start with mgr is null;--從 mgr is null的節點 開始遍歷
select lpad('+',level,' ')||ename from emp
???? connect by prior empno = mgr
???? start with ename = 'BLAKE';
<7> TOP 前幾行 (sqlserver)
??? rownum? (oracle偽列)
?--emp表的前2行
?--rownum必須使用<=的關系比較運算符
?select * from emp where rownum <= 2;
?select top 2 * from emp; --sqlserver的寫法
?select * from emp where rownum = 1;
?--公司工資最高的2個人
?/*select * from emp
?where rownum <= 2
order by sal desc;*/ 錯誤的
?? select * from (select * from emp order by sal desc)
?? where rownum <= 2;
?--分頁查詢
? --每頁顯示4行 一共有14行記錄
? 第1頁??? 第1-4行
? 第2頁??? 第5-8行
? 第3頁??? 第9-12行
? 第4頁??? 第13-14行
?--希望每次頁面顯示的時候 都只查詢回需要的記錄
?
?? select * from (select rownum as num,emp.* from emp)
?? where num >= 9 and num <= 12;
?? select * from (select rownum as num,emp.* from emp)
?? where num >= 13 and num <= 14;
<例子>
建立表如下:
學生基本信息表
CREATE Student(
[Studentid][Int]IDENTITY(1,1)NOT NULL primary key,--主鍵
[StudentName][char]NOT NULL
)
課程信息表
CREATE Subject(
[SubjectID][char]NOT NULL primary key,?????? --主鍵
[SubjectName][char]NOT NULL
)
成績表
CREATE Grade(
[Studentid][Int]NOT NULL,??--聯合主鍵
[SubjectID][char]NOT NULL,??--聯合主鍵
[Grade] [INT]NOT NULL,
primary key (studentid,subjectid)
)
1.將建表命令改為ORACLE語句在ORACLE中建表
create table student( --學生表
studentid number(3) primary key, --學生編號
studentname varchar2(20) --學生的姓名
);
create table subject( --課程表
subjectid char(3) primary key, --課程編號
subjectname varchar2(20)? --課程的名字
);
create table grade( --分數表
studentid number(3) references student(studentid), --學生id
subjectid char(3) references subject(subjectid), --課程id
mark????? number(3), --分數
primary key (studentid,subjectid) --聯合主鍵
);
?
insert into student values (101,'張三');
insert into student values (102,'李云');
insert into student values (103,'未');
insert into subject values ('A01','C++');
insert into subject values ('A02','ASP');
insert into subject values ('A03','JAVA');
insert into grade values (101,'A01',59);
insert into grade values (101,'A02',72);
insert into grade values (101,'A03',90);
insert into grade values (102,'A01',75);
insert into grade values (102,'A02',91);
insert into grade values (103,'A01',71);
?
2.作如下4題
第一問:查詢出以下信息
學號 學生姓名 課程名稱 成績 (要全部學生信息)
關聯查詢 (多張表的)
別名
select a.studentid as "學? 號",studentname "學生姓名",
subjectname "課程名稱",mark "成? 績"
from student a , subject b , grade c
where a.studentid = c.studentid
and b.subjectid = c.subjectid;
[select a.studentid "學? 號",studentname "學生姓名",
subjectname "課程名稱",mark "成? 績"
from student a , subject b , grade c] 笛卡爾積
?????? 3 * 3 * 6 = 54;
第二問:查詢出以下信息
學號 學生姓名 課程名稱 成績(只顯示每科最高分)
select a.studentid "學? 號",studentname "學生姓名",
subjectname "課程名稱",mark "成? 績"
from student a,subject b,grade c
where a.studentid = c.studentid
and b.subjectid = c.subjectid
and (subjectname,mark)
in (select subjectname "課程名稱",max(mark) "成? 績"
from student a,subject b,grade c
where a.studentid = c.studentid
and b.subjectid = c.subjectid
group by subjectname)
(最高分---分數比我高的學生的人數=0)
select a.studentid "學? 號",studentname "學生姓名",
subjectname "課程名稱",mark "成? 績"
from student a,subject b,grade c
where a.studentid = c.studentid
and b.subjectid = c.subjectid
and (select count(*) from grade
where subjectid = b.subjectid and
mark > c.mark) = 0
第三問:查詢出以下信息
學號 學生姓名 課程名稱 成績 (成績大于60時的顯示及格,小于60時的顯示不及格)
select a.studentid "學? 號",studentname "學生姓名",
subjectname "課程名稱",
decode(sign(mark-60),-1,'不及格','及格') "成? 績"
from student a,subject b,grade c
where a.studentid = c.studentid
and b.subjectid = c.subjectid
第四問:查詢出以下信息
學號 學生姓名 (查詢出課程超過1門以上學生的信息)
select a.studentid "學? 號",studentname "學生姓名",
count(subjectname)
from student a , subject b , grade c
where a.studentid = c.studentid
and b.subjectid = c.subjectid
group by a.studentid,studentname
having count(subjectname) >= 2
-- select * from emp where rownum > 2;?? 錯誤的
刪除:
?? 在硬盤上的一個隱含安裝的目錄Programm Files下的ORACLE???
??????????????????????????????????????????????????一、開始前的準備
1.啟動Oracle
??? 啟動監聽服務:OracleOraHome90TNSListener
??? 啟動實例服務:OracleServiceOrac
2.Oracle系統用戶
???? Oracle三大系統用戶
??? 默認用:system/welcome
????超級用戶:sys/welcome?? 權限最大
??? 普通用戶:scott/tiger
?3.登錄Oracle的方式
??? Windows窗口下的sqlplus的操作?? ?運行->sqlplusw.exe?
???? DOS下的sqlplus的操作???????????????運行->?sqlplus.exe????
???? 登錄Oracle但不連接數據庫?????????? 運行->sqlplusw /nolog
???? connect 用戶名/密碼@主機連接字符串? 連接到指定用戶
4.Oracle常用操作
show user 查看當前用戶?? select * from tab where tabtype='TABLE'? 查看當前用戶下的表
desc dept???????????? 察看表dept的結構
quit/exit???????????? 退出
clear screen????????? 清除屏幕
set linesize 200????? 設置一行顯示200個字符
set pagesize 20?????? 設置每頁顯示20行
spool 文件名 (spool c:\abc.txt) 作日志文件命令?????????spool off
alter session set nls_date_format = 'yyyy-mm-dd'; 改日期的默認格式
conn /as sysdba???? select * from v$version;查看當前Oracle的版本
conn system/welcome select * from v$tablespace; 查看表空間
5.表空間? 用戶 表三者的關系
?? 一個用戶可以使用一個或多個表空間,一個表空間也可以供多個用戶使用???
?? 用戶和表空間沒有隸屬關系。
?? 表空是一個用來管理數據存儲邏輯概念,表空間只是和數據文件發生關系,數據文件是物理的,
?? 一個表空間可以包含多個數據文件,而一個數據文件只能隸屬一個表空間
??????????????????????????????????????????????????????? 二、常規操作
1.DDL語句(數據定義語言) Data Define Language
?? create? ?alter?? ?drop? ?truncate 開頭的語句 truncate table <表名>
????? 特點:<1>建立和修改數據對象
??????????? ?<2>建立和修改直接存入庫中,直接生效
?創建表空間:Create tablespace Product? datafile 'D:\test\aa.DBF' size 100M
?刪除表空間:Drop tablespace Product
?創建用戶: Create user zhangsan identified by "welcome" default tablespace Product
?修改用戶: Alter? user zhangsan identified by "Hello"
授予用戶連接的權限: ?grant connect to zhangsan;
撤銷用戶連接權限:?? revoke connect?from zhangsan;
授予用戶在表空間創建對象的權限??
grant unlimited tablespace to zhangsan;
grant resource? to zhangsan;??
?????系統特權:unlimited tablespace表示用戶可以在任意表空間中創建對象,且此權限只能授予用戶而不能授予角色
?????resource角色:給用戶RESOUCE權限后,用戶就擁有在所有表空間上建表權限
授予用戶zhangsan對Emp表增、刪、查、改的權限
grant? select? on scott.empa to y2;
????????? delete
????????? update
????????? insert
????????? all? (=select,delete,update,insert)
with grant option 授予用戶權限,則接受權限的用戶可以將此權限授予其他用戶.
(1).建表,并指定表空間
??示例: Create table tab1
????????? (
???????????? no number(4),
???????????? name varchar2(10)
????????? )tablespace Product;
?學生表? Student
???????Create table student
?????? (?
???????? xh number(4) primary key, --學號
???????? name varchar2(10) not null, --姓名
???????? sex? char(2)? check (sex in ('男','女')),--性別
???????? birthday date,--生日
???????? sal number(7,2), --獎學金
???????? classid number(2) references class(classid) --班級?????????
?????? );?班級表class
???????? Create table class
???????? (
? ??????? classid number(2), --班級編號
????????? cname varchar2(20) --班級名字
???????? );
?外鍵引用的列一定是主鍵或有unique約束的列
? drop table student;? 刪除表的結構和數據
? delete from student; 只刪除數據,速度慢,數據可以恢復
? truncate table student; 刪除記錄的 速度快 數據不能恢復
? 添加字段(學生所在班級classid)
????? alter table student add (classid number(2));
? 修改字段的長度
????? alter table student modify (xm varchar2(12)) ;
? 修改字段的類型(不能有記錄的)
????? alter table student modify (xh varchar2(5));
? 刪除一個字段
????? alter table student drop column sal;
? 刪除表
????? drop table student;
? 表的名字修改
????? rename student to stu;
? 字段如何改名字
????? --先刪除
????? a)alter table student drop column sal;????????
????? --再添加
????? b)alter table student add (salary number(7,2));
Number數據類型的存儲范圍
精度??? 存儲字節數
1 - 9?????? 5
10-19???? 9
20-28??? 13
29-38??? 17?
???????????????????????? Oracle數據操作語言 DML
接上一篇:
2.?DML語句(數據操作語言) Data Manupilate Language????
?? select
?? insert
?? delete
?? update
???? 特點:<1>對數據起作用的
??????????? <2> 這些語句的修改是在內存中發生的
???????????? 要想改動存入庫中必須要commit語句
查看當前用戶的所有權限
select * from session_privs;
查看當前用戶下的所有表
select * from tab where tabtype='TABLE';
3.?TCL(事務控制語句) Transaction Control Language
? commit;? 提交? 修改保存到數據庫中
? rollback; 回滾? 取消內存中的改動
? savepoint;保存點 分解事務的 把事務變小
?????? DDL語句 會自動提交以前未提交的事務
?????? 關閉SQLplus工具 也會自動提交未提交的事務的
? 事務 -- 就是一個完整的對數據的DML操作
? 所有事務 都是要明確的提交和回滾的
? --轉賬
??? update 賬目表
??? set 錢=錢-500
??? where 帳號='A';
??? update 賬目表
??? set 錢=錢+500
??? where 帳號='B';
??? commit;
??? 事務何時存在 DML語句中除select以外都會有事務
??
《《《《《《《注意》》》》》 / 重復運行上一條SQL語句??
? commit;??? 結束上一個事務 并且開始一個新的事務
? update student set sal = null where xh =1000;
? savepoint c111;
??
? insert into student(xh,name,sex) values (1004,'MIKE','男');
? rollback to c111; --撤銷了插入的數據
? rollback;? --從c111這個點回滾到事務的開始點
《SQLPLUS規則》?
?? a)DML語句后跟上DDL語句 DML語句的事務會被自動提交
?? b)exit/quit命令 退出 SQLPLUS環境時也會自動提交事務
????? 點小叉子關閉sqlplus窗口 事務都自動回滾了
?? c)非法操作是不能提交事務的 ,只能導致事務回滾
?
《4》 DCL語句(數據控制語句) Data Control Language??????????????????? grant 授予權限
???? revoke 撤銷權限
?? 權限 select ,insert,delete,update
??????? all (select ,insert,delete,update 總和)
?? 角色 connect (登陸數據庫),resource(建立表和對象)
??
?? 如何建一個自己的用戶?
???? 必須是超級用戶才能建用戶
???? --連接到超級用戶
???? connect system/manager
???? --建立用戶名zhangsan 密碼m123
???? create user zhangsan identified by m123;
???? --授予必要的權限connect 你能夠連接
??????????????????? resource 你能建表不受空間的限制,建立對象
???? grant connect,resource to zhangsan;
???? --這個普通用戶就建好了 和scott用戶的權限是一樣的?????
???? grant DBA to zhangsan; --張三的權限和System一樣
??
???? --改張三的密碼
??? <<1>> 自己改自己的密碼
??????? connect zhangsan/m123
??????? 密碼改為了mm1?
??????? alter user zhangsan identified by mm1;
??? <<2>> 超級用戶來改
??????? connect system/manager
??????? alter user zhangsan identified by mm1;?
繼續上一篇:
???????????????????????????????????????????????????????????????給表添加約束
?? 主鍵約束 --? 每個表要有主鍵,唯一的標識一行數據
?? 非空約束
?? 唯一性約束
?? 外鍵約束
?? 檢查約束
查看一個表的約束:
????? select constraint_name,constraint_type
????? from user_constraints
??????where table_name = '表名'
查看約束作用于那個字段:
???? select * from user_cons_columns
??? ?where CONSTRAINT_NAME='約束名;
??1.建立表的同時使用約束
??????? create table student( --學生表
?????????? xh number(4) primary key, --學號主鍵
?????????? xm varchar2(10) not null, --姓名不能為空
?????????? sex char(2)? check (sex in ('男','女')), --性別
?????????? birthday date unique, --日期
?????????? sal number(7,2) check (sal between 500 and 1000),--獎學金 sal >=500 and sal <=1000
?????????? classid number(2) references cla(id)
??????? );? --必須要先有cla表才對
??????????? --一定先建立班級cla表
?2.建立約束的同時給約束指定名字,便于刪除
??????? create table stu( --學生表
????????? xh number(4) constraint pk_stu primary key, --學號是主鍵
????????? xm varchar2(20) constraint nn_stu not null, --姓名非空
????????? age number(2) constraint ck_stu check (age between 10 and 90),
????????? birthday date,
????????? shenfenzheng number(18) constraint uq_stu unique, --身份證唯一?
????????? classid number(2) constraint fk_stu references cla(id) -- 班級編號外鍵
?????????? --(引用的一定是另外表的主鍵或唯一性約束的字段)
???????? );
3.建完表后加約束
添加主鍵約束:alter table student add constraint pk_stu primary key (xh);
添加非空約束:alter table student modify (xm not null);
檢查約束:
alter table student add check(sex in ('男','女'));
alter table student add constraint ck_sal check(sal between 500 and 1000));
添加外鍵約束:??? alter table student add constraint fk_stu? foreign key (classid) references cla(id);
添加唯一約束:? alter table student add constraint? uq_sfz unique(shenfenzheng);
4.刪除約束:
? 格式:alter table 表名 drop constraint 約束名
??? ?alter table student drop constraint? fk_stu;
?
?????????????????????????????????????????? SQL函數
單行函數: 返回值只有1個,可以出現在Select字句或Where字句中
分組函數: 返回值是多條記錄
一。單行函數:
?? 1.ASCII
返回與指定的字符對應的十進制數;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
??????? A???????? A????? ZERO???? SPACE
--------- --------- --------- ---------
?????? 65??????? 97??????? 48??????? 32
? 2.CHR
??? 給出整數,返回對應的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;
ZH C
-- -
趙 A
3.CONCAT
連接兩個字符串;
SQL> select concat('010-','88888888')||'轉23'? 高乾競電話 from dual;
高乾競電話
----------------
010-88888888轉23
?
4.INITCAP
返回字符串并將字符串的第一個字母變為大寫;
SQL> select initcap('smith') upp from dual;
UPP
-----
Smith
5.INSTR(C1,C2,I,J)
在一個字符串中搜索指定的字符,返回發現指定的字符的位置;
C1??? 被搜索的字符串
C2??? 希望搜索的字符串
I???? 搜索的開始位置,默認為1
J???? 出現的位置,默認為1
SQL> select instr('oracle traning','ra',1,2) instring from dual;
?INSTRING
---------
??????? 9
6.length???? 返回字符串的長度;
7.LOWER??? 返回字符串,并將所有的字符小寫
8.UPPER????? 返回字符串,并將所有的字符大寫
9.RPAD和LPAD(粘貼字符)
RPAD? 在列的右邊粘貼字符
LPAD? 在列的左邊粘貼字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;
LPAD(RPAD('GAO',1
-----------------
*******gao*******
不夠字符則用*來填滿
10.LTRIM和RTRIM
LTRIM(字符串,值)? 刪除字符串左邊指定的值
RTRIM(字符串,值)? 刪除字符串右邊指定的值
11.SUBSTR(string,start,count)
取子字符串,從start開始,取count個
12.REPLACE('string','s1','s2')
string?? 希望被替換的字符或變量
s1?????? 被替換的字符串
s2?????? 要替換的字符串
13.SOUNDEX
返回一個與給定的字符串讀音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');
SQL> select xm from table1 where soundex(xm)=soundex('weather');
XM
--------
weather
wether
14.ROUND和TRUNC
按照指定的精度進行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
???????? 56????????? -55????????? 55????????? -55
15.Least('表達式1','表達式2','表達式3')? 返回一組表達式中的最小值
16.TO_NUMBER? 將給出的字符轉換為數字
17.TO_DATE(string,'format') 將字符串轉化為ORACLE中的一個日期
18.NEXT_DAY(date,'day')?? 給出日期date和星期x之后計算下一個星期的日期
19..MONTHS_BETWEEN(date2,date1) 兩個日期相差的天數
20.Decode(字段1,值1,結果1,值2,結果2...,默認值)
21.nvl(表達式1,表達式2) 表達式1為NULL,返回表達式2;不為NULL,返回表達式1。注意兩者的類型要一致
22.nvl2(a,b,c)?
表達式1不為NULL,返回表達式2;
?????????????為NULL .返回表達式3。表達式2和表達式3類型不同的話,表達式3會轉換為表達式2的類型
23.nullif (expr1, expr2) ->相等返回NULL,不等返回expr1
分組函數
? AVG([{DISYINCT|ALL}]) distinct去掉重復的數據 all所有數據
? Max
?SUM
?Count? 計數函數
?? count(*)? 統計所有的行,包括重復的值和空值
?? count(col_name) 統計列中非空值的個數
?? count(distinct col_name) 統計列中除去空值和重復值的行數
分析函數:
?? 作用:用于完成對聚集的累計排名,移動平均數和報表計算。
?????????? 分析函數是查詢中執行的最后一組操作,只能出現在select列表或order by 字句
?row_number() over([Partition by column] order by column)? 返回唯一排序值select
按工資排名:
?ename,job,deptno,sal,row_number() over(order by sal desc) as A from empa;
按部門分組再按工資排名?
select ename,job,deptno,sal,row_number() over(Partition by deptno order by sal desc) as A from empa
rank() 計算一個值在一組值中的排位,排位從1開始,相等值的行排位相同,序數跳躍相應值.
?? select ename,sal,comm,deptno,rank() over(partition by deptno order by sal desc) from empa;
dense_rank() 計算一個行在一組有序行中的排位,排位從1開頭的連續整數,具有相等值,排位相同。排位是連續的。
select d.dname,e.ename,e.sal,dense_rank() over(partition by e.deptno order by e.sal desc) denserank
from empa a,dept d where e.deptno=d.deptno
繼續上一篇
???????????????????????????????????????????????1.?? 序列
查詢當前用戶下的序列:select * from user_sequences
定義:用來生成唯一、連續的整數的數據庫對象,序列通常用來自動生成主鍵或唯一鍵的值、可升、可降序排列.
語法:??? Create? sequence 序列名稱???//從1開始 每次自動增加1 沒有最大值
???????????? [star with 值]? 指定要生成的第一個序列號,對于升序默認值為最小值、反之...
???????????? [increment? by 值]?? 間隔數
???????????? [maxvalue? 值|nomaxvalue]? 序列最大值,如果指定為nomaxvalue,則升序最大值為10的27次方,降序-1.
???????????? [minvalue??? 值|nominvalue]? 序列最小值,-----------------------升序為1,降序為10的負26次方
???????????? [cycle|nocycle]?? cycle指序列到達最大或最小時,將從頭開始生成值? nocycle值不在生成
???????????? [cache? 值|nocache]? 預先分配一組序列號,將其保存在內存中. 默認緩存20個序列
訪問序列方法:? currval 和nextval?? --當前序列 select 序列名.currval from dual
更改序列:Alter sequence 序列名
刪除序列:drop sequence 序列名
注意-------------序列使用時需要先用nextval輸出完以后再來使用
使用:
? 1.和表關聯作為表的字段的值
???? a) create table student(
????????? xh number(4) primary key, --學號
????????? xm varchar2(20) not null --姓名
??????? );
??????? 要求:學號字段 從1000開始每次增加4 最大值9999
???????? --建立序列
?????????? create sequence xh_seq
????????????????? start with 1000 --從1000開始
????????????????? increment by 4? --每次增加4
????????????????? maxvalue 9999?? --最大值 9999
????????????????? ;
???????? --使用SQL語句關聯
???????? insert into student values
???????????? (xh_seq.nextval,'Mike');
???????? insert into student values
???????????? (xh_seq.nextval,'John');
???????? insert into student values
???????????? (xh_seq.nextval,'Rose');
????
????? --特點:能產生唯一的值,但是不能保證值在表中的連續性
?
?? b) create table teacher(
?????????? teacherxh varchar2(10) primary key,
?????????? teachername varchar2(20)
????????? );
???? 要求:教師的編號的格式是TH00001
???????????????????????? TH00002
????????????????????????? ....
?????
?? --建立序列
??????? create sequence teacher_seq
????????????? maxvalue 99999;
?? --
???? insert into teacher values ('TH'||
?????? ltrim(to_char(teacher_seq.nextval,'00000')),
?????? '張三');
?????? insert into teacher values ('TH'||
?????? ltrim(to_char(teacher_seq.nextval,'00000')),
?????? '李');
????? insert into teacher values ('TH'||
?????? ltrim(to_char(teacher_seq.nextval,'00000')),
?????? '王');
??????????????????????????????????????????????????????????????2.視圖
查看當前用戶下的視圖:select view_name from user_views;
作用:隱藏數據,增加系統的安全性
語法:Create [or replace] [Force|noForce] veiw 視圖名 [(別名1,別名2...)]
???????? AS 子查詢
???????? [with check option [constraint 約束名]]
???????? [with read only]??視圖是只讀的
?其中:or replace 表示替代已經存在的視圖
???????? force 表示不管基表是否存在,創建視圖
???????? ?noforce 表示只有基表存在時,才創建視圖.
???????? 別名是為子查詢中選中的列新定義的名字,替代查詢表中原有的列名。
???????? with check option 對視圖操作時必須滿足子查詢的約束條件。后面的約束名是該約束條件的名字
?????????刪除視圖者需要是視圖的建立者或者擁有DROP ANY VIEW權限。視圖的刪除不影響基表,不會丟失數據
對視圖操作需滿足以下條件:
??????????<1>建立視圖的select語句必須是簡單的select語句
?????????????? 簡單:不能是多表的查詢
??????????????????? 不能有分組函數
?????????? <2>建立視圖的時候不能帶with readonly關鍵字
例:
create?or?replace?view?emp_v2?
?as?--select語句
??select?empno,ename,sal?from?emp?
??with?read?only;??--只讀視圖
??????????????????????????????????????????????????????????????? 3.同義詞
查看用戶創建的同義詞:select * from user_synonum;
定義:數據庫對象的一個別名
用途:1.簡化SQL
??????? 2.隱藏對象名稱和所有者
????????3.為分布式數據庫的遠程對象提供了位置透明度
??????? 4.提供對象的公共訪問
注意:使用同義詞前需要確保用戶得到訪問同義詞的權限
同義詞分為:
?1.私有同義詞? --只能被當前用戶模式訪問? 要在自身模式下創建須 Create synonum 權限
?2.共有同義詞? --須Create any synonym權限
語法: Create [or replace] [public]?synonym 同義詞名稱 for 要創建同義詞對象的名稱
?????????????????????????????????????????????????????????????????4.索引
作用:加快查詢? 索引一定是建立在表上的.
語法:Create Index?索引名 on?表名(列名)
創建唯一索引: Create unique?Index 索引名 on 表名(列名)
創建位圖索引: Create bitmap Index 索引名 on 表名(列名)
數據的不同值對于記錄的行數來說 是個很小的數 ?這種字段適合使用位圖索引 它比普通索引效率高
不能用索引的條件:
<1>規則1:索引的字段不能參與運算
<2>規則2:索引的字段上不能使用函數?
????????????????????????????????????????????????????????????? 5.簇
定義:用于多表聯合查詢,提高數據查詢效率
1.簇的創建必須在創建表結構時指定
2.如果使用簇,則兩個表必須要有主外鍵關系
簇的使用步驟:
1.創建簇??? Create cluster 簇名稱(字段名 數據類型);
2.創建主鍵表使用簇
Create table depa (
??? deptno number(2) primary key,
??? dname varchar2(20)
?) cluster?簇名(deptno);
3.創建外鍵表使用簇
Create table?empa(
?? empno number(4) primary key,
?? ename varchar2(20)
?? ) cluster 簇名(empno)
4.在簇上建立索引
Create Index??索引名?on?cluster 簇名
繼續上篇的學習
???????????????????????????????????????????????????? Oracle性能對象
要點:分區必須是在創建表的結構時指定,分區方式一旦指定是不能改變的。
分區方式:
1 范圍分區
2 散列分區
3復合分區
3列表分區
表分區的優點:
一、改善表的查詢性能
二、表更容易管理,表的數據存儲在多個部分,按分區加載和刪除數據更快
三、便于備份和恢復
四、提高數據安全性
-----------注意:要分區的表不能具有Long和Long raw數據類型
范圍分區:根據表的某個列或一組列的值范圍,決定將數據存儲在那個分區
create?table?niegc_part
?(
?part_id?integer?primary?key,
?part_date?date,
?part_dec?varchar2(100)
?)
?partition?by?range(part_date)--根據日期分區
(
??partition?part_01?values?less?than(to_date('2006-01-01','yyyy-mm-dd'))?tablespace?dw1,
?partition?part_02?values?less?than(to_date('2007-01-01','yyyy-mm-dd'))?tablespace?dw2,
??partition?part_03?values?less?than(maxvalue)?tablespace?dw1
?);
?
散列分區
??? ? 散列分區通過指定分區編號來均勻分布數據的一種分區類型,因為通過在I/O設備上進行散列分區
,使行這些分區大小一致。如將part_id的數據根據自身的情況散列地存放在指定的二個表空間中:
create?table?niegc_part
(
part_id?integer?primary?key,
part_date?date,
part_dec?varchar2(100)
)
partition?by?hash(part_id)
(
partition?part_01??tablespace?dw1,
partition?part_02??tablespace?dw2
);
--系統將按part_id將記錄散列地插入二個分區中,這里也就是二個不同的表空間中。
復合分區:范圍分區和散列分區的結合
--語法
???partition?by?range(列1)
???subpartition?by?hash(列2)
???subpartition?分區數目?[tore?in?(表空間1,表空間2)]
???(
??????partition??part1?values?less?than?(值1),
?????partition??part2?values?less?than?(maxvalue)
????)
--例:對emp表的復合分區,先按薪資分再按部門分
????partition??by?range(sal)
???subpartition?by?hash(empno)
???(
?????partition?p1?values?less?than('1501')
???????(
??????????subpartition?sp1?tablespace?a1,
??????????subpartition?sp2?tablespace?a2
???????)
?????partition?p2?values?less?than('3001')
???????(
??????????subpartition?sp3?tablespace?a1,
??????????subpartition?sp4?tablespace?a2
???????)
???)
--查看表分區?select?*?from?emp?partition(p1)
????????????select?*?from?emp?subpartition(sp1)
列表分區:允許用戶明確地控制行到分區的映射
--語法
????partition??by?list(列名)
???(
???????partition?part1?values(值1),
???????partition?part2?values(值2),
???????partition?part3?values(default)
??--default關鍵字用于存儲前面的分區不能存儲的記錄
??)
??????????????????????????????????????????????????????? 分區的維護操作
1.添加分區
??? alter? table Table add partition 分區名 values less than (值)
?? 如果邊界是maxvalue 使用split partition語句
??? alter table Table split? partition 分區名 at (值)
2.刪除分區
??? alter table Table drop partition 分區名
3.截斷分區 (只刪除記錄,不刪除結構)
??? alter table Table truncate partition 分區名
4.合并分區?
??? alter table Table merge partitions p1,p2 into partition p2
5.拆分分區
??? alter table Table split partition 分區1 at (值) into(partition 分區1,partition 分區2)
6.移動分區
??? alter table Table move partition 分區 tablespace(表空間名)
繼續上篇的學習
?????????????????????????????????????????????????????????????? PL/SQL簡介
?? PL/SQL(Procedural Language Sql,過程語言|SQL)是結合了Oracle過程語言和結構化查詢語言(SQL)的一種擴展語言.
?? PL/SQL塊是一段后臺服務程序,它負責將數據從數據庫中取出來,在PL/SQL塊中進行處理,將處理的結果送到數據庫.
優點:
? 1,支持SQL
? 2,支持面向對象編程(OOP)
? 3,更好的性能
? 4,可移置性
? 5,與SQL集成?--支持所有SQL數據類型和Null值?,另%type? %rowType屬性類型更加強了這種集成
? 6,安全性
PL/SQL塊包括3個部分:
1,聲明部分??? --變量,游標,自定義異常, 局部子程序
2,可執行部分?? --執行命令,可嵌套子塊
3,異常處理部分
?1PL/SQL塊
?2??declare
?3
?4??begin
?5???--SQL語句
?6???--直接寫的SQL語句(DML/TCL)
?7???--間接寫execute?immediate?<DDL/DCL命令字符串>?
?8???--select?語句
?9?????????<1>必須帶有into子句
10?????????????select?empno?into?eno?from?emp
11???????????where?empno?=7369;
12????????<2>只能查到一行**********
13????????<3>字段個數必須和變量的個數一致
14??exception??--異常
15????when?<異常名字>?then?--特定異常
16????????<處理語句>
17????when?others?then??--所有異常都可捕獲
18????????<處理語句>???
19??end;
20
語言特征:
<1>,大小寫不敏感
<2>,復合符號的含義
?? :=?? 賦值操作符?? ||連接操作符??..范圍操作符? **求冪操作符?《,》標簽分隔符??? --單行注釋? /*,*/多行注釋
<3>聲明變量?? --變量名? 數據類型 :=值? 例: varA? varchar2(10):='聲明變量';
<4>聲明常量?? --變量名 constant 數據類型 := 值??
---------------- 技巧:初始化變量和常量時,保留字default可替換:=賦值操作符--------------
<5>屬性類型
?? %type?? --引用某個變量或數據庫列的數據類型來聲明變量
?? %rowType? --提供表示表中一行的記錄類型
<6>控制結構
?? a,條件控制? if? then??或???? if? then? else? ?或????if? then? elsif?? 或???? case
?? b,循環控制 loop
????????????????? while????????????? exit或exit when退出
??????????????????for
?? c,順序控制? Goto??????????? ?Null語句
?語法示例:
??1--PL/SQL?簡單語法
??2
??3Begin
??4??null;??
??5End;
??6/
??7
??8Declare
??9??varA?number(4);
?10Begin
?11??varA?:=?1234;
?12??DBMS_output.put_line(varA);
?13End;
?14/
?15
?16Declare
?17??varA?number(4);
?18Begin
?19??varA?:=?1234;
?20??DBMS_output.put_line(varA);
?21??Declare
?22????varB?number(4):=2234;
?23??Begin
?24????DBMS_output.put_line(varA);
?25????DBMS_output.put_line(varB);
?26??End;
?27??DBMS_output.put_line(varB);
?28End;
?29/
?30
?31Declare
?32??varA?number(4);
?33??varB?number(4):=2234;
?34Begin
?35??varA?:=?1234;
?36??DBMS_output.put_line(varA||'??'||varB);
?37End;
?38/
?39Begin塊?注意事項:
?40--?數據定義語言不能直接執行
?41Begin
?42??drop?table?depta;
?43End;
?44/
?45
?46--?select不能直接執行
?47select??--必須使用select?into?形式,只能且必須返回一行
?48Declare?
?49??varE?empa%rowType;??--與表的一行類型一樣
?50??vno?empa.empno%type;??--?與表的某列類型一樣
?51Begin
?52??vno?:=?7902;
?53??select?*?into?varE?from?empa?where?empno?=?vno;
?54??DBMS_output.put_line(?varE.ename||'??'||varE.job);
?55End;
?56/
?57
?58inset??--可以直接執行
?59Declare
?60??vno?empa.empno%type;
?61??vna?empa.ename%type;
?62??vjob?empa.job%type;
?63Begin
?64??vno?:=?1236;
?65??vna?:=?'Wing';
?66??vjob?:=?'MANAGER';
?67??insert?into?empa?(empno,ename,job)?values(vno,vna,vjob);
?68End;
?69/
?70
?71delete?--可以直接執行
?72Declare
?73??vno?empa.empno%type;
?74Begin
?75??vno?:=?5555;
?76??delete?from?empa?where?empno?=?vno;
?77End;
?78/
?79
?80
?81update?--可以直接執行
?82Declare
?83??vno?empa.empno%type;
?84??rsal?empa.sal%type;
?85Begin
?86??vno?:=?1236;
?87??rsal?:=?100;
?88??update?empa?set?sal?=?nvl(sal,0)?+?rsal?where?empno?=?vno;
?89End;
?90/
?91
?92?--事物控制語言可以直接執行
?93Declare?
?94??vno?empa.empno%type;
?95??rsal?empa.sal%type;
?96Begin
?97??vno?:=?1236;
?98??rsal?:=?100;
?99??update?empa?set?sal?=?nvl(sal,0)?+?rsal?where?empno?=?vno;
100??commit;
101End;
102/
103
104?--?數據安全語言(DCL)不能直接執行
105Begin
106??grant?connect?to?scott;
107End;
108/
??例子:
題:編寫程序?向DEPT表中插入一條記錄,
????從鍵盤輸入數據,如果
????數據類型輸入錯誤要有提示
????無法插入記錄?也要有提示
????只能輸入正數,如果有負數提示?
???declare
????n?number;
????no?dept.deptno%type;
????nm?dept.dname%type;
????lc?dept.loc%type;
????exp?exception;???--用戶定義的變量
????exp1?exception;???--用戶定義的變量
????num?number:=0;???--計數器
?????pragma?exception_init(exp,-1);?--預定義語句
????--捆綁Oracle內置異常(-1錯誤和異常變量關聯),-1?主鍵沖突
????pragma?exception_init(exp1,-1476);除零異常
????e1?exception;?--用戶定義的變量
???begin
????--輸入值
??????no?:=?'&編號';
?????num?:=?num?+?1;
?????if?no?<?0?then
????????raise?e1;????--自定義異常的引發
??????end?if;
?????nm?:=?'&名稱';
?????num?:=?num?+1;
?????lc?:=?'&地址';??
?????num?:=?num?+1;
?????n?:=?10?/0;?????
?????insert?into?dept?values?(no,nm,lc);
?????num?:=?num?+1;
?????commit;
???exception
?????--自定義異常
?????when?e1?then
????????dbms_output.put_line('編號不能為負數');?
?????--數據類型不對
?????when?value_error?then?
????????if?num?=0?then??
?????????dbms_output.put_line('編號數據類型不對');?
????????elsif?num?=?1?then
?????????dbms_output.put_line('名稱數據類型不對');?
????????elsif?num?=2?then
?????????dbms_output.put_line('地址數據類型不對');?
????????end?if;
????????rollback;
?????--主鍵沖突
?????when?exp?then
?????????--sqlcode全局變量?異常錯誤號
?????????--sqlerrm全局變量?異常的文字信息??
?????????--dbms_output.put_line('異常的編號:'||sqlcode);
?????????--dbms_output.put_line('異常的內容:'||sqlerrm);
?????????--dbms_output.put_line('編號已存在')?;
?????????rollback;
?????--非預定義異常(關聯錯誤號)?
?????when?exp1?then
????????dbms_output.put_line('0做了除數')?;?
?????????raise_application_error(-20001,'0做了除數');?
?????????--引起一個自定義的錯誤
???????????--預先保留-20001?到?-29999編號
?????????rollback;?
?????--其他的異常?
?????when?others?then
?????????dbms_output.put_line('異常的編號:'||sqlcode);
?????????dbms_output.put_line('異常的內容:'||sqlerrm);
????????--?dbms_output.put_line('出現錯誤');
?????????rollback;
???end;??
轉載于:https://www.cnblogs.com/wayne-ivan/archive/2009/02/23/1396514.html
總結
以上是生活随笔為你收集整理的从零开始学习Oracle—安装及删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArcGIS Server9.3+Arc
- 下一篇: spring cache相关注解介绍 @