SQL note

先登陸服務器:    telnet 192.168.0.23    公帳號: openlab-open123    tarena-tarena
再進入SQL:sqlplus sd0807/sd0807        帳號:sd0807-密碼同樣  公帳號:openlab-open123 


設置環境變量:
   ORACLE_SID=oral10g\    --變局部變量
   export ORACLE_SID      --變全局變量
   unset ORACLE_SID       --卸載環境變量
   ORACLE_HOME=...        --安裝路徑;直接用一句語句也可以,如下
   export ORACLE_HOME=/oracledata/.../bin:


一、注意事項:
    大小寫不敏感,即不區分大小寫。提倡關鍵字大寫,便於閱讀和調式。
    “!”在SQL環境下執行Unix命令。
    SQL語句是由簡單的英語單詞構成;這些英語單詞稱爲關鍵字/保留字,不做它用。SQL由多個關鍵字構成。
    SQL語句由子句構成,有些子句是必須的,有些是可選的。
    在處理SQL語句時,其中所有的空格都被忽略(空格只用來分開單詞,連續多個空格當一個用)。
    SQL語句可以在一行上寫出,建議多行寫出,便於閱讀和調試。
    多條SQL語句必須以分號分隔。多數DBMS不需要在單條SQL語句後加分號,但特定的DBMS可能必須在單條SQL語句後加分號。
    SQL語句的最後一句要以 “;”號結束


二、寫子句順序
    Select column,group_function
    From  table
    [Where  condition]
    [Group by  group_by_expression]
    [Having    group_condition]
    ……
    [Order by  column];    --最後


三、常用簡單語句:
    clear screen:清屏
    edit:編輯剛纔的一句。
    desc/describe:(列出所有列名稱)
        用法: DESCRIBE [schema.]object[@db_link]
    dual:亞表,臨時用。如:desc dual;/from dual;
    rollback:回溯,回溯到上次操作前的狀態,把這次事務操作作廢,只有一次(DDL和DCL語句會自動提交,不能回溯)。
        可以用commit語句提交,這樣就回溯不回了。
set pause on\off :設置分屏(設置不分屏) 
set pause "please put an enter key" 且 set pause on:設置帶有提示的分屏
oerr ora 904 :查看錯誤
set head off :去掉表頭
set feed off :去掉表尾
保存在oracle數據庫中的所有操作細節:
   spool oracleday01.txt :開始記錄
   spool off :開始保存細節


四、SELECT語句:選擇操作、投影操作。
select:從一個或多個表中檢索一個或多個數據列。包含信息:想選擇什麼表,從什麼地方選擇。必須要有From子句。(最常用)
        當從多張表裏查詢的時候,會產生笛卡爾積;可用條件過濾它。
        當兩個表有相同字段時必須加前綴,列名前需加表名和“.”,如“s_emp.id”。
    1、用法:SELECT  columns,prod2,prod3<列>  FROM Table1,table2<表名>  分號結束
       如: select id from s_emp;
           select last_name,name from s_emp,s_dept where s_emp.dept_id=s_dept.id;--列表每人所在部門
           SELECT *  FROM Products;    --檢索所有列。
           數據太多時,最好別使用上句,會使DBMS降低檢索和應用程序的性能。(*通配符)
    2、對數據類型的列可進行運算(如加減乘除)。
    3、對列起別名:有直接起別名,加AS起別名,用雙引號起別名等三種方法
       (單引號,引起字符串;雙引號,引起別名。起別名有符號,或者區分大小寫時,必須用雙引號)
        多表查詢時,可給表起別名。(給列起別名,列<空格>列別名;給表起別名,表<空格>表別名;)。
        如:Select first_name EMPLOYEES, 12*(salary+100) AS MONEY, manager_id "ID1" From s_emp E;
    4、字段的拼接,可用雙豎線(雙豎線只能用於select語句裏)。不同的DBMS可能使用不同的操作符;拼接的字段同樣可以起別名。
        如:Select  first_name ||' '|| last_name || ', '|| title "Employees" From s_emp;


排他鎖:Select id,salary  From s_emp where id=1  For Update;
   可以阻止他人併發的修改,直到你解鎖。
   如果已有鎖則自動退出:Select id,salary From s_emp where id=1 For Update NoWait;
   FOR UPDATE :可以再加 OF 精確到某格。如:   ... For Update  OF salary ...  
   注意要解鎖。


