1. 程式人生 > >Oracle-Oracle基礎(一)

Oracle-Oracle基礎(一)

1.建表:

1)常規建表:

create table temp_1(
  Tempcode varchar2(30) not null,
  TempName varchar2(15)
);
建立欄位為TempCode,TempName的temp_1表,新建立的表中無資料,如下圖所示:

2)根據查詢結果建表:

create table temp_1 as select tempcode,tempname from temp_2;

建立欄位為TempCode,TempName的temp_1表,新建立的表中存在temp_2的儲存結果,如下圖所示:


3)建立事務級臨時表:

create global temporary table temp_1(
  Tempcode varchar2(30) not null,
  TempName varchar2(15)
) 
on commit delete rows

建立欄位為TempCode,TempName的temp_1表,新建立的表為事務級臨時表,當該表事務進行提交commit/回滾rollback時,清除表內所有資料(truncate)

4)建立會話級臨時表:

create global temporary table temp_1(
  Tempcode varchar2(30) not null,
  TempName varchar2(15)
) 
on commit preserve rows

建立欄位為TempCode,TempName的temp_1表,新建立的表為會話級臨時表,當會話結束時,清除表內所有資料(truncate)

2.新增
1)單行插入
insert into temp_1(tempcode) values('1001');  --指定欄位插入
insert into temp_1 values('1001','張三同學'); --全欄位插入
執行insert操作,如下圖所示:        2)根據查詢結果插入
insert into temp_1(tempcode) select tempcode from temp_2; --指定欄位插入
insert into temp_1 select tempcode,tempname from temp_2; --全欄位插入
指定欄位插入,如下圖所示:       

全欄位插入,如下圖所示:

      

3.刪除

1)delete:刪除表資料,不刪除表結構,事務提交後刪除,DML語句,不釋放表空間,啟用觸發器

2)truncate:刪除表資料,不刪除表結構,執行後自動提交,DDL語句,保留原始表空間,不啟用觸發器

   (外來鍵約束引用的表和參與檢視索引的表不能使用truncate)

3)drop:刪除表資料、表結構等,DDL語句,釋放表空間,刪除觸發器

效能比較:drop>truncate>delete

4.更新

1)單列更新

update temp_1 set tempname='張三(new)' where tempcode='1001'; --單列更新

2)多列更新

update temp_1 set tempname='李四(new)',tempcode='1002new' where tempcode='1002'; --多列更新

3)根據查詢結果更新

update temp_1 set(tempname,tempcode) = (select tempname,tempcode from temp_2 where tempcode='1003new') where tempcode='1003'; --根據查詢結果更新

執行更新操作後,結果如下圖所示:

      

4)Merge into

merge into temp_1 a
using (select tempcode code,tempname name from temp_2 where tempcode='1001') b
on (a.tempcode = b.code)
when matched then
  update set a.tempname = b.name
when not matched then
  insert (tempcode, tempname) values (b.code, b.name)

條件滿足,tempcode='1001'時,執行update操作;

把tempcode='1001'換成tempcode='1004',條件不滿足,執行insert操作;

結果如下圖所示:

      

5.完整的查詢SQL語句格式:

      select <查詢結果集>

      from <被查詢表集>

      where <查詢條件集>

      group by <分組條件集> 

      having <分組結果過濾> 

      order by <查詢結果過濾>

6.連線

1)交叉連線:笛卡爾集 全連線

select * from temp_1 cross join temp_3; 
select * from temp_1,temp_3;

2)內連線:對於不匹配的都會進行捨棄

select * from temp_1 inner join temp_3 on temp_1.tempcode=temp_3.tempcode3;
select * from temp_1,temp_3 where temp_1.tempcode=temp_3.tempcode3;


3)全外連線:左右無都補null

select * from temp_1 full join temp_3 on temp_1.tempcode=temp_3.tempcode3; 

4)左外連線:左為基表,右表無則補null

select * from temp_1 left join temp_3 on temp_1.tempcode=temp_3.tempcode3; 

5)右外連線:右為基表,左表無則補null

select * from temp_1 right join temp_3 on temp_1.tempcode=temp_3.tempcode3;


7.集合

1)union all:求並集,記錄可以重複,不自動排序

select * from temp_1 where tempcode='1001'
union all
select * from temp_2 where tempcode='1001'

2)union:求並集,排除重複資料,自動排序

select * from temp_1 where tempcode='1001'
union 
select * from temp_2 where tempcode='1001'


3)minus:求差集,自動排序

select * from temp_1 where tempcode in('1001','1002') 
minus 
select * from temp_2 where tempcode='1001'

4)intersect:求交集,自動排序

select * from temp_1 where tempcode in('1001','1002') 
intersect 
select * from temp_2 where tempcode='1001'



8.排序

1)order by

select * from temp_1 order by tempcode asc;  --正序 asc可省略
select * from temp_1 order by tempcode desc; --倒序 desc不可省略

    倒序結果如下圖所示:

            
