一.Oracle數(shù)據(jù)庫(kù)中常用的數(shù)據(jù)類型
varchar2(長(zhǎng)度)可變長(zhǎng)字符串 char(長(zhǎng)度) 定長(zhǎng) number()表示整數(shù)或者浮點(diǎn)數(shù)number(8) number(8,2) clog 字符的大對(duì)象 blog 二進(jìn)制的大對(duì)象 二.數(shù)據(jù)庫(kù)查詢 1)SELECT語(yǔ)句 從表中提取查詢數(shù)據(jù).語(yǔ)法為SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC]; 說(shuō)明:SELECT子句用于指定檢索數(shù)據(jù)庫(kù)的中哪些列,F(xiàn)ROM子句用于指定從哪一個(gè)表或視圖中檢索數(shù)據(jù)。 2)WHERE子句。 WHERE子句用來(lái)選擇符合條件的的記錄. like '...' 通配查詢 _,% between ... and ... ,表示結(jié)果在這之間,between and是一個(gè)閉區(qū)間。 !=,<>,^=,這三個(gè)都可以表示不等于。 in (va1,val2,...) 判斷結(jié)果是否在這個(gè)集合中存在 。 like '...' 字符串通配查詢,'%'表示0或多個(gè)字符,'_'表示一個(gè)字符。 ... and ... 表示只有兩個(gè)條件同時(shí)滿足 ... or ... 表示條件只要滿足其中之一就可以 all ... 是要求都滿足條件。 not .....,則是可以與以上的條件產(chǎn)生反效果。 ... is null 使用來(lái)判斷值是不是空。 3) ORDER BY子句 ORDER BY 子句使得SQL在顯示查詢結(jié)果時(shí)將各返回行按順序排列,返回行的排列順序由ORDER BY 子句指定的表達(dá)式的值確定。 ASC(默認(rèn),升序) DESC(降序) order by 目標(biāo)列名(別名) 排序順序(不寫排序順序,會(huì)默認(rèn)為升序排序) 例:select first_name from s_emp order by first_name; select first_name from s_emp order by first_name desc; 三.SQL常用的命令分類及例子 數(shù)據(jù)定義語(yǔ)言:create(創(chuàng)建)、alter(更改)和drop(刪除)命令。 數(shù)據(jù)操縱語(yǔ)言:insert(插入)、select(選擇)、delete(刪除)和update(更新)命令。 事務(wù)控制語(yǔ)言:commit(提交)、savepoint(保存點(diǎn))和rollback(回滾)命令。 數(shù)據(jù)控制語(yǔ)言:grant(授予)和revoke(回收)。 1.數(shù)據(jù)定義語(yǔ)言舉例: SQL> create table myTab(no number(4),name varchar2(20));創(chuàng)建一個(gè)名為myTab的表,包含兩列no和name; SQL> alter table myTab modify (name varchar2(25));修改myTab中的name列,使此列能容納25個(gè)字符; SQL> alter table myTab add (tel_no varchar2(20));給表myTab增加一列tel_no; SQL> alter table myTab drop column tel_no;刪除表myTab的tel_no列; SQL> drop table myTab;刪除表myTab; SQL> truncate table myTab;刪除表myTab中的所有行(截?cái)啾恚?注意:不可以回滾。 2.數(shù)據(jù)操縱語(yǔ)言舉例: SQL> insert into myTab values(‘001’,’John’); 向表myTab中插入一行數(shù)據(jù); SQL> select distinct salary “薪水” from s_emp where salary>1500 order by sal desc; 選擇表中salary大于1500的數(shù)據(jù),以別名“薪水”顯示并按照salary的降序進(jìn)行排列輸出; SQL> create table empa as select empno,ename,job,sal from emp; 從emp表中選擇“empno,ename,job,sal”四列的數(shù)據(jù)建立新表empa; SQL> create table empa as select * from emp where 1=2; 使用一個(gè)假條件根據(jù)現(xiàn)有表emp創(chuàng)建一個(gè)只包含結(jié)構(gòu)的空表empa; SQL> delete from empa where sal<1500; 刪除表empa中sal小于1500的行; SQL> update empa set sal=1500 where sal<1500;更新,將表empa中sal小于1500的行的sal值全部改為1500。 3.事務(wù)控制語(yǔ)言舉例: SQL> commit;用于提交并結(jié)束事務(wù)處理; SQL> savepoint mark1;保存點(diǎn)類似于標(biāo)記,用來(lái)標(biāo)記事務(wù)中可以應(yīng)用回滾的點(diǎn); SQL> rollback to savepoint mark1;回滾到保存點(diǎn)mark1。 四.Oracle數(shù)據(jù)庫(kù)函數(shù) 注意:dual表(虛表)是專門用于函數(shù)測(cè)試和運(yùn)算的. 1.字符函數(shù) 字符是大小寫敏感的 轉(zhuǎn)小寫 lower(字段名) 轉(zhuǎn)大寫 upper(字段名) 首字母大寫 initcap(字段名) 字符串拼接 concat(字段1, 字段2) 截取子串 substr(字段名, 起始位置,取字符個(gè)數(shù)) 例: select first_name,substr(first_name,2,2) sub from s_emp;(從名字的第二個(gè)字符開始取兩個(gè)字符) select first_name,substr(first_name,-2,2) sub from s_emp;(從名字的倒數(shù)第二個(gè)字符開始取兩個(gè)字符) 2.數(shù)值函數(shù) 四舍五入函數(shù) round(數(shù)據(jù),保留到小數(shù)點(diǎn)后幾位) 1表示保留到小數(shù)點(diǎn)后一位,-1表示保留到小數(shù)點(diǎn)前一位。 例:select round(15.36,1) from dual; 截取數(shù)值函數(shù) trunc(數(shù)據(jù),保留到小數(shù)點(diǎn)后幾位) 例:select trunc(123.456,1) from dual; 截取到小數(shù)點(diǎn)后一位,注意:與round函數(shù)不同,不會(huì)四舍五入。 3.日期函數(shù) 缺省日期格式,日-月-年 dd-mon-rr 修改當(dāng)前會(huì)話的日期格式,會(huì)按照指定的格式輸出日期 alter session set nls_date_format='yyyy mm dd hh24:mi:ss'; 返回當(dāng)前日期 sysdate 例:select sysdate from dual; 4.不同數(shù)據(jù)類型間轉(zhuǎn)換函數(shù) 將日期轉(zhuǎn)成字符 tochar(date,'日期格式') 日期格式要用有效格式,格式大小寫敏感 'yyyy mm dd hh24:mi:ss'(標(biāo)準(zhǔn)日期格式),'year'(年的全拼),'month'(月的全拼),'day'(星期的全拼),'ddspth' (日期的全拼) 例:select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual; select to_char(sysdate,'year month day ddspth')from dual; 將字符串轉(zhuǎn)成日期 to_date('...','日期格式') 例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual; 五.表連接(關(guān)聯(lián)查詢) 等值連接 select table1.column1,table2.column2 from table1 t1,table2 t2 where t1.column3=t2.column4; 表連接時(shí),當(dāng)表與表之間有同名字段時(shí),可以加上表名或表的別名,加以區(qū)分,使用時(shí)要用表名.字段名或表別名.字段名(列名)。當(dāng)表的字段名是唯一時(shí),可以不用加上表名或表的別名。 注意:當(dāng)為表起了別名,就不能再使用表名.字段名了。 例如:select e.first_name ||’ ’|| e.last_name name, d.name dept_name from s_emp e, s_dept d where e.dept_id=d.id; 非等值連接 select [表別名1.字段名1],[表別名2.字段名2],... from 表1 表別名1 ,表2 表別名2 where 表別名1.字段名3 ..... 表別名2.字段名4 ....可以使比較運(yùn)算符,也可以使其他的除了'='的運(yùn)算符 例:select first_name, salary from s_emp where salary between 1000 and 2000; 自連接 把一個(gè)表的兩個(gè)字段關(guān)系轉(zhuǎn)換成兩個(gè)表字段之間的關(guān)系. select [表別名1.字段名1],[表別名2.字段名2],... from 表1 表別名1 ,表1 表別名2 where 表別名1.字段名3=表別名2.字段名4; 例:select a.first_name ename,b.first_name cname from s_emp a,s_emp b where a.manager_id=b.id; 外連接 使用一張表中的所有記錄去和另一張表中的記錄按條件匹配(空值也會(huì)匹配)這個(gè)表中的所有記錄都會(huì)顯示。 //想在哪邊模擬記錄就在哪邊加上(+) 1. LEFT OUTER JOIN:左外連接 SELECT e.last_name, e.dept_id, d.name FROM s_emp e LEFT OUTER JOIN s_dept d ON (e.dept_id = d.id); 等價(jià)于 SELECT e.last_name, e.dept_id, d.name FROM s_emp e, s_dept d WHERE e.dept_id=d.id(+); 結(jié)果為:所有員工及對(duì)應(yīng)部門的記錄,包括沒(méi)有對(duì)應(yīng)部門編號(hào)dept_id的員工記錄。 2. RIGHT OUTER JOIN:右外連接 SELECT e.last_name, d.name FROM s_emp e RIGHT OUTER JOIN s_dept d ON (e.dept_id = d.id); 等價(jià)于 SELECT e.last_name,d.name FROM s_emp e, s_dept d WHERE e.dept_id(+)=d.id; 結(jié)果為:所有員工及對(duì)應(yīng)部門的記錄,包括沒(méi)有任何員工的部門記錄。 3. FULL OUTER JOIN:全外關(guān)聯(lián) SELECT e.dept_id,d.id FROM s_emp e FULL OUTER JOIN s_dept d ON (e.dept_id = d.id); 結(jié)果為:所有員工及對(duì)應(yīng)部門的記錄,包括沒(méi)有對(duì)應(yīng)部門編號(hào)department_id的員工記錄和沒(méi)有任何員工的部門記錄。 六.組函數(shù) group by把 select 的結(jié)果集分成幾個(gè)小組,這個(gè)group by 子句可以跟在 select 語(yǔ)句后或是 having前面。group by子句也會(huì)觸發(fā)排序操作,會(huì)按分組字段排序。 select [組函數(shù)或分組的字段名]... from 表名 group by [字段名1],[字段名2],.....; 例:select avg(salary) from s_emp group by dept_id; 注意:組函數(shù)會(huì)忽略空值,但是count(*)除外,他會(huì)把空記錄也記錄在內(nèi)。avg和sum這兩個(gè)函數(shù)的參數(shù)只能是number型的。 以下所提到的函數(shù)可以使用任意類型做參數(shù)。 max(..),min(..)求最大值和最小值, count(*)統(tǒng)計(jì)表中記錄數(shù)。 例:select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id; 注意:只要寫了group by子句,select后就只能用group by之后的字段或者是組函數(shù)。having子句可以過(guò)濾組函數(shù)結(jié)果或是分組的信息,并且寫在group by子句后。 七.子查詢 可以嵌在sql語(yǔ)句中的select語(yǔ)句。 在select語(yǔ)句中嵌套子查詢時(shí),會(huì)先執(zhí)行子查詢。一般的會(huì)將子查詢放在運(yùn)算符的右邊。 注意:在使用子查詢時(shí),要注意這個(gè)運(yùn)算符是單行的(也就是只能是單值),還是多行運(yùn)算符(范圍,多值)。配合使用子查詢返回的結(jié)果必須符合運(yùn)算符的用法。 例: select first_name||' '||last_name name from s_emp where title in (select title from s_emp where dept_id=42); 查詢和42部門員工職位相同的所有員工的姓名 八.約束 針對(duì)表中的字段進(jìn)行定義的。 primary key(主鍵約束 PK)保證實(shí)體的完整性,保證記錄的唯一 主鍵約束,唯一且非空,并且每一個(gè)表中只能有一個(gè)主鍵,有兩個(gè)字段聯(lián)合作為主鍵時(shí),將兩個(gè)字段放在一起唯一標(biāo)識(shí)記錄,叫做聯(lián)合主鍵。 主鍵約束的定義: 第一種定義形式: create table test(c number primary key ); 列級(jí)約束 第二種定義形式: create table test(c number , primary key(c) ) ; 表級(jí)約束 create table test(c1 number constraints pk_c1 primary key ); 此約束有名字: pk_c1 create table test(c number , c2 number , primary key (c ,c1) ) ; 用表級(jí)約束可以實(shí)現(xiàn)聯(lián)合主鍵 foreign key(外鍵約束 FK)保證引用的完整性,外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一鍵的約束,不能夠取其他值,只能夠引用主鍵或唯一鍵的值,被引用的表,叫做 parent table(父表),引用方的表叫做child table(子表),要想創(chuàng)建子表,就要先創(chuàng)建父表,記錄的插入也是如此,先父表后子表,刪除記錄,要先刪除子表記錄,后刪除父表記錄,要修改記錄,如果要修改父表的記錄要保證沒(méi)有被子表引用。要?jiǎng)h表時(shí),要先刪子表,后刪除父表。(可以通過(guò)使用cascade constraints 選項(xiàng)來(lái)刪除父表) carete table parent(c1 number primary key ); create table child (c number primary key , c2 number references parent(c1)); 或表級(jí)約束定義: create table child( c number primary key , c2 number , foreign key(c2) references parent(c1)); 非空約束(not null)這是一個(gè)列級(jí)約束,在建表時(shí),在數(shù)據(jù)類型的后面加上 not null ,也就是在插入時(shí)不允許插入空值。 例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32)); unique 唯一約束 唯一約束,允許為空,要求插入的記錄中的值是唯一的。 例:create table student(id number,name varchar2(32),address varchar2(32),primary key (id),unique (address)); check約束 檢查約束,可以按照指定條件,檢查記錄的插入。check中不能使用偽列,不能使用函數(shù),不能引用其他字段。 例:create table sal (a1 number , check(a1>1000)); 九.數(shù)據(jù)字典 數(shù)據(jù)字典是由系統(tǒng)維護(hù)的,包含數(shù)據(jù)庫(kù)的信息 數(shù)據(jù)字典示圖 user_XXXXX 用戶示圖 all_XXXXX 所有示圖 dba_XXXXX 數(shù)據(jù)庫(kù)中所有示圖 v$_XXXXX 動(dòng)態(tài)性能示圖 dict或 dictionary 表示數(shù)據(jù)字典的數(shù)據(jù)字典。 user_constraints 用戶的表中約束的表 其中有constraints_name字段存放的是約束名,constraint_type字段存放的是約束的類型,r_constraints_name字段表示外鍵引用自何處. user_cons_column表,是用戶的列級(jí)約束表,column_name字段存放的是約束字段的名字,position字段存放的是約束在聯(lián)合鍵中的位置. 十.事務(wù)transaction 原子操作,也就是不可分割的操作,必須一起成功一起失敗。 事務(wù)的結(jié)束動(dòng)作就是commit,DDL,DCL語(yǔ)句執(zhí)行會(huì)自動(dòng)提交commit。 sqlplus正常退出是會(huì)做提交動(dòng)作的commit;,當(dāng)系統(tǒng)異常推出是,會(huì)執(zhí)行回滾操作rollback;。 一個(gè)沒(méi)有結(jié)束的事務(wù),叫做活動(dòng)的事務(wù) (active transaction),活動(dòng)的事務(wù)中修改的數(shù)據(jù),只有本會(huì)話才能看見(jiàn)。 十一.Oracle中的偽列 偽列就像Oracle中的一個(gè)表列,但實(shí)際上它并未存儲(chǔ)在表中。偽列可以從表中查詢,但是不能插入、更新或刪除它們的值。常用的偽列:rowid和rownum。 rowid:數(shù)據(jù)庫(kù)中的每一行都有一個(gè)行地址,rowid偽列返回該行地址??梢允褂胷owid值來(lái)定位表中的一行。通常情況下,rowid值可以唯一地標(biāo)識(shí)數(shù)據(jù)庫(kù)中的一行。 rowid偽列有以下重要用途: 1)能以最快的方式訪問(wèn)表中的一行; 2)能顯示表的行是如何存儲(chǔ)的。 3)可以作為表中行的唯一標(biāo)識(shí)。 如:SQL> select rowid,ename from emp; rownum:對(duì)于一個(gè)查詢返回的每一行,rownum偽列返回一個(gè)數(shù)值代表的次序。 rownum偽列特點(diǎn): 1) 有個(gè)特點(diǎn)要么等于1 要么小于某個(gè)值, 不能直接等于某個(gè)值, 不能大于某個(gè)值。 2)常用于分頁(yè)顯示。 返回的第一行的rownum值為1,第二行的rownum值為2,依此類推。通過(guò)使用rownum偽列,用戶可以限制查詢返回的行數(shù)。 如:SQL>select * from emp where rownum<11; 從emp表中提取10條記錄。 十二.序列(sequence) create sequence 序列名; (不帶參數(shù)時(shí)默認(rèn)為從1 開始每次遞增 1,oracle中為了提高產(chǎn)生序列的效率一般一次性產(chǎn)生20個(gè)序列放入當(dāng)前會(huì)話的序列池中備用以加快效率) sequence 的參數(shù): increment by n 起始值 start with n 遞增量 maxvalue n 最大值 minvalue n 最小值 cycle|no cycle 循環(huán) cache n 緩存(第一次取時(shí)會(huì)一次取多少個(gè)id存起來(lái)) 查看sequence 示圖: desc user_sequences ; select sequence_name , cache_size , last_number from user_sequences where sequence_name like 's_'; select 序列名.currval from dual 查看當(dāng)前的序列數(shù) select 序列名.nextval from dual 查看下一個(gè)序列數(shù),它會(huì)自動(dòng)給當(dāng)前的序列加1 刪除序列sequence drop sequence 序列名; 十三. 視圖(View) 視圖就相當(dāng)于一條select 語(yǔ)句,定義了一個(gè)視圖就是定義了一個(gè)sql語(yǔ)句, 視圖不占空間,使用視圖不會(huì)提高性能,但是能簡(jiǎn)化sql語(yǔ)句 創(chuàng)建視圖: creating views視圖名; 如: create or replace views test as select * from test1 where c1=1; create or replace:如果view存在就覆蓋,不存在才創(chuàng)建。 force|no force:基表存在時(shí)使用,不存在時(shí)則創(chuàng)建該表。 注意:向視圖中插入數(shù)據(jù)時(shí),會(huì)直接插進(jìn)基表中,查看視圖中的數(shù)據(jù)時(shí),相當(dāng)于就是執(zhí)行創(chuàng)建時(shí)的select語(yǔ)句。 刪除視圖: drop views視圖名; 試圖的約束: with read only視圖只讀約束 with check option 不允許插入與where條件不符的記錄,類似于check約束的功能. create view test_cc as select * from test where c1>10 with check option; 十四.索引(index) 建立索引的目的就是為了加快查詢速度,建立索引后會(huì)使DML操作效率慢,但是對(duì)用戶查詢會(huì)提高效率。刪除一個(gè)表時(shí),相對(duì)應(yīng)的索引也會(huì)刪除。另外,索引是會(huì)進(jìn)行排序。 創(chuàng)建一個(gè)索引: create index 索引名 on 表名 (字段名); create index test_index on test(c1); 刪除索引: drop index test_index; 注意:創(chuàng)建索引就是為了減少物理讀,索引會(huì)減少掃描的時(shí)間。在經(jīng)常要用到where的子句的字段,應(yīng)該使用索引,另外還要看所查詢的數(shù)據(jù)與全部數(shù)據(jù)的百分比,表越大,查詢的記錄越少,索引的效率就越高. |
|