五、ORDER BY 子句,排序
Order by:按某排序列表(默認升序 asc,由低到高;可加 desc,改成降序由高到低)
    檢索返回數據的順序沒有特殊意義,爲了明確地排序用 SELECT 語句檢索出的數據,可使用 ORDER BY 子句。
    ORDER BY 子句取一個或多個列的名字。
    對空值,按無窮大處理(升序中,空值排最後;降序中排最前)。
    1、用法:Select prod_id,prod_price,prod_name From Products  Order By  prod_price,prod_name; 
      (從左到右執行排序,先排price)
       ORDER BY子句中使用的列將是爲顯示所選擇的列,但是實際上並不一定要這樣,用非檢索的列排序數據是完全合法的。
       爲了按多個列排序,列名之間用逗號分開。
    2、支持按相對列位置進行排序。
       輸入 SELECT prod_id,prod_price,prod_name
       FROM  Products
       ORDER BY 2,3    --(2指price,3指name)
    3、升序、降序。默認是升序(asc,從小到大排序),想降序時用desc。
       如:SELECT prod_id,prod_price,prod_name FROM  Products ORDER BY prod_price DESC;
      注意:DESC 關鍵字只應用到直接位於其前面的列名。如果想在多個列上進行排序,必須對每個列指定DESC關鍵字。
         升序是默認的,可不寫,但降序必須寫。




六、WHERE子句,選擇、過濾
    其後只能跟邏輯語句,返回值只有ture或false
    如: select last_name,salary from s_emp where salary=1000;--找出工資1000的人


WHERE子句操作符:
    1、邏輯比較運算符
        =        等於
        !=       不等於,還有(<>  ^=   這兩個同樣表示不等於)
        >         大於
        >=        大於等於
        <         小於
        <=        小於等於


    2、SQL 比較運算符
    between…and…    :在兩者之間。(BETWEEN 小值 AND 大值)
        如:select last_name,salary from s_emp where salary between 1000 and 1500;
          --工資1000到1500的人,包括1000和1500。
    in(列表):在列表裏面的。
        如:select last_name,dept_id from s_emp where dept_id in(41,42);第41、42部門的人
    like    : 包含某內容的。模糊查詢
        可以利用通配符創建比較特定數據的搜索模式,通配符只能用於文本,非文本數據類型不能使用通配符。
        通配符在搜索模式中任意位置使用,並且可以使用多個通配符。
        通配符%表示任何字符出現任意次數;還能代表搜索模式中給定位置的0個或多個字符。下劃線匹配單個任意字符。
        如:select table_name from user_tables where table_name like 'S\_%' escape'\';
        '  找出“S_“開頭的,由於下劃線有任意字符的含義,故需另外定義轉移符。
           但習慣用“\”,爲方便其他程序員閱讀和檢測,一般不改用其他的。
        like 'M%':M開頭的        like '_a%':第二個字符是a的    like '%a%'所有含a的
            (“_”表示一個任意字符;“%”表示任意多個任意字符。)
        單引號裏面的內容,大小寫敏感。單引號用來限定字符串,
        如果將值與串類型的列進行比較,則需要限定引號;用來與數值列進行比較時,不用引號。
    is null:是空。(NULL表示不包含值。與空格、0是不同的。)
        如:SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL;




七、高級檢索(邏輯運算符):
    通常我們需要根據多個條件檢索數據。可以使用AND或OR、NOT等連接相關的條件
    計算次序可以通過圓括號()來明確地分組。不要過分依賴默認計算次序,使用圓括號()沒有壞處,它能消除二義性。
    
    and:條件與
       如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 AND vend_id=‘DELL’
    or:條件或    (注: and 的優先級比 or 更高,改變優先級可用括號)
       如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 OR vend_id=‘DELL’
    not:條件非。否定它之後所跟的任何條件
        否定的SQL 比較運算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL:
         (注意,按英語習慣用 is not,而不是 not is)
        NOT 與 IN 在一起使用時,NOT 是找出與條件列表不匹配的行。
        IN 列表裏有 NULL 時不處理,不影響結果;用 NOT IN 時,有 NULL 則出錯,必須排除空值再運算。
    in :選擇列表的條件
        使用IN操作符的優點: 在長的選項清單時,語法直觀; 計算的次序容易管理;
        比 OR 操作符清單執行更快;最大優點是可以包含其他 SELECT 語句,使用能夠動態地建立 WHERE 子句。
     如 SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id IN(‘DELL’,’RBER’,’TTSR’);