2)排名函式

      rank()/dense_rank()/row_number() over(partition by 分組條件 order by 排序條件)

  [1] rank() over: 進行排序,會跳過空出的名次,如(1,2,2,4,5)

select 
       tempcode3,
       tempname3,
       tempscore,
       tempsubject,
       rank() over(partition by tempsubject order by tempscore desc) as rank
  from temp_4

       按tempsubject學科分組,按tempscore成績倒序排列,結果如下圖所示:

            

  [2] dense_rank() over:進行排序,不會跳過空出的名次,如(1,2,2,3,4)

 select 
       tempcode3,
       tempname3,
       tempscore,
       tempsubject,
       dense_rank() over(partition by tempsubject order by tempscore desc) as rank
  from temp_4

       按tempsubject學科分組,按tempscore成績倒序排列,結果如下圖所示:
           

  [3] row_number() over:進行排序,不會考慮成績是否相同,即使相同也會繼續排序,如(1,2,3,4,5)

 select 
       tempcode3,
       tempname3,
       tempscore,
       tempsubject,
       row_number() over(partition by tempsubject order by tempscore desc) as rank
  from temp_4

        按tempsubject學科分組,按tempscore成績倒序排列,結果如下圖所示:
           

9.常用函式

1)字元函式

select 
         substr('abcdef', 1, 3) 擷取,
         length('abcdef') 長度,
         instr('abcdabebc', 'a') 第一次出現的位置,
         ltrim(' abc') 去除前空格,
         rtrim('abc ') 去除後空格,
         trim(' abc ') 去除前後空格
    from dual;

    查詢結果如下圖所示:

     

select 
         trim(leading 'd' from 'dabc') 去除前導,
         trim(trailing 'd' from 'abcd') 去除字尾,
         trim('d' from 'dabcd') 去除前後綴,
         initcap('abc') 首字母大寫,
         upper('abc') 大寫,
         lower('ABC') 小寫,
         lpad('1', '3', '0') 向左填充0直到3位為止,
         rpad('1', '3', '0') 向右填充0直到3位為止
    from dual;

   查詢結果如下圖所示:
    

2)數字函式

select 
         ceil(45.67) 向上取整,
         floor(45.67) 向下取整,
         round(45.678, 2) 四捨五入,
         trunc(45.678, 2) 截斷,
         power(2, 10) 求冪,
         mod(10, 3) 求餘
    from dual;

    查詢結果如下圖所示:

   

3)日期函式

select 
       floor(sysdate - to_date('20171201', 'yyyy-MM-dd')) 相差天數,
       months_between(sysdate, to_date('20171004', 'yyyy-MM-dd')) 相差月數,
       add_months(sysdate, 2) 日期加2個月,
       last_day(sysdate) 月末最後一天
  from dual; 

    查詢結果如下圖所示:
    

select 
       round(sysdate) 舍入到最近一天,
       round(sysdate, 'year') 舍入到最近年的1月1日,
       round(sysdate, 'month') 舍入到最近月的1日,
       trunc(sysdate) 截斷到最近當天,
       trunc(sysdate, 'year') 截斷到最近年的1月1日,
       trunc(sysdate, 'month') 截斷到最近月的1日
  from dual;

     查詢結果如下圖所示:
   

4)分組函式

select 
       min(tempcode) 最小值,
       max(tempcode) 最大值,
       sum(tempcode) 求和,
       count(tempcode) 數量,
       avg(tempcode) 平均值
  from temp_1;

    查詢結果如下圖所示:

      

      基礎資料如圖所示:

      

5)轉換函式

[1] 日期格式轉字串

 select 
         to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') 年月日時分秒,
         to_char(sysdate, 'yyyymm') 年月,
         to_char(sysdate, 'yyyy') 年,
         to_char(sysdate, 'mm') 月,
         to_char(sysdate, 'dd') 日,
         to_char(sysdate, 'hh24') 時,
         to_char(sysdate, 'mi') 分,
         to_char(sysdate, 'ss') 秒,
         to_char(sysdate, 'day') 星期
    from dual;

    查詢結果如下圖所示:
    

[2] 字串日期格式

    select 
           to_date('2017-12-04 17:19:54', 'yyyy-mm-dd hh24:mi:ss') 年月日時分秒,
           to_date('2017-12-04', 'yyyy-mm-dd') 年月日,
           to_date('201712', 'yyyymm') 年月
      from dual;

    查詢結果如下圖所示:

     

[3] 字串轉數字格式

select to_number('213.456') from dual;

    查詢結果如下圖所示:

        

6)其他函式

 select 
             decode('a', 'a', '1', 'b', '2') decode判斷,
             case when 1 = 1 then '1' else '2' end case判斷,
             greatest('1', '2', '3') 最大值,
             least('1', '2', '3') 最小值
        from dual;

    查詢結果如下圖所示: