1. 程式人生 > >專案中常用的SQL語句

專案中常用的SQL語句

SQL專案常用整理

1、建立表
   語法:CREATE tabal 表名(欄位+約束,欄位+約束);
   舉例:
   

create table test01(

         id int not null,

         name varchar(8) not null,

         gender varchar2(2) not null,

         age int not null,

         address varchar2(20) default ‘地址不詳’ not null,

         regdata date

        );


2、刪除表(儘量不使用)
   truncate table 表名       --刪除表中的所有資料,速度比delete快很多,截斷表

   delete from table 條件

   drop table 表名           --刪除表
   
   Oracle truncate、 delete、 drop區別
   相同點:

   (1).truncate和不帶where子句的delete、以及drop都會刪除表內的資料。

   (2).drop、truncate都是DDL語句(資料定義語言),執行後會自動提交。

   不同點:

   (1). truncate 和 delete 只刪除資料不刪除表的結構(定義)
   drop 語句將刪除表的結構被依賴的約束(constrain)、觸發器(trigger)、索引(index);依賴於該表的儲存過程/函式將保留,但是變為 invalid 狀態。

   (2). delete 語句是資料庫操作語言(dml),這個操作會放到 rollback segement 中,事務提交之後才生效;如果有相應的 trigger,執行的時候將被觸發。
   truncate、drop 是資料庫定義語言(ddl),操作立即生效,原資料不放到 rollback segment 中,不能回滾,操作不觸發 trigger。

   (3).delete 語句不影響表所佔用的 extent,高水線(high watermark)保持原位置不動
   drop 語句將表所佔用的空間全部釋放。
   truncate 語句預設情況下見空間釋放到 minextents個 extent,除非使用reuse storage;truncate 會將高水線復位(回到最開始)。

  (4).速度,一般來說: drop> truncate > delete

  (5).安全性:小心使用 drop 和 truncate,尤其沒有備份的時候.否則哭都來不及
   使用上,想刪除部分資料行用 delete,注意帶上where子句. 回滾段要足夠大.
   想刪除表,當然用 drop
   想保留表而將所有資料刪除,如果和事務無關,用truncate即可。如果和事務有關,或者想觸發trigger,還是用delete。
   如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新匯入/插入資料。


  (6).delete是DML語句,不會自動提交。drop/truncate都是DDL語句,執行後會自動提交。

  (7)、TRUNCATE   TABLE   在功能上與不帶   WHERE   子句的   DELETE   語句相同:二者均刪除表中的全部行。
  但   TRUNCATE   TABLE   比   DELETE   速度快,且使用的系統和事務日誌資源少。
  DELETE   語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。
  TRUNCATE   TABLE   通過釋放儲存表資料所用的資料頁來刪除資料,並且只在事務日誌中記錄頁的釋放。 

  (8)、TRUNCATE   TABLE   刪除表中的所有行,但表結構及其列、約束、索引等保持不變。
  新行標識所用的計數值重置為該列的種子。
  如果想保留標識計數值,請改用   DELETE。如果要刪除表定義及其資料,請使用   DROP   TABLE   語句。  
    
  (9)、對於由   FOREIGN   KEY   約束引用的表,不能使用   TRUNCATE   TABLE,而應使用不帶   WHERE   子句的   DELETE   語句。
  由於   TRUNCATE   TABLE   不記錄在日誌中,所以它不能啟用觸發器。    
 

  (10)、TRUNCATE   TABLE   不能用於參與了索引檢視的表。  
   
3、新增主鍵
   建立主外來鍵(可以在建立表的同時新增主外來鍵約束,也可以建立完成後再新增約束 )
   方法一:表建立的同時,新增主鍵約束
   語法:
   create table 表名 
         ( 
          列名1 資料型別及長度 constraint 主鍵名稱(一般主鍵名稱為”PK_”開頭) primary key, 
          列名2 資料型別及長度 not null,——-not null 約束該列不為空,不寫表示可以為空 
          列名3 資料型別及長度
          )tablespace 表空間名稱;——-指定將該表放在某個表空間裡,可以省略不指定
    舉例:
 

 create table T_DEPOSIT 
         (savingid VARCHAR2(20) constraint pk_savingid primary key, 
          savingname VARCHAR2(20) not null, 
          descrip VARCHAR2(50) 
          )tablespace ATM_tablespace;

   ————注意————- 
   CREATE TABLE T_cardInfo –銀行卡資訊表 
         ( 
         cardID varchar2(19) primary key, 
          如果此處這樣定義主鍵,則主鍵名稱系統自己定義設定 
          );
   方法二:表建立後,新增主鍵約束 
    語法: 
   alter table 表名 
    add constraint 主鍵名稱(一般主鍵名稱為”PK_”開頭) primary key(要設為主鍵的列名); 
    舉例: 
   