八、單行函數:
    函數一般在數據上執行,它給數據的轉換和處理提供了方便。不同的DBMS提供的函數不同。
    函數可能會帶來系統的不可移植性(可移植性:所編寫的代碼可以在多個系統上運行)。
    加入註釋是一個使用函數的好習慣。
    大多數SQL實現支持以下類型的函數: 文本處理, 算術運算, 日期和時間, 數值處理。


Null:空值
    空值當成無窮大處理,所有空值參與的運算皆爲空。
    空值與空值並不相等,因爲空值不能直接運算。
    如:prod_price=""     這種寫法是錯的(不要受到corejava的影響)
    prod_price=NULL      這種寫法是錯的(不要受到corejava的影響)
    prod_price IS NULL   這種寫法纔是對的
NVL:處理空值,把空值轉化爲指定值。可轉化爲日期、字符、數值等三種(注意:轉化時,兩參數必須要同類型)
    如:NVL(date, '01-JAN-95')    NVL(title,'NO Title Yet')        NVL(salary,0)
    錯誤寫法:
     Select last_name,title,salary*commission_pct/100 COMM From s_emp;--沒提成的人沒法顯示工資
    正確寫法:
     Select last_name,title,salary*NVL(commission_pct,0)/100 COMM From s_emp;--把提成是空值的轉化爲0


DISTINCT:過濾重複
    把重複的行過濾掉;多個字段組合時,只排除組合重複的。
    DISTINCT必須使用列名,不能使用計算或者表達式。
    所有的聚合函數都可以使用。如果指定列名,則DISTINCT只能用於COUNT(列名),DISTINCT不能用於COUNT(*)。
    如:Select  Distinct  name  From  s_dept; Select Distinct dept_id,title  From s_emp;


文本處理:
TRIM()/LTRIM()/RTIRM():去空格。只能去掉頭和尾的空格,中間的不理。
     trim('   heo Are  fdou   ')  -->  heo Are  fdou
     輸入:select trim('   heo Are  fdou   ')  from dual; -->:heo Are  fdou
LOWER:轉小寫
    lower('SQL Course') --> sql course
UPPER:轉大寫
    upper('    SQL Course') --->SQL COURSE
