greatjone

          BlogJava 聯(lián)系 聚合 管理
            7 Posts :: 24 Stories :: 3 Comments :: 0 Trackbacks

           數(shù)據(jù)庫(kù)  DataBase

          關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng) RDBMS 

          數(shù)據(jù)庫(kù)的功能 存儲(chǔ)和管理數(shù)據(jù)。 

          數(shù)據(jù)庫(kù)較文本文件

          文本文件存儲(chǔ)數(shù)據(jù)的缺點(diǎn):沒(méi)有數(shù)據(jù)類(lèi)型,只能存儲(chǔ)字符串;查詢(xún)數(shù)據(jù)不方便;不適合存儲(chǔ)大數(shù)據(jù)量;不安全

          數(shù)據(jù)庫(kù)的優(yōu)點(diǎn):它克服了文本文件的以上缺點(diǎn)之外,還可以供多用戶(hù)同時(shí)訪(fǎng)問(wèn)。 

          數(shù)據(jù)庫(kù)的工作模式:使用SQL語(yǔ)言進(jìn)行通信:Structed Query Language(結(jié)構(gòu)化查詢(xún)) 

          連接oracle步驟:

                 1. 登陸,利用telnet命令

                 2. 鍵入sqlplus username/password

                 3. 執(zhí)行sql命令對(duì)數(shù)據(jù)進(jìn)行CURD操作

                 4. 退出exit (斷開(kāi)連接,退出客戶(hù)端程序) 

          對(duì)數(shù)據(jù)庫(kù)的基本操作:

                 因?yàn)閿?shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)的單位是表(table),所以我首先講的是對(duì)表的基本操作。

                 1.建表sql

                        語(yǔ)法:create table( columnname type constrain);      

                 2.刪表sql

                        語(yǔ)法:drop table tablename; 

                 3.對(duì)表的增刪改查。具體細(xì)節(jié),后面將作詳細(xì)介紹。

                 將成批的sql語(yǔ)句放在.sql文件中,可用命令start/@ 路徑/文件名 的方式批量執(zhí)行

          其它常用操作:

          1.查看當(dāng)前用戶(hù)下有哪些表:select table_name from user_tables;

          2.獲得表的結(jié)構(gòu):desc 表名   descdescribe的簡(jiǎn)寫(xiě)

          3.查詢(xún)表中數(shù)據(jù) 可用   select 列名,列名,... from 表名

           

          sqlplus命令與sql命令的區(qū)別:

          1. 執(zhí)行的客戶(hù)端不一樣。

          2. sqlplus命令可以不以;作為結(jié)束,sql命令必須以;結(jié)束。

           

          sqlplus命令:exitdesc 表名,start (@)文件名

                 col   列名 format 格式(控制查詢(xún)結(jié)果顯示) 

                 col empno format 9999 

                 col sal format 9999.99  

                 col job format a10

                 set pagesize 200

                 /  執(zhí)行最近一次sql命令

                 list   顯示最近一次sql命令

                 c/舊值/新值   修改最近一次sql命令 

                 conn 用戶(hù)名/密碼 切換用戶(hù)     

                 help index 顯示幫助    

           

          CURD操作

                

          select查詢(xún)

          常規(guī)查詢(xún):select 1,列2,.... from 表名 where 條件;

          注意其中列名如果是表的全部列,則可用*代替,不過(guò)它比直接寫(xiě)列名在執(zhí)行效率上要慢。

          sql語(yǔ)句中如果要用到字符串,則需使用''括起來(lái),并且字符串的比較是區(qū)分大小寫(xiě)的。

          在條件子句中如果用邏輯運(yùn)算符,記住它們是有優(yōu)先級(jí)別的:優(yōu)先級(jí)not> and > or,所以可用()來(lái)改變優(yōu)先級(jí)

           

          模糊查詢(xún):like 字符串,e.g:

          查詢(xún)姓名中第二個(gè)字母是A的員工:select * from emp where ename like '_A%';

          在模糊查詢(xún)中有兩種通配符:% 表示匹配0到多個(gè)任意字符;_表示匹配1個(gè)任意字符

           

          查詢(xún)語(yǔ)句中可用的函數(shù)

          一般函數(shù)sql:

                 1.select 100 + 200 (as) result from dual; //dual為系統(tǒng)表,它只有一行一列result為列的一個(gè)別名,as可以省略不寫(xiě)

                 2.select abs(-4738) from dual;//abs()函數(shù)是求絕對(duì)值的

                 3.select mod(10, 3) from dual;//mod()函數(shù)是求模(余數(shù))

                 4.select dbms_random.random() from dual;//dbms_random.random()用來(lái)生成隨機(jī)數(shù)

          例:隨機(jī)生成一個(gè)1000以?xún)?nèi)的正整數(shù):

          select mod(abs(dbms_random.random()),1000 ) from dual;

          字符串函數(shù)

                 1.連接字符串

                        select 'abc' || 'def' from dual;

                        select concat('abc','def') from dual;

                        select empno || '/' || ename || '/' || job from emp;

                 2.大小寫(xiě)轉(zhuǎn)換:lower()upper()    

                        select upper('fdjk') from dual;

                 3.select instr('abcdefg', 'c') from dual;ans:3

          //instr 求子串在字符串中的初始位置(注意它是從1開(kāi)始的)

                 4.select substr('abcdefg', 4) from dual;ans:defg

          //substr用來(lái)截取字符串,注意它也是從1開(kāi)始的

                 5.select length('abcdefg') from dual;//length()是用來(lái)求字符串長(zhǎng)度的

          日期函數(shù)

                 1.select sysdate from dual;//sysdate表示的是當(dāng)前日期,它的類(lèi)型在oracle里為date類(lèi)型

                 2.to_char(日期, '格式') 將日期轉(zhuǎn)換為字符串

                        select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;    

                        select to_char(sysdate, 'q') from dual;//季度

                        select to_char(sysdate, 'd') from dual;//一個(gè)星期的第幾天(注意:以周日為1開(kāi)始計(jì)算)

                        select to_char(sysdate, 'day') from dual;//星期幾

                        select to_char(sysdate, 'am') from dual;//上下午

                        select to_char(sysdate, 'mon') from dual;//月份

                        日期的默認(rèn)格式為:dd-mon-yy;

                 3.trunc (截?cái)嗳掌?/span>) 返回值還是日期

                        select trunc(sysdate, 'year') from dual;//今年的11號(hào)0時(shí)00

                        select trunc(sysdate, 'month') from dual;

                        select trunc(sysdate, 'day') from dual;

                 4.對(duì)時(shí)間的加減

                        select sysdate - 5 from dual;//日期+ -時(shí),它以天為單位的

                        select to_char(sysdate + 1/24,'hh24:mi:ss') from dual;//將當(dāng)前間加1小時(shí)

                        select add_months(sysdate, -1) from dual;//對(duì)月進(jìn)行減一

          其它函數(shù)

                 1.對(duì)某列進(jìn)是否為null的條件選擇,可用is nullis not null e.g:

                        select * from emp where comm is not null;

                 2.對(duì)有可能取值為null的列進(jìn)行運(yùn)算時(shí),需用到nvl()函數(shù)

                        e.g: select (sal+nvl(comm,0))*12 asal from emp;

                        //nvl(檢查值,替代值) 如果某列的值等于檢查值時(shí),用替代值替代,此例是將null值替換成0,在Oraclenull是指無(wú)窮大

          組函數(shù):

                 max() 求某列的最大值;min(),求某列的最小值; avg() 求某列的平均值; sum() 求某列值的和; count() 求某一列取值不為null的個(gè)數(shù)

                 select distinct job from emp;//distinct 去除重復(fù)取值

                 select count(distinct job) from emp;//去除重復(fù)記錄后,求個(gè)數(shù)

           

          order by:對(duì)查詢(xún)結(jié)果進(jìn)行排序

          select * from emp order by comm desc/asc;

          中文排序     

          order by nlssort(, '格式');

                 拼音       'NLS_SORT=SCHINESE_PINYIN_M'

                 筆畫(huà)    'NLS_SORT=SCHINESE_STROKE_M'

                 部首       'NLS_SORT=SCHINESE_RADICAL_M'

          e.g: select * from product order by nlssort(productname, 'NLS_SORT=SCHINESE_PINYIN_M' );

           

          group by 分組

                 語(yǔ)法:group by 1, 2-->根據(jù)group by 之后的列,取值歸為一組,配合組函數(shù)求每組的最大值,最小值...

                 e.g: select max(sal) from emp group by deptno;

                 注意:如果使用了group by分組,則在select子句中出現(xiàn)的列必須是在group by子句中有的,如果不是,則必須配合組合函數(shù)一起使用

                 按多列分組:select count(*), deptno, job from emp group by deptno, job;

           

          group by...having... 分組之后再進(jìn)行條件選擇

                 e.g:select max(sal) ,deptno from emp group by deptno having (max(sal) > 3000);    //求每個(gè)部門(mén)最高工資大于3000的最高工資和部門(mén)編號(hào)   

                 注意:where子句也能達(dá)到條件選擇的效果,如果wherehaving都能達(dá)到要求,從效率角度出發(fā),應(yīng)優(yōu)先選擇where;    如果只能在分組之后才可以進(jìn)行條件選擇的話(huà),則使用having      

           

          偽列 (rowid, rownum) 不真正存在于表中的列

          select empno,ename,rowid from emp;

          rowid 特點(diǎn):

                 每張表中的rowid取值沒(méi)有重復(fù)

                 每個(gè)rowid對(duì)應(yīng)一條記錄,可以看做是此記錄的唯一標(biāo)識(shí)

                 通過(guò)rowid 能夠最快速地查找到記錄

           

          rownum 為每條查詢(xún)結(jié)果產(chǎn)生一個(gè)編號(hào)

                 e.g: select empno,ename,rownum from emp;

              查詢(xún)前5條記錄

                  select empno,ename,rownum from emp where rownum <=5;

                  select empno,ename,rownum from emp where rownum > 5;(錯(cuò))

                  select empno,ename,rownum from emp where rownum = 5;(錯(cuò))

          注意:rownum用作比較條件時(shí)只能使用<或者<=比較;特例=1, >=1可以

                        select empno,ename,rownum from emp where rownum <=5;

           

          語(yǔ)法順序      

          select ... from ... where 條件 group by ... having 條件 order by ...

          執(zhí)行順序

          where > group by > having> select >order by

           

          子查詢(xún)

                 在很多時(shí)候單一的查詢(xún)不能完成實(shí)際的要求,而子查詢(xún)可以完對(duì)單表的復(fù)雜查詢(xún)

                 1.將子查詢(xún)結(jié)果作為主查詢(xún)的條件e.g

                 select * from emp where sal = (select max(sal) from emp);//查詢(xún)具有最高工資的員工信息

                 select * from emp where sal > (select avg(sal) from emp);//查詢(xún)所有工資高于平均工資

                 select * from emp where sal in (select max(sal) from emp group by deptno);//查詢(xún)每個(gè)部門(mén)工資最高的員工信息

                 2.將子查詢(xún)結(jié)果作為一張臨時(shí)表,作進(jìn)一步的查詢(xún)

                        e.g: select e.*,rownum from (select * from emp order by sal desc) e where rownum <=5;//查詢(xún)工資最高的前五名員工

                        select * from  (select empno,ename,sal,rownum r from (select * from emp order by sal desc) where rownum <=10) where r > 5;//查詢(xún)工資最高的6-10名員工

           

          連接查詢(xún) (實(shí)際開(kāi)發(fā)):從兩張或更多張表中查詢(xún)到數(shù)據(jù)

          1. 內(nèi)連接

          e.g: select empno, ename ,d.deptno, dname from dept d inner join emp e on (e.deptno = d.deptno);

          2.()外連接

          e.g: select empno, ename , d.deptno, dname from dept d left outer join emp e on (e.deptno = d.deptno);

          3.()外連接

          e.g: select empno, ename , d.deptno, dname from dept d right outer join emp e on (e.deptno = d.deptno);

          4.自連接

          e.g: select e1.ename, e2.ename from emp e1 left join emp e2 on e1.mgr = e2.empno;   

          5. 多表連接:就是利用以上連接將多個(gè)表連接起來(lái)

           

          建表

          create table 表名(

                 列名1 數(shù)據(jù)類(lèi)型 約束,

                 列名2 數(shù)據(jù)類(lèi)型 約束,

                 列名3 數(shù)據(jù)類(lèi)型 約束,      

                 ....

                 列名n 數(shù)據(jù)類(lèi)型 約束

          );

          在建表時(shí)可設(shè)定列的默認(rèn)值,語(yǔ)法如下: 數(shù)據(jù)類(lèi)型 default 默認(rèn)值 約束

          建表示例:

          create table users_jone(

           username varchar2(20) primary key,

           password varchar2(20) not null check ( length(password) >=4  ),

           birthday date,

           married number(1) check (married in(0,1)),

           age       number(3) check (age >0 and age<150),

           salary  number(7,2) check (salary >0.0)

          );

           

          Oracle中數(shù)據(jù)類(lèi)型有如下幾種:

                 1.字符串類(lèi)型: varchar2(字符個(gè)數(shù)); clob       字符型大對(duì)象 (需補(bǔ)充對(duì)這兩種類(lèi)型的分析)    

                 2.日期類(lèi)型:  date      年月日,時(shí)分秒,毫秒; timestamp 可以到納秒

                 3.布爾類(lèi)型:可將數(shù)據(jù)類(lèi)型設(shè)定為number(1)或者是char(1),Oracle里是01來(lái)表示falsetruth ,之后可設(shè)檢查約束為:check(列名 in(0,1))

                 4. 數(shù)字

                        整數(shù) integer(整數(shù)位數(shù))     e.g:age   integer(3)

                        小數(shù) number(最大有效數(shù)字長(zhǎng)度,小數(shù)點(diǎn)后位數(shù)) e.g:salary number(7,2)//99999.99

           

          Oracle中的約束

                        作用:保證數(shù)據(jù)的有效性和完整性

                        種類(lèi):not null 非空約束;unique   唯一約束;primary key 主鍵約束(唯一并且非空,在一張表里只能有一個(gè)主鍵);check(條件) 檢查約束  

                       

          添加(插入)數(shù)據(jù)

                 語(yǔ)法1insert into 表名(列名1,列名2...)     values(1,2 ...);

                 語(yǔ)法2insert into 表名 values(1,2 ...);//在插入給出的所有列的數(shù)值時(shí)使用,注意值的順序必須與列名順序一致

                 語(yǔ)法3插入部分列的值 語(yǔ)法:insert into 表名(列名1,列名2...) values(1,2 ...);//注意:此時(shí)不能省略列名

                

          對(duì)事務(wù)的操作:

                 commit;  //在對(duì)表進(jìn)行增刪改操作后,需執(zhí)行commit之后才能讓所作操作對(duì)其他用戶(hù)可見(jiàn)。

          rollback;//若想取消對(duì)表的增刪改操作,可以執(zhí)行此語(yǔ)句。

           

          update 更新

          語(yǔ)法:update set =, =,... where 條件;

                 e.g: update emp set sal=800,comm=500 where empno=7369;

           

          delete 刪除

          語(yǔ)法:delete from where 條件;

                 e.g: delete from emp where empno = 1234;

                 delete from ;             -- 刪除表中所有記錄

                 truncate table 表名; -- 刪除表中所有記錄 注意:無(wú)法使用rollback 撤銷(xiāo),但運(yùn)行效率高

                

                 注意:如果兩張表存在著關(guān)聯(lián)關(guān)系,則先刪從表記錄,再刪主表記錄。創(chuàng)建這樣的有著關(guān)聯(lián)關(guān)系的表時(shí),則要先建主表,再建從表。

                        e.g:create table users_jone; ()          create table orders_jone; ()

                               drop table orders_jone; ()            drop table users_jone; ()

          drop table users_jone cascade constraint;//cascade constraint的作用是先刪除相關(guān)的外鍵約束再刪除表

           

          根據(jù)舊表創(chuàng)建新表

          做法1先創(chuàng)建與舊表一樣的表結(jié)構(gòu),然后執(zhí)行:insert into 新表名 select * from 舊表名;commit;

          做法2:    語(yǔ)法:create table 新表名 as select * from 舊表; commit;

                 注意:此法創(chuàng)建的表結(jié)構(gòu)與舊表幾乎一致,只是約束只能復(fù)制not null約束。

                 e.g:create table emp_jone as select * from emp;

                 create table emp_jone as select * from emp where 1=2;//僅僅復(fù)制了表結(jié)構(gòu),沒(méi)有復(fù)制表數(shù)據(jù)

           

          約束:

                 1.行級(jí)約束

                        primary key, referencesunique, check, not null

                 2.表級(jí)約束

                        primary key, referencesunique, check

                        表級(jí)約束的寫(xiě)法,e.g:

                        create table orders_jone(

                               orderId number(6) ,

                               orderDate date not null,

                               state number(1) not null ,

                               totalPrice number(10,2) not null,

                               username varchar2(20) not null,

                               primary key (orderId),

                               check (state in(1,0)),

                               foreign key (username)

                                      references users_jone(username)

                        );

                        create table score(

                               stuName varchar2(20),

                               courseName varchar2(20),

                               score number(3) not null,

                               primary key(stuName, courseName)//聯(lián)合主鍵

                        );

           

          約束命名

          命名規(guī)則: 表名_列名_約束類(lèi)型簡(jiǎn)寫(xiě)(PK 主鍵,NN 非空,CK 檢查,UK 唯一,FK 外鍵)

                 如果沒(méi)有給約束起名,oracle會(huì)自動(dòng)為約束命名

                 e.g:create table orders_jone (

                               orderId number(6)

                                constraint orders_jone_orderId_pk primary key,

                               orderDate date

                                constraint orders_jone_orderDate_nn not null,

                               state number(1) not null

                                             check (state in(1,0)),

                               totalPrice number(10,2) not null,

                               username varchar2(20) not null

                                constraint orders_jone_username_fk

                                             references users_jone(username)

                        );

           

          外鍵約束:限制某一列不能是任意的,必須來(lái)源于另外一個(gè)主鍵列

                 語(yǔ)法: 數(shù)據(jù)類(lèi)型 references 表名(引用列)

           

          系統(tǒng)表(數(shù)據(jù)字典):存儲(chǔ)的都是與定義(表的,約束的)有關(guān)信息

                 user_tables 存儲(chǔ)當(dāng)前用戶(hù)創(chuàng)建的表相關(guān)信息

                  TABLE_NAME -> 表名

                 e.g:select table_name from user_tables;

           

                 user_constraints 存儲(chǔ)了當(dāng)前用戶(hù)的所有約束信息

                        OWNER  ->   擁有(創(chuàng)建)

                        CONSTRAINT_NAME       ->    約束名

                        CONSTRAINT_TYPE          ->  約束類(lèi)型

                        TABLE_NAME                    ->    約束所在表

                 user_cons_columns 存儲(chǔ)了當(dāng)前用戶(hù)的所有約束信息

                        COLUMN_NAME                ->  約束所在列

                       

          select owner,constraint_name,constraint_type from user_constraints where table_name='ORDERS_jone';

          select column_name from user_cons_columns where CONSTRAINT_NAME ='SYS_C0032843';

                       

           

          序列(sequence ): oracle提供的產(chǎn)生唯一值的一種機(jī)制

                 創(chuàng)建語(yǔ)法:create sequence 序列名 選項(xiàng); e.g: create sequence orders_jone_seq;

                        select orders_jone_seq.nextval from dual;//取得序列的下個(gè)一值

           

                        選項(xiàng):start with 初始值 ; increment by 遞增值 ; cache 緩存值

                        e.g: create sequence orders_jone_seq start with 300001 increment by 2 cache 10;

          user_sequences(保存用戶(hù)的序列信息): 

          SEQUENCE_NAME -> 序列名,INCREMENT_BY  -> 遞增值,CACHE_SIZE     -> 緩存值

                 e.g:select * from user_sequences where sequence_name ='ORDERS_jone_SEQ';

           

          應(yīng)用:可以利用序列生成唯一的ID

           e.g:insert into orders_jone values(orders_jone_seq.nextval,sysdate,0, 1000.00, 'liucy');      

          注意點(diǎn):

          1.例如:create sequence orders_jone_seq start with 30000;

          select orders_jone_seq.currval,orders_jone_seq.nextval,orders_jone_seq.nextval from dual; //30000,30000,30000

          結(jié)論:如果一條查詢(xún)語(yǔ)句中多次出現(xiàn)nextval,則實(shí)際取值時(shí)只從序列中取了一次值

          2.序列第一次使用時(shí)不能使用currval   

          序列剛創(chuàng)建后,運(yùn)行select orders_jone_seq.currval from emp;

          會(huì)報(bào)錯(cuò)誤: 序列 ORDERS_JONE_SEQ.CURRVAL 尚未在此會(huì)話(huà)中定義

           

          sql語(yǔ)句的分類(lèi)

                 DQL (數(shù)據(jù)查詢(xún)語(yǔ)言data query)  select

                 DML (數(shù)據(jù)操控)          insert, update, delete     

                 TCL (事務(wù)控制語(yǔ)言transaction control)     commit, rollback   

                 DDL  (數(shù)據(jù)定義data defination)        create, drop, alter       truncate

                 DCL(數(shù)據(jù)控制)            grant, revoke

           

          alter      

          添加列 例:alter table users_jone add address varchar2(20) default '北苑家園' not null;

          刪除列 例:alter table users_jone drop column address;

          重命名 例:alter table users_jone rename column address to addr;

          修改列 例:alter table users_jone modify username varchar2(30);

          刪除約束 例:alter table orders_jone   drop constraint orders_jone_orderId_pk;

          修改約束 例:alter table employees modify manager_id integer;

          添加約束 例:

          alter table orders_jone add constraint orders_jone_orderId_pk primary key(orderId);

                

           

          事務(wù) (transaction)

                 事務(wù)代表一組原子(不可再分)操作,它當(dāng)中的一到多條增刪改語(yǔ)句必須作為一個(gè)不可分割的整體若,要么都成功(commit),若其中一條失敗,應(yīng)當(dāng)撤銷(xiāo)所有操作(rollback)

           

          事務(wù)的邊界(開(kāi)始和結(jié)束)

                        執(zhí)行update, insert , delete 時(shí)事務(wù)開(kāi)始

                        執(zhí)行commit/rollback (事務(wù)結(jié)束)

           

                        rollback只會(huì)撤銷(xiāo)本次事務(wù)所做的所有操作,不會(huì)影響已經(jīng)結(jié)束的事務(wù)

                        select 不會(huì)受事務(wù)影響

           

          synchronize:作用:用來(lái)保護(hù)并發(fā)操作下的數(shù)據(jù)完整性。(需補(bǔ)充)

           

          事務(wù)的4特性:ACID

                 A - 原子性

                 C - 一致性

                        事務(wù)開(kāi)始前和結(jié)束后的數(shù)據(jù)狀態(tài)應(yīng)當(dāng)一致

                 I - isolation 隔離性

          D - 持久性

                        指事務(wù)結(jié)束后,數(shù)據(jù)的狀態(tài)應(yīng)當(dāng)永久保存下來(lái)

           

          oracle 數(shù)據(jù)庫(kù)對(duì)象

                        (table)

                        序列 (sequence)

                        約束 (constraint)

                        視圖 (view)

                        索引 (index)       

                        函數(shù) (function)

                        (存儲(chǔ))過(guò)程(procedure)

           

          對(duì)視圖,索引,過(guò)程等數(shù)據(jù)庫(kù)對(duì)象方面的使用有待補(bǔ)充。

           

          Oracle數(shù)據(jù)庫(kù)中用戶(hù)權(quán)限角色等方面的知識(shí)有待補(bǔ)充。

           

          posted on 2010-06-05 23:29 jone 閱讀(757) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 數(shù)據(jù)庫(kù)

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 三亚市| 蓬莱市| 怀安县| 南平市| 通州区| 封开县| 伊川县| 含山县| 巧家县| 定日县| 长泰县| 普兰店市| 拉萨市| 湟中县| 保德县| 台州市| 南陵县| 清苑县| 资阳市| 桑日县| 寿光市| 泗洪县| 阿尔山市| 新民市| 吉林市| 凤冈县| 娄底市| 丹阳市| 泽库县| 阿荣旗| 麦盖提县| 塘沽区| 凌云县| 建湖县| 武陟县| 中西区| 舒兰市| 东丰县| 红河县| 东城区| 文成县|