alter table T_Grade 
    add constraint pk_gradeId primary key (gradeId);


   需要修改結構的,就用到alter語句,方法如下:
 
   ALTER TABLE語句用於修改已經存在的表的設計。
4、刪除主鍵
   (1)有命名
        alter table students drop constraint yy;
   (2)無命名
        可用 SELECT   *   from   user_cons_columns;
        查詢表中主鍵名稱得student表中的主鍵名為SYS_C002715
        alter table student drop constraint SYS_C002715;
5、建立一般(normal)索引
   語法:
   CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…]);
6、建立唯一(unique)索引
   語法解析:
   (1). UNIQUE:指定索引列上的值必須是唯一的。稱為唯一索引。

   (2). index_name:指定索引名。

   (3). tabl_name:指定要為哪個表建立索引。

   (4). column_name:指定要對哪個列建立索引。我們也可以對多列建立索引;這種索引稱為組合索引。
   舉例說明:
   案例:為EMP表的ENAME列建立建立唯一索引,為EMP表的工資列建立普通索引,把JOB列先變為小寫再建立索引。
         

CREATE UNIQUE INDEX UQ_ENAME_IDX ON EMP(ENAME);       --唯一索引
CREATE INDEX IDX_SAL ON EMP(SAL);                     --一般索引
CREATE INDEX IDX_JOB_LOWER ON EMP(LOWER(JOB));        --基於函式的索引


   程式碼解析:

        ① 為SCOTT.EMP表的ENAME列建立唯一索引。

        ② 為SCOTT.EMP表的SAL列建立一般索引。

        ③ 在查詢中可能經常使用job的小寫作為條件的表示式,因此建立索引時,
        可以先對JOB列中的所有值轉換為小寫後建立索引,
        而這時需要使用lower函式,這種索引稱為基於函式的索引。
         
7、刪除索引
   當不需要時可以將索引刪除以釋放出硬碟空間。
   語法:
   DROP INDEX [schema.]indexname
   例如:
   SQL> drop index pk_dept;
   注:當表結構被刪除時,有其相關的所有索引也隨之被刪除。
   
8、表名註釋
   給表加註釋語法:
   comment on table 表名  is  '註釋內容';
   舉例:
   

comment on table OPERATOR_INFO is  '操作員資訊表';


9、欄位註釋
   欄位加註釋語法:
   comment  on  column  表名.欄位名   is  '註釋內容';
   舉例:
   

comment on column OPERATOR_INFO.MAIN_OPER_ID is '歸屬操作員';


   
10、插入資料
    方法1
        我估計有點 SQL 基礎的人都會寫 INSERT 語句。下面是 SQL 標準寫法。
        INSERT INTO employees (employee_id, name) VALUES (1, 'Zhangsan');
        INSERT INTO employees VALUES (1, 'Shangbo');
        語法:
        insert into 表名(欄位名,欄位名...) values (值1,值2);

    方法2
        其實, Oracle 還支援下面的寫法,作用和上面的語句完全相同。
        INSERT INTO (SELECT employee_id, name FROM employees) VALUES (2, 'Lisi');

    方法3
        此外,同其他資料庫一樣,Oracle 也支援下面這種寫法。
        INSERT INTO employees
        SELECT 3, 'Wangwu' FROM DUAL;
    方法4
        下面這種寫法可以實現列轉行,如我們有下面的表儲存原始資料,原始資料可能從檔案中來。
       

create table sales_input_table (
               prod_id        number(9,0),
               amt_mon        number(9,6),
               amt_tue        number(9,6),
               amt_wed        number(9,6),
               amt_thu        number(9,6),
               amt_fri        number(9,6)
              );
        insert into sales_input_table values (1, 100.0, 200.0, 300.0, 400.0, 500.0);


       下面我們通過一個 SQL 把上面的資料插入到下面的表中實現列轉行。
       

CREATE TABLE sales (
              prod_id        number(9,0),
              time_id        date,
              amount         number(9,0)
             );
 
       INSERT ALL
       INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE, amt_mon)
       INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 1, amt_tue)
       INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 2, amt_wed)
       INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 3, amt_thu)
       INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 4, amt_fri)
       SELECT prod_id, amt_mon, amt_tue, amt_wed, amt_thu, amt_fri FROM sales_input_table;

     方法5
      下面這種寫法可以幫我們一次性把一個表中的資料倒入到多個表中,否則我們必須寫多條 SQL 實現同樣的功能。
     

INSERT ALL
             WHEN order_total <= 100000 THEN
                  INTO small_orders
             WHEN order_total > 100000 AND order_total <= 200000 THEN
                  INTO medium_orders
             WHEN order_total = 500000 THEN
                  INTO special_orders
             WHEN order_total > 200000 THEN
                  INTO large_orders
             ELSE
                  INTO large_orders
      SELECT order_id, order_total, sales_rep_id, customer_id FROM orders;

      注意,當 order_total 大於 200000 時,orders 會被插入到 large_orders 和 special_orders 中。
      這可能不是你想要的結果,如果你只想讓 orders 插入到 special_orders 表中,你只需要把 ALL 替換成 FIRST。
      


11、更新資料
    語法:
    UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值;
    舉例:
    update es_gc_prod set prod_open_type='1' where prod_code='1012';
    
12、oracle實現 無則insert插入,有則update更新,一條語句直接進行insert/update操作
merge into應用:實現 無則insert插入,有則update更新,一條語句直接進行insert/update操作
merge ino語法:
   MERGE INTO table1 alias1 
         USING (table2|view2|sub_query2) alias2
         ON (join condition) 
     WHEN MATCHED THEN 
         UPDATE table1 
               SET col1 = col_val1, 
                     col2  = col2_val 
     WHEN NOT MATCHED THEN 
               INSERT (column_list) VALUES (column_values); 
舉例:

MERGE INTO hand_student_core_20500 t
USING hand_student_core hsc
ON (t.student_no = hsc.student_no AND t.course_no = hsc.course_no)
WHEN MATCHED THEN
  UPDATE SET t.core = hsc.core
WHEN NOT MATCHED THEN
  INSERT VALUES (hsc.student_no, hsc.course_no, hsc.core);


程式碼分析:
將"hand_student_core_20500"表和"hand_student_core"表,以"student_no"和"course_no"欄位進行比對,如果"hand_student_core_工號"中
存在和"hand_student_core"表相同的"student_no"和"course_no"記錄,則把"hand_student_core_工號"的"core"欄位更新成和"hand_student_core"表一致,
否則,將"hand_student_core"表的記錄插入到"hand_student_core_工號"表。
13、刪除資料
    語法:
    delete from 資料庫.表名 where id = '1'
    講解:如果不用跨庫,可以省略“資料庫”。1代表唯一的一條記錄,是引數。
14、增加欄位
    語法:
    新增欄位的語法:alter table tablename add (column datatype [default value][null/not null],….);
    舉例:
    建立表結構:
      create table test1
          (id varchar2(20) not null);
    增加一個欄位:

      alter table test1
            add (name varchar2(30) default ‘無名氏’ not null);
            
15、修改欄位(修改欄位的名稱,修改欄位的型別)
    語句:
    alter table tableName rename column oldCName to newCName; -- 修改欄位名
    alter table tableName modify (cloumnName 資料型別); -- 修改資料型別
    例如:
    1、建立表:
     

CREATE TABLE Student(
       id varchar2(32) primary key,
       name varchar2(8) not null,
       age number
   );


    2、修改欄位名:
     

alter table Student rename name to StuName;


    3、修改資料型別:
     

alter table Student modify (id varchar2(64));


16、刪除欄位
    語法:
   

 alter table tablename drop (column);