INITCAP:首字母轉大寫,其餘轉小寫
    initcap(SQL Course')  '--> Sql Course  


CONCAT:合成。雙豎線只能在select語句裏面用,這個可用於任何語句。
    Concat('Good','String') --> GoodString
SUBSTR:截取。
    Substr('String', 1 ,3)  --> Str
        第一個數字“1”,表示從第幾個開始截取;若要從倒數第幾個開始,用負數,如“-2”表示倒數第2個。
        上式中第2個數字“3”表示截取多少個。
LENGTH:統計長度。
    Length('String') --> 6
NVL:轉換空值


日期和時間處理:
    Oracle日期格式:DD-MMM-YYYY        (D代表日期date,M代表月month,Y代表年year)
    如:SELECT prod_name              (DAY表示完整的星期幾,DY顯示星期的前三個字母)
        FROM Products
        WHERE prod_time BETWEEN
            to_date(’01-JAN-2008’)
        AND to_date(’31-DEC-2008’);
    日期可以進行加減,默認單位是1天。日期與日期可以相減,得出天數;日期與日期但不能相加。
sysdate   ->  系統的當天
Months_Between('01-Sep-95','11-Jan-94')  --> 19.774194    相差多少個月,Between裏面也可以填函數。
Add_months('11-Jan-94',6)                -->  11-Jul-94   增加多少個月
Next_day('01-Sep-95','Friday')   --> '08-Sep-95'    下一個星期五。其中的'Friday'可用6替代,因爲星期日=1
Last_day('01-Sep-95')            -->  '30-Sep-95'   這個月的最後一天




數值處理:可以運用於代數,三角,幾何
ROUND:四捨五入
    Round(45.925,2)  -> 45.93        Round(45.925,0)  -> 46        Round(45.925,-1)  -> 50
    逗號前一個數是要處理的數據源,後一個參數表示保留多少位小數。
    後一參數是負數時,表示捨去小數點前的幾位,例3是捨去個位及其後的。不寫後一參數時,默認不保留小數。
TRUNC:捨去末位。直接捨去,不會進位。
    Trung(45.925,2)  -> 45.92       Trung(45.925,2)  -> 45.92       Trung(45.925,2)  -> 45.92
日期的舍取:




常用的數值處理函數有:
    ABS()    絕對值        ABS(-5741.5854) --> 5741.5854
    PI()     圓周率        注意:oracle中不支持 PI()函數;MYSql 支持PI()函數。
    SIN()    正統值             Oracle還支持COS()、ASIN()、ACOS()函數
    SQRT()   平方根 




  轉化:
TO_CHAR(number,'fmt'):把數值轉換成字符串
    顯示數字的命令
    9:正常顯示數字;
    0:顯示包括0的數值形式,空位強制補0;
    $:以美元符號顯示貨幣;
    L:按當前環境顯示相關的貨幣符號;
    . 和,:在固定位置出現“.”點 和“,”逗號;不夠位時,四捨五入。
   例題:SQL> select 'Order'||To_char(id)||
  2  'was filled for a total of'
  3  ||To_char(total,'fm$9,999,999')
  4  from s_ord
  5  where ship_date ='21-SEP-92';


TO_NUMBER(char):把字符轉換成數字




九、鏈接
內鏈接:嚴格匹配兩表的記錄。
外鏈接分左鏈接和右鏈接:
    會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,
    數據庫會模擬出記錄去和那些不匹配的記錄匹配。
左鏈接  加號在右面 
    如:有 TABLE1   TABLE2
        1的一條記錄在2裏面沒有匹配上,那麼1裏面的記錄保留
        2的一條記錄在1裏面沒有匹配上 ,那麼2丟棄
右鏈接正好相反
    --例題:哪些人是領導。
    select distinct b.id,b.last_name manager
    from s_emp a,s_emp b
    where a.manager_id=b.id(+);
左右順序有區別,這是另外新建一個表,要顯示的是第二個表格的內容。
+放在沒有匹配行的表一側,令表格能完整顯示出來。


標準寫法:內連接用INNER,左連接用LEFT,右連接用RIGHT。
    select distinct b.id,b.last_name manager
    from s_emp a LEFT join s_emp b
    ON a.manager_id=b.id;




十、組函數:
    分組允許將數據分爲多個邏輯組,以便能對每個組進行聚集計算。
Group:分組
Group by:分組。(默認按升序對所分的組排序;想要降序要用 order by)可以包括任意數目的列。
    如果嵌入了分組,數據將在最後規定的分組上進行彙總。
    GROUP BY 子句中列出的每個列都必須是檢索列或有效的表達式,但不能是聚集函數。
    *如果在SELECT 中使用表達式,則必須在GROUP BY子句中指定相同的表達式,不能使用別名。
    除聚合計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
    如果分組列中具有NULL值,則NULL將作爲一個分組返回。如果列中有多行NULL,它們將分爲一組。


Having:過濾。分組之後,不能再用where,要用having 選擇過濾。Having不能單獨存在,必須跟在group by後面。
    WHERE在數據分組前進行過濾,HAVING在數據分組後過濾。
    可以在SQL中同時使用 WHERE和HAVING,先執行WHERE,再執行HAVING。




  聚合函數:
AVG:平均值    (忽略值爲NULL的行,但不能用 AVG(*))
COUNT:計數    (Count(列)不計算空值;但 COUNT(*)表示統計表中所有行數,包含空值)
MAX:最大值    (忽略列值爲 NULL 的行。但有些DBMS還允許返回文本列中的最大值,
               在作用於文本數據時,如果數據按照相應的列排序,則 MAX()返回最後一行。)
MIN:最小值    (忽略值爲 NULL 的行。不能用 MIN(*)。一般是找出數值或者日期值的最小值。
               但有些DBMS還允許返回文本列中的最小值,這時返回文本最前一行)
SUM:求和      (忽略值爲 NULL 的值。SUM 不能作用於字符串類型,而 MAX(),MIN()函數能。也不能 SUM(*))




子查詢:查詢語句的嵌套
    可以用於任意select 語句裏面,但子查詢不能出現 order by。
    子查詢總是從內向外處理。作爲子查詢的SELECT 語句只能查詢單個列,企圖檢索多個列,將會錯誤。
    如:找出工資最低的人select min(last_name),min(salary) from s_emp;
       或者用子查詢select last_name,salary from s_emp where salary=(select min(salary) from s_emp);


E-R圖:屬性: E(Entity) -R(Relationship)
        * (Mandatory marked 強制的)   強制的非空屬性
        o (Optional marked 可選的)    可選屬性(可以有值也可以沒有)
        #* (Primary marked )         表示此屬性唯一且非空  


約束:針對表中的字段進行定義的。
PK:primary key (主鍵約束,PK=UK+NN)保證實體的完整性,保證記錄的唯一
    主鍵約束,唯一且非空,並且每一個表中只能有一個主鍵,有兩個字段聯合作爲主鍵,
    只有兩個字段放在一起唯一標識記錄,叫做聯合主鍵(Composite Primary Key)。
FK:foreign key (外建約束)保證引用的完整性,外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值的約束,不能夠取其他值,
    只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表);
    child table(子表),要想創建子表,就要先創建父表,後創建子表,記錄的插入也是如此,先父表後子表,
    刪除記錄,要先刪除子表記錄,後刪除父表記錄,
    要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,後刪除父表。
