greatjone

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

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

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

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

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

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

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

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

          連接oracle步驟:

                 1. 登陸,利用telnet命令

                 2. 鍵入sqlplus username/password

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

                 4. 退出exit (斷開連接,退出客戶端程序) 

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

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

                 1.建表sql

                        語法:create table( columnname type constrain);      

                 2.刪表sql

                        語法:drop table tablename; 

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

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

          其它常用操作:

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

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

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

           

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

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

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

           

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

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

                 col empno format 9999 

                 col sal format 9999.99  

                 col job format a10

                 set pagesize 200

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

                 list   顯示最近一次sql命令

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

                 conn 用戶名/密碼 切換用戶     

                 help index 顯示幫助    

           

          CURD操作

                

          select查詢

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

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

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

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

           

          模糊查詢:like 字符串,e.g:

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

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

           

          查詢語句中可用的函數(shù)

          一般函數(shù)sql:

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

                 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()用來生成隨機(jī)數(shù)

          例:隨機(jī)生成一個(gè)1000以內(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.大小寫轉(zhuǎn)換:lower()upper()    

                        select upper('fdjk') from dual;

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

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

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

          //substr用來截取字符串,注意它也是從1開始的

                 5.select length('abcdefg') from dual;//length()是用來求字符串長度的

          日期函數(shù)

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

                 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開始計(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 null,is 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是指無窮大

          組函數(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ì)查詢結(jié)果進(jìn)行排序

          select * from emp order by comm desc/asc;

          中文排序     

          order by nlssort(, '格式');

                 拼音       'NLS_SORT=SCHINESE_PINYIN_M'

                 筆畫    '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 分組

                 語法: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è)部門最高工資大于3000的最高工資和部門編號(hào)   

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

           

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

          select empno,ename,rowid from emp;

          rowid 特點(diǎn):

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

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

                 通過rowid 能夠最快速地查找到記錄

           

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

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

              查詢前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;

           

          語法順序      

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

          執(zhí)行順序

          where > group by > having> select >order by

           

          子查詢

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

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

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

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

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

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

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

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

           

          連接查詢 (實(shí)際開發(fā)):從兩張或更多張表中查詢到數(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è)表連接起來

           

          建表

          create table 表名(

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

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

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

                 ....

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

          );

          在建表時(shí)可設(shè)定列的默認(rèn)值,語法如下: 數(shù)據(jù)類型 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ù)類型有如下幾種:

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

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

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

                 4. 數(shù)字

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

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

           

          Oracle中的約束

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

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

                       

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

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

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

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

                

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

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

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

           

          update 更新

          語法:update set =, =,... where 條件;

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

           

          delete 刪除

          語法:delete from where 條件;

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

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

                 truncate table 表名; -- 刪除表中所有記錄 注意:無法使用rollback 撤銷,但運(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:    語法: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),沒有復(fù)制表數(shù)據(jù)

           

          約束:

                 1.行級(jí)約束

                        primary key, references,unique, check, not null

                 2.表級(jí)約束

                        primary key, referencesunique, check

                        表級(jí)約束的寫法,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ī)則: 表名_列名_約束類型簡寫(PK 主鍵,NN 非空,CK 檢查,UK 唯一,FK 外鍵)

                 如果沒有給約束起名,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)

                        );

           

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

                 語法: 數(shù)據(jù)類型 references 表名(引用列)

           

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

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

                  TABLE_NAME -> 表名

                 e.g:select table_name from user_tables;

           

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

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

                        CONSTRAINT_NAME       ->    約束名

                        CONSTRAINT_TYPE          ->  約束類型

                        TABLE_NAME                    ->    約束所在表

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

                        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)建語法: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(保存用戶的序列信息): 

          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é)論:如果一條查詢語句中多次出現(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ì)話中定義

           

          sql語句的分類

                 DQL (數(shù)據(jù)查詢語言data query)  select

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

                 TCL (事務(wù)控制語言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)中的一到多條增刪改語句必須作為一個(gè)不可分割的整體若,要么都成功(commit),若其中一條失敗,應(yīng)當(dāng)撤銷所有操作(rollback)。

           

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

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

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

           

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

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

           

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

           

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

                 A - 原子性

                 C - 一致性

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

                 I - isolation 隔離性

          D - 持久性

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

           

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

                        (table)

                        序列 (sequence)

                        約束 (constraint)

                        視圖 (view)

                        索引 (index)       

                        函數(shù) (function)

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

           

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

           

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

           

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 玉山县| 东至县| 佛学| 监利县| 西乌| 大渡口区| 和龙市| 浦北县| 湟源县| 台江县| 舒城县| 苍梧县| 金沙县| 海原县| 合肥市| 平邑县| 曲靖市| 大渡口区| 东方市| 瑞昌市| 铁岭市| 南皮县| 陇川县| 肥城市| 墨玉县| 东至县| 舟曲县| 子洲县| 连江县| 大理市| 固始县| 伊宁县| 铜山县| 美姑县| 北京市| 滁州市| 巨野县| 长寿区| 通江县| 罗甸县| 新龙县|