<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    即使世界明天毀滅,我也要在今天種下我的葡萄樹。
    posts - 112, comments - 14, trackbacks - 0, articles - 11

    ORACLE筆記

    Posted on 2007-01-16 16:43 閱讀(630) 評論(0)  編輯  收藏 所屬分類: DateBase Design
    Oracle SQL(Oracle 9i 9.2.0.1.0)
    ?
    SQL( 結構化查詢語言) ,是操作關系型數據庫中的對象。
    DDL (數據定義語言),用于建表或刪表操作,以及對表約束進行修改。
    DML (數據操作語言),向表中插入紀錄,修改紀錄。
    事務控制語言,commit; rollback;
    授權語句
    ?
    select(數據的查詢),投影,過濾(選擇)查尋,關聯查尋(表連接)。
    ?
    sqlplus 訪問數據庫命令(本地訪問/遠程訪問),和數據庫建立連接的命令,是數據庫操作的環境
    sqlplus 用戶名/密碼
    ?
    show user 顯示當前用戶的用戶名
    ?
    在sqlplus中可以使用 ! 可以在shell和sqlplus間切換,!shell命令 可以在sqlplus中使用shell命令。實際上是sqlplus開了子進程來執行shell命令。
    ?
    Oracle數據庫中的表分兩類:用戶表(用戶使用操作的表),系統表(數據庫系統維護的表,數據字典)
    ?
    select 查詢語句
    select table_name from user_tables;(查詢系統表)
    以上的查詢語句就是查詢本用戶下所擁有的所有表的表名。
    ?
    desc [表名] 這是一條sqlplus命令,注意他不是sql語句,這條命令用于查看表的結構。
    [字段名] [字段的類型],這是使用完desc命令后顯示的表結構。
    ?
    投影操作,只查看選擇的字段的信息。
    選擇操作,查看字段中的特定某些信息。
    多表查詢,通過表間連接,查尋出多表中的信息
    ?
    !oerr ora [ 錯誤號] ,系統可以顯示錯誤的原因和如何修改。
    如果命令錯誤輸入可以使用edit或ed來修改輸入錯誤。實際上是在編輯緩存文件中的最后一條sql語句。也可以使用 (change) c /錯誤字段/正確字段,來進行替換操作進行修改。
    ?
    select [表的字段名1],[表的字段名2], ... from 表名;
    select * from 表名; 查尋表中所有字段的信息
    ?
    關鍵字不等拆分,sql語句,以及表名,字段名是大小寫不敏感的。
    sql語句要以";"結尾,來表示sql語句結束,如果不加";"系統不會執行此條sql語句,并提示。
    sqlplus的buffer中會緩存最后一條sql語句,可以使用"/"來執行這最后一條sql語句,也可以使用
    edit命令來編輯最后一條sql語句。l命令(list)(sqlplus命令)可以顯示buffer中最后一條命令。
    ?
    sqlplus 設置
    set pause on 回車響應,分屏顯示,只在本會話中有效
    set pause off 關閉分屏顯示。
    set pause '...' 設置分屏顯示的提示信息。
    set pause on 先輸出提示信息,回車響應,分屏顯示
    set head off 提頭輸出關閉
    set feed off 結尾輸出關閉
    set echo off 回寫關閉
    spool 文件名.sql 寫入指定文件
    spool off 關閉寫入。
    ?
    清屏命令 !clear 或 clear screen
    ?
    在Oracle中字符顯示是左對齊,數值右對齊。
    ?
    在select 語句中可以使用數學表達式。
    ?
    select [表達式(必須包含本表字段名)],[...],.... from 表名;
    運算的優先級的先乘除后加減,同級自左向右運算,括號改變優先級。
    ?
    select [字段名或表達式] ["別名"],[...] ["..."],.... from 表名;
    ?
    可以通過在字段名或表達式后加空格"別名",可以給列,或者表達式結果其別名。
    字符串拼接使用||符號
    ?
    select 目標字段名||" "||目標字段名 from 表名;
    注意:在Oracle中的字符串要用'..'包含
    別名中需要使用空格,或是大小寫敏感時需要用".."包含。
    ?
    sql 腳本,也就是在文件中寫有sql語句的文件,可以在sqlplus中運行,推薦為.sql。
    引入sql腳本: sqlplus 用戶名/密碼 @sql腳本(注意@前一定要有空格,否則含義就變了)
    Oracle中的空值 空值會當無窮大處理。
    Oracle中控制處理函數 NVL(字段名,值),這個字段中的空值替換為指定值,如果不為空,則會返回其原值。
    例:select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;
    ?
    distinct 關鍵字,去掉重復行(這個關鍵字會處發排序操作)
    例: select distinct dept_id,title from s_emp;
    注意:distinct,關鍵字之后會對from之前的字段進行排重操作。
    column 命令(這是個sqlplus命令)
    column命令 列格式的定義
    ?
    column 目標列名 查看這個類是否定義了格式
    ?
    column 目標列名 format a.. 設置列寬。
    column last_name heading 'Employee|Name'(設置題頭) FORMAT A15
    這其中的'|'是換行符
    ?
    column salary justify left format $99,990.00(定義數字顯示格式)
    注意:如果不滿足顯示的格式,就會把數據顯示為"#"
    ?
    column 列名 clear (清除列格式定義)
    ?
    注意:只有sqlplus命令才有簡寫,并且在使用sqlplus命令時結尾也不能加分號。
    ?
    選擇操作
    ?
    order by 排序子句 ASC(默認,升序) DESC(降序)
    ?
    order by 目標列名(別名) 排序順序(不寫排序順序,會默認為升序排序)
    ?
    例:select first_name from s_emp order by first_name;
    ??? select first_name from s_emp order by first_name desc;
    ?
    注意:升序空值在結果的末尾,降序空值在結果的最前面。
    ?
    where 子句
    ?
    where子句使用在 select ... from ... 后面,用來選擇所需(符合條件的)的記錄
    ?
    where后面跟的是表達式 也就是 XXX=XXX, XXX between X and X?,XXX in(X,X,X)
    like '...' 通配查詢
    ?
    between ... and ... ,表示結果在這之間,between and是一個閉區間。
    !=,<>,^=,這三個都標識不等于,<=,>=,=,這些運算符都可以使用。
    ... in (va1,val2,...) 判斷結果是否在這個枚舉中存在
    like '...' 字符串通配查詢,'%'表示多個字符,'_',表示一個字符。
    ... and ... 表示只有兩個條件同時滿足
    ... or ... 表示條件只要滿足其中只一就可以
    all ... 是要求都滿足條件。
    not .....,則是可以與以上的條件產生反效果。
    ... is null 使用來判斷值是不是空。
    注意:Oracle中的字符串是嚴格區分大小寫的。
    ?
    1.注意數據類型
    2.選擇合適的運算符
    ?
    Oracle 數據庫函數(單行函數)
    ?
    Oracle中的函數和C中的函數差不多,也是有函數名,參數表,和返回值類型組成的
    ?
    1,字符函數
    ?? 字符是大小寫敏感的
    ?? 轉小寫 lower(...)
    ?? 轉大寫 upper(...)
    ?? 首字母大寫 initcap(...)
    ?? dual表,是專門用于函數測試和運算的,他只有一條記錄?????
    ?? 字符串拼接 concat(...,....)
    ?? 求指定子串 substr(...,起始位置,取字符個數)
    ?? 可以使用"-"表示從右向左取,取的時候可以從左往友取。
    ??? 例:select substr(first_name,-2,2) sub from s_emp;(取后兩個)
    ?????? select substr(first_name,2,2) sub from s_emp;(取前兩個)
    2,數值函數
    ?? 四舍五入 round(數據,保留小數點后幾位)
    ?? 可以用負數表示小數點前,0,表示小數點后第一位,也就是保留個位,-1表示個位(保留到十?? 位)。
    ?? 例:select round(15.36,1) from dual;
    ?? 截取數字函數 trunc(數據,保留的位數(小數點后位數)) 截取個位之后補0
    ?? 例:select trunc(123.456,1) from dual;
    3,日期函數
    ?? 日期格式,
    ?? 全日期格式 世紀信息,年月日,時分秒。
    ?? 缺省日期格式,日-月-年 dd-mon-rr
    ?? 修改當前會話的日期格式,會按照指定的格式輸出日期
    ?? alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
    ?? 返回當前日期 sysdate
    ?? 例:select sysdate from dual;
    ?? 日期是格式敏感的
    ?? 求兩個日期間相隔了多少個月 months_between(date1,date2)
    ?? 加減指定數量的月份 add_months(date,月數),月數可以為負,負值就是減去相應的月數。
    ?? 從下周開始的日期加一天 next_day(date,天數)
    ?? 例:select next_day(sysdate,2) from dual;
    ?? 返回月末的日期 last_day(date)
    ?? 截取日期 trunc(date,'年或月或日或時分秒')
    ?? 例:select trunc(add_months(sysdate,1),'month') from dual;
    ?
    4,不同數據類型間轉換函數
    ?? 將日期轉成字符 tochar(date,'日期格式')
    ?? 日期格式要用有效格式,格式大小寫敏感 'yyyy mm dd hh24:mi:ss','year'(全拼的年),'mm'(數字表示的月) 'month'(全拼的月),'day'(星期的全拼),'ddspth' (日期的全拼) 'yy mm dd'
    ?? 例:select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual;
    ?? 將字符轉換成數字 to_number('...')
    ?? 將數字轉字符to_char(number,'fmt') fmt是數字格式
    ?? 將字符串轉成日期 to_date('...','日期格式')
    ?? 例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;
    5,函數嵌套
    例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;
    ?
    表連接(關聯查尋)
    如果多表查詢時不加where子句,也就是過濾條件或者是使用了無效的條件,就會產生兩表之間記錄的相互逐條匹配(組合),產生很多無效的結果(笛卡爾積)。
    注意:在使用表連接時,要注意查詢的表間的關系信息,表之間的字段所表示的信息的關系
    等值連接
    ?select [表別名1.字段名1],[表別名2.字段名2],...
    ?from 表1 表別名1 ,表2 表別名2
    ?where 表別名1.字段名3=表別名2.字段名4;
    ?表連接時,當表與表之間有同名字段時,可以加上表名或表的別名,加以區分,使用時要用
    表名.字段名或表別名.字段名(列名)。當表的字段名是唯一時,可以不用加上表名或表的別名。
    注意:當為表起了別名,就不能再使用表名.字段名
    例:select a.first_name,a.last_name,b.name from s_emp a,s_dept b where a.dept_id=b.id;
    ?
    非等值連接
    ?select [表別名1.字段名1],[表別名2.字段名2],...
    ?from 表1 表別名1 ,表2 表別名2
    ?where 表別名1.字段名3 ..... 表別名2.字段名4
    ?....可以使比較運算符,也可以使其他的除了'='的運算符
    例:select e.ename, d.grade,e.sal from emp e,salgrade d where e.sal between d.losal and d.hisal;
    ?
    自連接 用別名把一張表中的數據分成兩部分,然后在使用條件過濾。
    ?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;
    以上所提到的表連接,都叫做內連接。
    ?
    ?
    外連接 會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,數據庫會模擬出記錄去和那些不匹配的記錄匹配。
    例:select a.first_name enamei,a.id,b.first_name cname,b.id from s_emp a,s_emp b where a.manager_id=b.id(+);
    注意:要把那一方的記錄全部都顯示出來,還有注意條件(+)跟在要全部顯示的那個表的字段后。
    ?
    組函數
    group 組
    group by 分組子句,按指定的分組規則分組 ,這個group by 子句可以跟在 select 語句后或是 having后面。group by子句也會出發排序操作,會按分組字段排序。
    ?
    select [組函數或分組的字段名] ,... from 表名 group by [字段名1],[字段名2],.....;
    例:select avg(salary) from s_emp group by dept_id;
    ?
    注意:組函數可以處理一組數據,返回一個值。組函數會忽略空值。count()除外,他會把空記錄也記錄在內。
    ?
    avg(..),求平均值,sum(..),求和 這兩個函數的參數只能是number型的。
    ?
    以下所提到的函數可以使用任意類型做參數。
    count(..),用來統計記錄數,可以使用排重命令。count(...)默認使用的是all。
    max(..),min(..)求最大值和最小值,
    count(*),統計表中記錄數。
    例: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后的字段或者是組函數。
    ????? where子句只能夠過濾記錄。
    having子句可以過濾組函數結果或是分組的信息,且寫在group by子句后。
    例:
    ?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 having sum(a.salary)>4000;
    ?
    column 也可以定義有別名的列的格式。
    column "別名" 格式定義
    注意:要先過濾掉不需要的記錄,然后再進行分組操作,提高效率。
    ?
    子查詢
    子查詢,就是可以嵌在任何的sql語句中的select語句。
    ?
    在select語句中嵌套子查詢時,會先執行子查詢。一般的會將子查詢放在運算符的右邊。
    ?
    注意:在使用子查詢時,要注意這個運算符是單行的(也就是只能是單值),還是多行運算符(范圍,多值)。配合使用子查詢返回的結果必須符合運算符的用法。
    例:
    select first_name,title from s_emp where title=any(select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';
    ?
    select first_name,title from s_emp where title in (select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';
    ?
    數據庫設計
    ?
    數據庫表設計,把業務需求轉換成可操作的表。
    1,需求分析,了解客戶的業務需求(業務技能)。
    2,設計,通過ER圖(實體關系圖)
    3,建表
    4,測試
    5,形成產品
    ?
    ER
    將一類事物的共性抽象處來成為一個實體,并且表現出來實體間的關系。
    unique identifier 唯一的值
    primary with???? '#*' 唯一且非空
    indispensable 必要的(也就是要求必須非空)
    ?
    實體關系
    one to one 一對一關聯,one to many 一對多關聯,many to many 多對多關聯
    反射關聯,自身的屬性之間的關聯
    ?
    ER 圖轉換成表
    ?
    ?
    第一范式,所有的屬性都必須是單值,也就是屬性只表示單一的意義。(記錄可以重復,沒有任何限制)
    第二范式,屬性要求唯一且非空,(記錄不可重復,但是數據可能會出現冗余)。
    第三范式,非主屬性只能依賴于主屬性,不能依賴于其他非主屬性。(解決數據冗余問題)
    ?
    約束
    約束是針對表中的字段進行定義的。
    ?
    primary key (主鍵約束 PK)保證實體的完整性,保證記錄的唯一
    主鍵約束,唯一且非空,并且每一個表中只能有一個主鍵,有兩個字段聯合作為主鍵,只有兩個字段放在一起唯一標識記錄,叫做聯合主鍵。
    ?
    foreign key (外建約束 FK)保證引用的完整性,
    外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值得約束,不能夠取其他值,只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想創建子表,就要先創建父表,后創建子表,記錄的插入也是如此,先父表后子表,刪除記錄,要先刪除子表記錄,后刪除父表記錄,要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,后刪除父表。
    ?
    unuque key(唯一鍵),值為唯一
    ?
    index(索引)是數據庫特有的一類對象,view(視圖)
    典型的一對多 class 對應多個學生。
    student table??????????????? ??????class table
    ?______________________________???? _________________________
    | id | name | address| class_id|?? | id |class_desc|class_num|
    |(PK)|______|________|___(FK)__|?? |(pk)|__________|_________|
    |??? |????? |??????? |???????? |?? |??? |??????? ??|???????? |
    ?
    一對一
    ?
    student tabel???????????? shenfenzheng table
    ?____________________???? _________________________________
    | id | name | address|?? |?s_id?|shenfen_desc|shenfen_num|
    |(PK)|______|________|?? |(PK,FK)|____________|___________|
    |??? |????? |??????? |?? |??????? |??????????? |?????????? |
    ?
    多對多
    ?
    student tabel???????????? zhongjian table????????????????????? kecheng table
    ?____________________???? _________________________________??? __________________
    | id | name | address|?? |?s_id?|shenfen_desc|shenfen_num|?| kid | kechengname|
    |(PK)|______|________|?? |(FK,FK)|____________|___________|?| (PK)|____________|
    |??? |????? |??????? |?? |聯合主鍵|??????????? |?????????? |?|???? |??????????? |
    ?
    引用對方表的主鍵,當作本身的主鍵,所以這個表的主鍵,既是主鍵又是外建
    ?
    建表和其他相關操作
    ?
    DDL 語句
    ?
    創建表:
    ?? create??? table?表名?? (??? 字段名1??? 類型(數據長度)(default ...)?? 約束條件,?? 字段名2??? 類型(數據長度)??? 約束條件 );
    ?
    Oracle 數據庫中的數據類型
    varchar(長度),可變長字符串,char(長度) 定長
    number(..,..),number 表示浮點數,或者是整數
    long 大對象,clog 字符的大對象,相當于文本文件在表中只存放一個相當于只針對值
    ???????????? blog 二進制的大對象,也是以相當于指針的形式存放的。
    primary key約束:
    主鍵約束的定義:
    第一種定義形式:
    create table?? test(c?number?primary key?);???? 列級約束
    第二種定義形式:
    create table?test(c?number , primary key(c) )?; 表級約束
    create table?? test( c1?number?constraints?? pkc1?primary key );?? 此約束有名字:?pkc1
    create table?? test(c number , c2?number ,?primary key (c ,c1) ); 用表級約束可以實現聯合主鍵
    ?
    foregin?key?? (fk)?? 外鍵約束:
    (先定義父表,再定義子表)
    carete?? table???? parent(c1 number?primary key );
    create?? table??? child?(c?number primary key ,?? c2 number?references parent(c1));
    或表級約束定義:
    create?? table?child( c number primary key ,?c2?number?, foreign key(c2)?references?parent(c1));
    ?
    約束
    ?
    非空約束(not null)這是一個列級約束
    在建表時,在數據類型的后面加上 not null ,也就是在插入時不允許插入空值。
    ?
    例: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中不能使用尾列,不能使用函數,不能引用其他字段。
    例:create table sal (a1 number , check(a1>1000));
    ?
    創建腳本?? 例:見課本相應章節
    ?
    ?
    ?
    一對一建表語句
    ?
    student table
    ?
    create table student(
    ?????? id number,
    ?????? name varchar2(32),
    ?????? address varchar2(32)
    ?????? primary key(id)
    );
    ?
    shenfenzheng table
    ?
    create tabel shenfenzheng(
    ?????? sid number primary key,
    ?????? num number unique not null,
    ?????? foreign key (sid) references student(id)
    );
    ?
    一對多
    ?
    class table
    create table class(
    ??????? cid number,
    ??????? class_num number,
    ??????? desc varchar2(32),
    ??????? primary key(cid)
    );
    ?
    student table
    create table student(
    ?????? id number,
    ?????? name varchar2(32),
    ?????? address varchar2(32)
    ?????? class_id number,
    ?????? primary key(id),foreign key (class_id) references class(cid)
    );
    ?
    ?
    ?
    ?
    ?
    數據字典
    ?
    數據字典是由系統維護的,包含的數據庫的信息
    數據字典視圖
    user_XXXXX 用戶視圖
    all_XXXXX?所有視圖
    dba_XXXXX?數據庫中所有視圖
    v$_XXXXX?? 動態性能視圖
    ?
    dist或 distionary 表示數據字典的數據字典。
    ?
    user_constraints 用戶的表中約束的表
    其中有constraints_name字段存放的是約束名,r_constraints_name字段表示外鍵引用子何處
    這兩個字段之間有自連接的關系,也就是約束名和外鍵約束名之間的自連接。
    ?
    user_cons_column表,是用戶的列級約束表
    ?
    DML 操作
    ?
    insert 操作,插入記錄
    ?
    insert into 表名 values(值1,值2,......);
    注意這種方法插入記錄時,要對所有字段進行插入,沒有非空約束時,又不想插入值時,要用空值替代,并且要按照字段的順序插值(要清楚表結構),且要注意數據類型一致。
    ?
    insert into 表名(字段名1,字段名2,.....) values(值1,值2,......);
    這種方法可以對指定的字段進行插入,不想插值的就可以不寫,前提是該字段沒有非空約束。
    ?
    例:insert into student values(1,'xxx','xxx');
    ??? insert into student(id,name,address) values(1,'xxx','xxx');
    ?
    update 修改操作
    ?
    update table 表名 set?字段名1=數據1或表達式1, 字段名2=數據2或表達式2
    [where ....=....];
    例:update shenfenzhen set num=99 where sid=2;
    ?
    delete 刪除操作
    ?
    delete from 表名 [where ...=...];
    例:update shenfenzhen set num=99 where sid=2;
    用delete操作刪除的記錄可以通過 rollback命令回滾操作,會恢復delete操作刪除的數據。
    delete操作不會釋放表所占用的空間,delete不是和刪除記錄多的大表。delete操作會占用大量的系統資源。
    事務transaction
    ?
    OLTP聯機事務處理 OnLine Transaction Process)
    原子操作,也就是不可分割的操作,必須一起成功一起失敗。
    要是實現一個原子操作,就要把這個原子操作(操作數據庫數據(DML操作))放在事務中。
    事務的結束動作 就是commit;語句 rollback;語句,DDL,DCL語句執行會自動提交commit;。
    sqlplus正常退出是會做提交動作的commit;,當系統異常推出是,會執行回滾操作rollback;。
    事務的開始,一個事務的開始就是上一個事務的結束。
    一個沒有結束的事務,叫做活動的事務 (active transaction),活動的事務中修改的數據,只有本會話才能看見。
    readcommited,只可以讀取已經作提交操作的數據,本會話可以看到自己的所作的沒有提交的操作。
    在活動事務中,當多個用戶同時對同一張表進行操作時,會對表加上表級共享鎖,當用戶對操作該表某一條記錄進行操作時會對該條記錄加上行級排它鎖,只允許一個用戶對該條記錄進行DML操作,只有提交操作commit;或回滾操作rollback;時,才可讓其他用戶操作對該記錄進行DML操作,也就是釋放了該條記錄的行級排它鎖。如果沒有提交操作或回滾操作,那么該用戶就不能對該條記錄加鎖,該用戶的DML操作就會進入等待狀態,但是在對表作drop操作(DDL操作)時,如果還有用戶在操作該表,也就是沒有釋放表級共享鎖,就會直接報錯。
    ?
    事務越大,就會消耗更多的資源,并長時間持有事務會造成無法進行其他的操作,事物提交太頻繁的話,會對I/O造成很大的負擔,所以要合理確定事務的大小。
    ?
    commit;提交操作,事物的結束
    ?
    rollback;回滾操作,會將先前的活動事務中的操作(DML操作)的結果進行回滾,撤銷全部操作,恢復成事務開始時的數據,也就是恢復成事務開始時的狀態。
    ?
    alter table 命令
    alter table 命令用于修改表的結構(這些命令不會經常用):
    ?
    增加字段:
    alter?table 表名 add(字段字,字段類型)
    ?
    刪除字段
    alter tbale 表名 drop column 字段; (8i 以后才支持)
    ?
    給列改名:9.2.0才支持
    alter table 表名 rename column 舊字段名 to 新字段名;
    ?
    修改字段
    alter table 表名 modify( 字段,類型)
    (此時應注意的問題,更改時要看具體值情況之間的轉達換, 改為字符類型時,必須要為空)
    not null約束是使用alter table .. modify (..,not null),來加上的。
    增加約束:
    alter table 表名 add constraint [約束名] 約束(字段);
    只能夠增加表級約束。
    ?
    解除約束:(刪除約束)
    ?
    alter table 表名 drop 約束;
    (對于主鍵約束可以直接用此方法,因為一張表中只有一個主鍵約束名, 注意如果主鍵此時還有其它表引用時刪除主鍵時會出錯)
    ?
    alter table father drop primary key cascade;?
    (如果有子表引用主鍵時,要用此語法來刪除主鍵,這時子表還存在只是子表中的外鍵約束被及聯刪除了)
    ?
    alter table 表名 drop constraint 約束名;
    (怎樣取一個約束名:
    a、人為的違反約束規定根據錯誤信息獲取!
    b、查詢視圖獲取約束名!)
    ?
    使約束失效或者生效
    ?
    alter table?表名?disable from primary key;?(相當于把一個表的主鍵禁用)
    ?
    alter table?表名?enable primary key;
    (enable 時會自動去檢查表的記錄是不是符合要求,如果有臟數據時必須要先刪除臟數據才可以 enable)
    ?
    更改表名
    rename 舊表名 to 新表名;
    ?
    刪除表
    trucate table 表名;
    (表結構還在,數據全部刪除,釋放表所占的空間,不支持回退,常用刪除大表)
    ?
    關于oralce中產生序列(sequence)
    create sequence?序列名;
    ?
    (不帶參數時默認為從1 開始每次遞增 1,oracle中為了提高產生序列的效率一般一次性產生20個序列放入當前會話的序列池中備用以加快效率,序列會出現不連續的動作回退操作不會影響序列取值)
    ?
    ?
    ?
    sequence 的參數:
    increment by n?? 起始值
    start with n???? 遞增量
    maxvalue n?????? 最大值?
    minvalue n?????? 最小值
    cycle|no cycle?? 輪回?
    cache n????????? 緩存(第一次取時會一次取多少個id存起來)
    ?
    查看sequence 視圖:
    desc??? user_sequences ;
    select?? sequence_name , cache_size , last_number?from?user_sequences?? where?? sequence_name?like 's_';
    select?序列名.currval?from?? dual??? 查看當前的序列數
    select?序列名.nextval ?from?? dual??? 查看下一個序列數,它會自動給當前的序列加1
    為列:nextval????????? currval
    (開另一個session時取當前值不成功時,應該先取下一個值,再取當前值)
    ?
    清空當前會話的內存:
    alter system?flush?? shared_pool;(執行此命令要有DBA權限,一般用戶執行出錯)
    ?
    修改序列:(此命令不常用,只需了解就行不必深究)
    alter?sequence?序列名?修改項;
    刪除序列sequence
    drop sequence 序列名;
    ?
    視圖
    ?
    創建視圖:
    creating?views 視圖名;
    ?
    視圖就相當于一條select 語句,定義了一個視圖就是定義了一個sql語句,視圖不占空間,使用view 不會提高性能,但是能簡單化sql語句
    (擴展知識: oracle?8i 以后的新視圖)
    MV?物化視圖(占存儲空間,把select 結果存在一個空間,會提高查詢視圖,增強實時性,但是存在刷新問題,物化視圖中的數據存在延遲問題,主要應用在數據倉庫中用要用于聚合表)
    ?
    使用視圖的好處:控制數據訪問權限。
    ?
    如何創建一個視圖的例子:
    create or replace views test_vi as select * from test1 where c1=1;
    ?
    or replace的意義,如果view存在就覆蓋,不存在才創建。
    force|no force ,基表存在是使用,不存在是則創建該表。
    此時往表test1(base table 基表)中插入數據時:表中沒能變化,視圖中的數據發生改變
    從視圖中插數據時相對應的表會發生改變:
    往視圖中插數據時,會直接插進基表中,查看視圖中的數據時,相當于就是執行創建時的select語句。
    ?
    限制對數據庫的訪問,簡化查詢。
    簡單視圖:來自于單表,且select語句中不能包括函數,能進行DML操作。
    復雜視圖:來源于多張表,不能執行DML操作。
    ?
    視圖的約束
    with read only 視圖只讀約束(O)
    with check option 不允許插入與where條件不符的記錄,類似于check約束的功能(V)
    ?
    在select from 后也可以使用子查尋,這個寫法也叫做內嵌視圖
    例:
    select first_name,salary,avgsal from s_emp e,(select dept_id,avg(salary) avgsal from s_emp group by dept_id) s where e.dept_id=s.dept_id and e.salary>s.avgsal;
    ?
    刪除視圖 drop views 視圖名;
    ?
    行號(rownum
    關于rownum:
    rownum?有個特點要么等于1 要么小于某個值, 不能直接等于某個值, 不能大于某個值。
    rownum常用于分頁顯示。
    rownum只用于讀入內存的數據。
    ?
    關于同義詞
    ?
    同義詞:相當于別名的作用(***只需了解***)系統自建的同義詞:
    user_tables
    ?
    create synonym asd_s_emp for asd_0606.s_emp ;
    目的就是為了給asd_0606_s_emp表起另一個代替的名稱asd.s_emp;注意這個同義詞只能自己使用;
    create public synonym?p_s_emp?fro asd_0606.s_emp; 創建公共的同義詞,但是要權限.
    刪除同義詞:
    drop?synonym??? 同義詞名稱
    ?
    索引(index
    ?
    創建索引:Creating indexes(概念很重要對系統的性能影響非常大)
    ?
    建索引的目的就是為了加快查詢速度。
    ?
    索引就相于一本的書的目錄。索引點系統空間,屬于表的附屬物。刪除一個表時,相對應的索引也會刪除。索引是會進行排序。
    ?
    truncate 表時索引結構在,但是數據不存在。
    ?
    full table scan 全表掃描
    用索引就是為了快速定位數據:(理解時就以字典的目錄為例)
    創建索引就是創建key和記錄的物理位置(rowid)組成的鍵值對。索引是有獨立的存儲空間,但是和表是邏輯關聯的,索引和表的關系是依附關系,表被刪除了,索引也沒有存在的意義也就被刪除了
    ?
    在建表時會根據表中的PK或UK自動的建立唯一性索引。
    ?
    查看表的rowid:
    select rowid,first_name from s_emp;
    rowid 定義的信息有:object block table
    ?
    每條記錄都有自己的rowid
    ?
    索引由誰創建:用戶,建索引后會使DML操作效率慢,但是對用戶查詢會提高效率,這就是我們建索引的最終目的。
    ?
    創建一個索引:
    create index 索引名 on 表名 (字段名);
    create insex testindex on test(c1, c2);
    ?
    索引分為唯一性索引,聯合索引。索引中是不會維護空值的。
    ?
    哪些字段應該建索引:創建索引就是為了減少物理讀,索引會減少掃描的時間。
    經常要用where的子句的地方,所以要用索引.用不用索引,關鍵要看所查詢的數據與所有數據的百分比,表越大,查詢的記錄越少,索引的效率就越高.
    ?
    替換變量:用&符號來定義替換變量支持交互性提示,對于字符性的數字,一定要寫在單引號之間
    ?
    更改交互的提示信息:
    accept?p_dname prompt ' 提示信息';
    定義變量:
    define p_dname='abc';
    ?
    set??? verify on
    set??? verify off;
    相當于開關變量,用于控制是否顯示新舊的sql語句
    select id,last_name,salary from s_emp where title='&job_title';
    主站蜘蛛池模板: 久热综合在线亚洲精品| 4338×亚洲全国最大色成网站| 亚洲国产精品久久久久| 国产福利免费视频 | 色偷偷亚洲女人天堂观看欧| 久久青草精品38国产免费| 国产精品国产亚洲精品看不卡| 三级毛片在线免费观看| 亚洲AV无一区二区三区久久| 久久久久久久99精品免费| 夜夜亚洲天天久久| 亚洲免费综合色在线视频| 亚洲精品乱码久久久久久V| 在线看片无码永久免费aⅴ| 日韩色日韩视频亚洲网站| 中文字幕亚洲一区二区三区| 手机看片国产免费永久| 久久久亚洲欧洲日产国码aⅴ | 亚洲精品乱码久久久久久中文字幕 | 亚洲国产成人va在线观看网址| 中国在线观看免费高清完整版| 亚洲欧美国产国产综合一区| 亚洲国产综合人成综合网站| 丝袜捆绑调教视频免费区| 久久久久亚洲av无码专区导航| 人禽杂交18禁网站免费| 亚洲日韩在线中文字幕综合| 国内精品99亚洲免费高清| 午夜免费福利片观看| 亚洲国产精品无码久久| 日韩精品亚洲aⅴ在线影院| 3344免费播放观看视频| 亚洲AV无码一区二区三区久久精品 | 18禁亚洲深夜福利人口| 久久久青草青青亚洲国产免观| 99在线精品视频观看免费| 三年片在线观看免费观看大全中国| 国产精品亚洲成在人线| 最新仑乱免费视频| 成在人线av无码免费高潮喷水| 亚洲中文字幕无码爆乳app|