U:unique key(唯一鍵 UK),值爲唯一,不能重複。
    在有唯一性約束的列,可以有多個空值,因爲空值不相等。
NN:NOT NULL,不能爲空。
    index(索引)是數據庫特有的一類對象,實際應用中一定要考慮索引,view(示圖)


    數量關係:  一對一關係
              多對一關係
              一對多關係
              多對多關係


範式:
好處:降低數據冗餘;減少完整性問題;標識實體,關係和表
    第一範式(First normal form:1Nf),每一個屬性說一件事情。所有的屬性都必須是單值,也就是屬性只表示單一的意義。
                   (記錄可以重複,會有大量冗餘,沒有任何限制)
    第二範式(2N範式),最少有一個屬性要求唯一且非空PK,其他跟他有關聯(記錄不可重複,但是數據可能會出現冗餘)。
    第三範式(3N範式),非主屬性只能依賴於主屬性,不能依賴於其他非主屬性。(解決數據冗餘問題,不能存在推理能得出的數據)
                   一般情況會做到第三範式。




創建表: Create Table 表名
        (字段名1 類型(數據長度)(default ...) 約束條件,
        字段名2  類型(數據長度) 約束條件 );
建表的名稱:
    必須字母開頭;最多30字符;只能使用“A~Z、a~z、0~9、_、$、#”;
    同一目錄下不能有同名的表;表名不能跟關鍵字、特殊含意字符同樣。
    如:create table number_1 (n1 number(2,4), n2 number(3,-1), n3 number);
       create table t_sd0808(id number(12) primary key,name varchar(30) not null);
    MySQL的: create table student (oid int primary key, ACTNO varchar(20) not null unique,
       BALANCE double); --MySQL的number類型分小類了,Oracle只有number,且MySQL的數值型不用定大小
    Oracle的: create table t_ad (oid number(15) primary key, 
       ACTNO varchar(20) not null unique,BALANCE number(20));


INSERT:插入(或添加)行到數據庫表中的關鍵字。
    插入方式有以下幾種:插入完整的行;插入行的一部分;插入某些查詢的結果。
    對於INSERT操作,可能需要客戶機/服務器的DBMS中的特定的安全權限。
     插入行(方式一)   INSERT INTO products VALUES(2008,’TV’,222.22,’US’);
    依賴於表中定義的順序,不提倡使用。有空值時需要自己補上。
     插入行(方式二)   INSERT INTO products(id,name,price,vend_name) VALUES(2008,’TV’,222.22,’US’);
    依賴於邏輯順序,會自動補上空值,提倡使用。


    插入檢索出的數據:可以插入多條行到數據庫表中
        INSERT INTO products(*,*,*,*)
        SELECT *,*,*,*
        FROM products_copy;
    如果這個表爲空,則沒有行被插入,不會產生錯誤,因爲操作是合法的。
    可以使用WHERE加以行過濾。


複製表:   將一個表的內容複製到一個全新的表(在運行中創建,開始可以不存在)
    CREATE TABLE 新表名  AS
    SELECT *
    FROM 表名;


    INSERT INTO 與 CREATE TABLE AS SELECT 不同,前者是導入數據,而後者是導入表。
    任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY。
    可利用聯接從多個表插入數據。不管從多少個表中檢索數據,數據都只能插入到單個表中。


