【正文】
39。選定行數(shù)過多!39。 (v_temp)。declare v_temp %type。 PL_SQL里也可以逮某種類型的錯誤,Java里每一種exception都有相應(yīng)的類為代表,同理PL_SQL里也一樣,如no_data_found/too_many_rows,學(xué)語言得學(xué)會類比。end。 for k in reverse 1..10 loop (k)。這也類似于Java里的while循環(huán);第三種,如下:begin begin for k in 1..10 loop (k)。 end loop。begin while j11 loop(j)。end。exit when (i=11)。begin loop(i)。注意最后一個else后沒有then,其他條件后有,而且elsif沒有那個e,最后以end if;結(jié)束。default是給一個默認(rèn)值。)39。aaa39。create table T(nnn varchar2(20) default 39。sql代表剛剛執(zhí)行完的sql語句,而rowcount代表剛剛執(zhí)行完的sql語句影響了多少條記錄。條記錄受影響39。在PL_SQL里面使用insert、delete、update后加上mit不然起不了作用有時,只不過。end。 39。bj39。aaaa39。begin := 50。/這樣聲明還有一個弊病,那就是當(dāng)字段改變時控制起來比較煩人,為此引入rowtype屬性來聲明record變量。|| )。 (||39。 := 39。 := 39。 v_temp type_record_dept。 是什么促使了record類型數(shù)據(jù)的出現(xiàn)呢?我們現(xiàn)在寫的是PL_SQL,它最主要用于操縱表,表里面有字段、記錄,如果把一條記錄放一個變量里以后用起來要方便得多。type定義了一種新的數(shù)據(jù)類型名字叫type_table_emp_empno,然后可以用它定義新變量如 v_empnos type_table_emp_empno。 下面接著講PL_SQL里面復(fù)雜的變量,可以定義復(fù)合變量,有兩種:Table相當(dāng)于Java里的數(shù)組;Record相當(dāng)于Java里的類,暫且這樣理解。 end。 v_empno3 v_empno2%type。declare v_empno number(4)。 Oracle里面的變量經(jīng)常用來存儲某一張表的某個字段的值,使用%type屬性為了解決表里字段的變動與聲明變量類型一致。 /。||v_date)。 begin (39。 v_name varchar2(20) not null :=39。 v_pi constant number := 。 v_sal number(7,2) := 。declare v_temp number(1)。 PL_SQL變量聲明規(guī)則:變量名不能夠使用保留字(Oracle里保留字很多所以推薦使用v_+名字,這樣不易沖突),如select、from等;第一個字符必須是字母;變量名最多包含30個字符;不要與數(shù)據(jù)庫的表或者列同名;每一行只能聲明一個變量。 end。Error!39。 (v_name)。/變量名的寫法是v_+名字,聲明的時候是變量名在前,類型在后;賦值語句有點(diǎn)像pascal冒號等號;declare v_name number := 0。 (v_name)。begin v_name := 39。/第一句是將內(nèi)部環(huán)境變量打開,默認(rèn)的是關(guān)掉的,不然看不到任何輸出結(jié)果。)。begin (39。PL_SQL寫程序非常固定,分為四塊,第一塊叫declare,聲明各種變量和游標(biāo)的地方,可選;第二個叫begin,就是說程序從這開始執(zhí)行了;exception是catch到任何異常時要執(zhí)行的;end是結(jié)束,后面得有一個分號??赡芤院笪覀兘佑|的寫存儲過程機(jī)會很少,實(shí)際上我們用SQL和Java程序就可以解決大部分問題了,這只是讓大家有個了解知道有這么回事。七. PL_SQL是Oracle里面的一個編程語言,比較有用,在Oracle內(nèi)部寫一些存儲過程,觸發(fā)器,函數(shù)。 第三范式是不能存在傳遞依賴,即除了主鍵之外的其他字段必須直接依賴于主鍵。 第一范式的第一個要求要有主鍵;第二個要求列不可分,不能說姓名我還要分成姓和名。 三范式追求的是這樣的目標(biāo):不存在冗余數(shù)據(jù),換句話說就是同樣的數(shù)據(jù)不存第二遍。六. 范式就是數(shù)據(jù)庫設(shè)計(jì)的一些規(guī)則,而它又是由一個姓‘范’的提出的。然后知道了id往里插,但若有另外一個客戶端在做數(shù)據(jù)插入同時也在執(zhí)行完上面一條語句插入了一條記錄就會導(dǎo)致數(shù)據(jù)不一致的現(xiàn)象。如下我們要存儲BBS里的帖子建立一張表:create table article (id number,title varchar2(1024),cont long)。我可以建立一個視圖里面只包含我想要給他看的內(nèi)容。利用它可以簡化我們的查詢復(fù)雜度,同時它也有不好的地方,就是表結(jié)構(gòu)改了它也得跟著改動,增加了維護(hù)的難度。記住一點(diǎn)不要輕易建立索引,除非覺得訪問量特別大時。建立索引的用處是當(dāng)你建立了索引后取訪問相應(yīng)數(shù)據(jù)的時候效率會很高。忘了自己有哪些索引可以采用select index_name from user_indexse。 索引就相當(dāng)于字典里的索引一樣,它在Oracle里相當(dāng)于一種新的數(shù)據(jù)庫對象,建立索引的方法create index idx_stu_emil on stu ()。user_tables、user_constraints、user_views這些都是數(shù)據(jù)字典表,那么一共有多少個數(shù)據(jù)字典表呢?Oracle專門有另外一張表存放數(shù)據(jù)字典表的表叫做dictionary,它總共兩個字段一個叫table_name數(shù)據(jù)字典表的名字、還有一個叫ments對于這張數(shù)據(jù)字典表的描述。查詢當(dāng)前用戶下有哪些表:select table_name from user_tables。user_tables里面裝的是當(dāng)前用戶共有多少張表,里面字段可多了,我們關(guān)心的是table_name。還可以修改字段的數(shù)據(jù)類型,如果里面已經(jīng)有數(shù)據(jù)修改的后果應(yīng)不影響原來存的記錄值。添加字段alter table +表名+add(字段名+數(shù)據(jù)類型)如alter table dept2 add(dphone varchar2(11))。修改表結(jié)構(gòu)是在現(xiàn)有表上修改。刪一條記錄的時候首先看有沒有其他字段參考它,有的話是無法刪除的,違反了完整約束條件。class number(2) references class(id),參考class這張表的id字段,當(dāng)然也可以加在表級上:constraint foreign key (class) references class(id),。 外鍵約束建立在一張表的兩個字段上或者是兩張表的兩個字段上,是比較麻煩的一種約束。Email做主鍵不好因?yàn)樗梢詾閚ull,同時索引的時候數(shù)字比字符串效率高。要達(dá)到表級約束方法是在最后一個字段寫完后加一句如:constraint stu_name__uniunique(,name)。在Oracle里面約束條件也可以看成一個對象,能為之取一個名字,加一個關(guān)鍵字constraint+約束名,如name varchar(2) constraint stu_name_nn not null,不起時系統(tǒng)自動起名字我們不用管了。 五個約束條件第一個叫非空,第二個叫唯一,第三個叫主鍵,第四個叫外鍵第五個叫check。 創(chuàng)建一張表存放學(xué)生數(shù)據(jù)如:create table stu ( id number(8), name varchar(20), sex number(10), age number(3), sdate date, grade number(2) default 1, class number(2), varchar2(50) )。有了變長字符串后為什么還要有定長字符串呢?主要還是效率問題,跟數(shù)組很像,但是站空間,很多結(jié)構(gòu)、算法都存在拿空間換時間問題,如HashTable。下面講如何創(chuàng)建一張表,create table +表名+字段及字段的數(shù)據(jù)類型。對于Oracle來說,一個transcation起始于一條dml語句,然后一系列的操作rollback回退事務(wù)會結(jié)束;或mit結(jié)束事務(wù),再rollback也沒用;當(dāng)遇到一條dcl語句或ddl語句提交結(jié)束事務(wù);當(dāng)正常退出exit時提交結(jié)束事務(wù),不正常退出時(如斷電)自動回滾結(jié)束事務(wù)。它實(shí)現(xiàn)了數(shù)據(jù)表,視圖等的建立。用法是update+表名+set+字段列表及更新值過濾條件;delete+from+表名+過濾條件,刪除某些字段。 (3) select sname from s where sno in (select sno from sc where o=1 and sno = (select sno from sc where o=2))。(1) select sname from s join sc on (=) join c on (=) where ‘liming’。問題:1. 找出沒選過“黎明”老師課程的所有學(xué)生姓名;2. 列出2門以上(含2門)不及格學(xué)生姓名及平均成績;3. 既學(xué)過1號課程又學(xué)過2號課程所有學(xué)生姓名。 SQL面試題: 有3個表S,C,SC。這個重點(diǎn)掌握,比如說顯示論壇里的帖子是分頁顯示的,如果想顯示第4頁的內(nèi)容一定是從某一個帖子到某一個帖子顯示出來,帖子這個記錄是按照發(fā)帖時間倒序排列的。比如要取出工資最高的第六個到第十個人:select ename,sal,r from( select ename, sal,rownum r from ( select ename,sal from emp order by sal desc))where r=6 and r=10。將select子句選出的記錄挨個插入前提是選出的記錄與該表的記錄格式相同。)。insert語句還有一種插入方法,insert into dept2(deptno,loc) values(50,39。只有2和5是在命令行中完成,其余是超級用戶登錄后在數(shù)據(jù)庫里完成。 ,先建立一個目錄如C:\test進(jìn)入該目錄后執(zhí)行del *.*刪除所有,然后鍵入命令exp后提示輸入用戶名和口令,就是你要備份哪個就輸哪個,接下來提示輸入數(shù)組提取緩沖區(qū)大小,這個沒關(guān)系(內(nèi)存里的一個小區(qū)域填滿了再統(tǒng)一拿到硬盤上來)一路回車就行,等著它導(dǎo)完就可以了; user huanggang identified by haha0832 default tablespace users quota 10M on users??梢詫⒛硞€表空間里的內(nèi)容全部copy出去創(chuàng)建一個新的user,然后該user就操作專屬于自己的表空間里的表了,所以說Oracle是支持多用戶的。一個大數(shù)據(jù)庫里面又區(qū)分為不同的表空間,說白了就是裝表的地兒。增刪改查! 接下來簡單介紹一下Oracle的邏輯結(jié)構(gòu)。的區(qū)別一樣它會過濾掉很多條件,后面的字符串就不用再取去比較了,但實(shí)際中不好說因?yàn)橛锌赡躉racle在執(zhí)行的時候做了優(yōu)化,自動將數(shù)字比較放前面了。amp。Select * from emp where ename like ‘%A%’ and deptno=10。 求比普通員工最高薪水值還要高的經(jīng)理人名稱,主要是先求出普通員工的最高薪水,方法是員工的編號不在mgr字段,同時要主要去掉mgr為空值的:select ename,empno from empwhere sal(select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null)) and empno in (select distinct mgr from emp where mgr is not null )。創(chuàng)建視圖的一個好處就是便于取數(shù)據(jù),寫起來方便。然后以scott登錄就可以了。 求平均薪水等級最低的部門的部門名稱,編號,平均薪水:select dname,deptno ,grade ,avg_sal from salgradejoin( select dname,avg_sal from dept join (select deptno,avg(sal) avg_sal from emp group by deptno) t on (=))on (avg_sal between and )where grade=(select min(grade) from (select grade from salgrade join (select deptno,avg(sal) avg_sal from emp group by deptno) on (avg_sal between and ) ))。 求出平均薪水最高的部門名稱和編號,用到子查詢和表連接當(dāng)語句比較復(fù)雜的時候最好注意一下縮進(jìn)和格式,否則自己都會搞混:select dname,avg_sal from deptjoin (select deptno,avg(sal) avg_sal from emp group by deptno) ton (=)where avg_sal=(select max(avg(sal)) from emp group by deptno)。 講一道面試題,不準(zhǔn)用組函數(shù)求出薪水的最高值。select , mgr , from emp