更新數據 UPDATE 語句
            需要提供以下信息:要更新的表;列名和新值;確定要更新的哪些行的過濾條件。
    UPDATE 表名
    SET    vend_name = ‘HP’,
           prod_name = ‘NEWCOMPUTER’
    WHERE  vend_name = ‘IBM’;
    --UPDATE 語句中可以使用子查詢,使得能用SELECT語句檢索出的數據更新列數據。也可以將一個列值更新爲 NULL。


刪除數據 DELETE 語句
    DELETE
    FROM products
    WHERE prod_name = ‘COMPUTER’;
    全行刪除,不要省略WHERE,注意安全。
    DELETE不需要列名或通配符。刪除整行而不是刪除列。DELETE是刪除表的內容而不是刪除表。
    如果想從表中刪除所有內容,可以使用TRUNCATE TABLE語句(清空表格),它更快。


數字字典表:
Sequence:排列。存儲物理地址


Index:索引。依附於表,爲提高檢索速度。


View:視圖。看到表的一部分數據。
    限制數據訪問。簡化查詢。數據獨立性。本質上是一個sql查詢語句。
    Create[or Relace][Force|noForce]  View  視圖名
         [(alias[,alias]…)]    別名列表
        As subquery
    [With Check Option [Constraint ……]]
    [With Read Only]
    注意:有些DBMS不允許分組或排序視圖,不能有 Order by 語句。可以有 Select 語句。
    刪除視圖:    DROP VIEW 視圖名


Rownum:緯列。內存裏排序的前N個。
    在where語句中,可以用=1,和<=N 或 <N;但不能用=N 或 >N。
    因爲這是內存讀取,沒有1就丟棄再新建1。只能從1開始。需要從中間開始時,需二重子rownum語句需取別名。
經典應用: Top-n Analysis  (求前N名或最後N名)
          Select [查詢列表], Rownum
          From (Select  [查詢列表(要對應)]
                   From 表
                   Order by  Top-N_字段)
          Where Rownum <= N


分頁顯示:
    --取工資第5~10名的員工(二重子rownum語句,取別名)
    select  rn,id,last_name,salary 
    From ( select  id,last_name,salary,Rownum rn
           From (Select id,last_name,salary 
                     from s_emp
                     order by salary desc)
    where rownum <= 10)
    where rn between 5 and 10;




Union:合併表
    Select …   Union   Select…    把兩個Select語句的表合併。
    要求兩表的字段數目和類型按順序對應。合併後的表,自動過濾重複的行。
Intersect:交。    同上例,把兩個Select表相交。
Minus:減。        把相交的內容減去。
not exists        除運算。




添加字段(列):
    Alter Table 表名
    Add (column dataype [Default expr][Not Null]
         [,column datatype]…);
    添加有非空限制的字段時,要加Default語句
    字段名字不可以直接改名,需要添加新字段,再複製舊字段後刪除舊字段。
      添加約束:    Alter Table 表名
                  Add [CONSTRAINT constraint] type (column);
    添加非空約束時,要用Modify語句。
    查看約束名時,可以違反約束再看出錯提示;或者查看約束字典desc user_constraints


減少字段:
    Alter Table 表名
    Drop (column [,column]…);
      刪除約束:    Alter Table 表名
                  Drop CONSTRAINT  column;
      或:   Alter Table 表名
            Drop  Primary Key  Cascade;


暫時關閉約束,並非刪除:
    Alter Table 表名
    Disable CONSTRAINT  column  Cascade;
打開剛纔關閉的約束:
    Alter Table 表名
    Enable  CONSTRAINTcolumn;


修改字段:
    Alter Table 表名
    Modify  (column dataype [Default expr][Not Null]
             [,column datatype]…);
修改字段的類型、大小、約束、非空限制、空值轉換。


刪除表:
會刪除表的所有數據,所有索引也會刪除,約束條件也刪除,不可以roll back恢復。
    Drop Table 表名 [Cascade Constraints];
    加 [Cascade Constraints] 把子表的約束條件也刪除;但只加 [Cascade]會把子表也刪除。


改表名:
Rename 原表名 To 新表名;


清空表格:
    TRUNCATE TABLE 表名;
    相比Delete,Truncate Table清空很快,但不可恢復。清空後釋放內存。
    Delete 刪除後可以roll back。清空後不釋放內存。



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章