1. 程式人生 > >工作中總結的Oracle_sql積累

工作中總結的Oracle_sql積累

SQL常用語句

1、查註釋

select /*+ parallel(a,4)*/
       *
      FROM 
     all_col_comments a
     where a.OWNER='使用者名稱'


select /*+ parallel(a,4)*/
       *
      FROM 
     all_col_comments a
     where a.TABLE_NAME = '表名';

2、當前使用者下所有表名

select k.TABLE_NAME  from user_tables;

3、sql語句導庫

exp szcrt/[email protected]

owner=szcrt file=d:\crt1.dmp

4、union連線

 select max(id) from (
SELECT id FROM user_test
union
SELECT id FROM ORDER_test
);

5、查詢一張表的所有欄位名

select column_name from user_tab_cols where table_name='表名'

6、日期型別時分秒sql

 to_date('2017-08-02 15:33:09', 'YYYY-MM-DD HH24:MI:SS'),

to_char(sysdate,'Day, HH12:MI:SS'

);

select to_char(sysdate,'Month,Day, HH12:MI:SS') from dual;

結果:

當天日期:

to_date(to_char(sysdate,'YYYY-MM-DD'), 'YYYY-MM-DD')

7、SQL查詢拼接

select 'select * from '|| t.TABLE_NAME ||';'  from User_Tables t

8、欄位長度不等於18

length(欄位名) <> 18

9、欄位值只允許小寫字母

regexp_like(欄位名,'[a-z]+')

10、測試資料庫能否正常使用

select 1 from dual ;

11、系統當前日期

sysdate

12、隨機數

sys_guid()

13、查詢當前表的所有欄位

SELECT
  TABLE_NAME,
  COLUMN_NAME,
  COMMENTS
FROM
  USER_COL_COMMENTS
WHERE
  TABLE_NAME = 'BS_CRT_CRD';

select * from user_tab_cols
where table_name='EAUSER'; --表名要用大寫

14、exists與in的區別(比較重要)

select * from user_test         for update;

select * from order_test        for update;

--in IN時不對NULL進行處理

select * from user_test a where a.id in (select y.user_id from order_test y);

--exists 指定一個子函式,檢測行的存在,遍歷迴圈外表

  然後看外表中的記錄有沒有和內表的資料一樣的。匹配上就將結果放入結果集中

select * from user_test a where exists (select y.user_id from order_test y where a.id = y.user_id);

--in與exists 的區別

--執行順序不一樣 exists先執行主查詢的表select * from user_test,

--然後根據表的每一條記錄,執行以下語句,依次去判斷where後面的條件是否成立

select y.user_id from order_test y where a.id = y.user_id

區別及應用場景

    in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),

注意:not exists都比not in要快。

15、建立索引

--標準建索引:

CREATE INDEX indexId ON order_test (user_id)      TABLESPACE 表空間名;

--建立唯一索引:

CREATE unique INDEX indexId ON order_test (user_id)      TABLESPACE 表空間名;

--建立組合索引:

CREATE INDEX 索引名 ON 表名 (列名1,列名2)      TABLESPACE 表空間名;

--建立反向鍵索引:

CREATE INDEX 索引名 ON 表名 (列名) reverse     TABLESPACE 表空間名;

--刪除索引

DROP INDEX indexId

--重建指定索引

ALTER INDEX indexId  REBUILD;

--索引虛高出現的原因:頻繁update和delete導致索引塊中有碎片

注意:一個基表不能建太多的索引;

      空值不能被索引

      只有唯一索引才真正提高速度,一般的索引只能提高30%左右。

16、查詢欄位不為空

select * from GK_GF_ADSL_USER u where  u.mark is not null;

17、查詢兩個表的一些欄位(非聯查)

select t.fj_old,t.oldflag_kx,t.gfjrfs ,t1.newfj,t.kzlx from GK_GF_IOM_INFO t,gk_info_his t1

18、同義詞 相當於Java後臺的public 公共方法,可以讓其他庫的可以訪問本庫的表

--同義詞

create public synonym YJSJ_ZFXYJ_TJ(改) for admin.YJSJ_ZFXYJ_TJ(改);

--賦許可權給某個使用者 該表必須是同義詞表

grant select, insert, update, delete on YJSJ_ZFXYJ_TJ(改) to zhjk(改);

19、關於sql分組的應用

--按照FGS分組,查詢不同的組的總cost的數量

select sum(cost),fgs from GK_KHPG_WB_COSTGUANGGAIUSER group by fgs;

--按照FGS分組,查詢不同的組有多少條資料

select count(*),fgs from GK_KHPG_WB_COSTGUANGGAIUSER group by fgs;

--按照FGS,FJ分組,查詢不同組有多少條資料

select count(*) ,fgs,fj from GK_KHPG_WB_COSTGUANGGAIUSER group by fgs,fj;

--having是分組(group by)後的篩選條件,分組後的資料組內再篩選

----按照FGS,FJ分組,查詢不同組大於100條的有多少條資料

select count(*) ,fgs,fj from GK_KHPG_WB_COSTGUANGGAIUSER group by fgs,fj having   count(*)>100;

20、sql條件控制

1、select case when t.reserved_field_two = '0' then '男' 

            when t.reserved_field_two = '1' then '女'

            else '其他' end  from PERSON_PUNCH_CARD_OA t

2select case when t.reserved_field_two = '0' then '男' 

            when t.reserved_field_two = '1' then '女'

            else t.sex end as 性別,t.reserved_field_two  from PERSON_PUNCH_CARD_OA t;

21、sql替換函式replace

--把table_value欄位中的'替換成空

select replace(table_value,'''','') from SUC_INSERT_LOG

22、sql樹遍歷查詢

列如:

select * from sys_organ with organ = '120'  connect by prior orgin_id = parent_id

23、Oracle使用者管理

  • 1)、建立新使用者:
  •  create user 使用者名稱 identified by 使用者名稱;
  • 2)、改密碼:
  •     alter user 使用者名稱 identified by 新密碼;
  • 3)、刪除使用者名稱:
  •     drop user 使用者名稱 【cascade】  如果這個使用者已經有表,那麼刪除時要帶引數 cascade
  • 4)、給使用者授予許可權:
  •     grant  resource,connect,dba to 使用者名稱;
  • 5)、收回許可權:
  •     revoke 許可權 from 使用者名稱;
  •     revoke 許可權 on 表名 from 使用者名稱;
  • 6)、切換使用者:
  •     conn 使用者名稱;
  • 7)、顯示當前使用者:
  •     show user;
  • 8)、建立表空間
  •     create tablespace 使用者名稱 datafile '絕對路徑..\使用者名稱.dbf' size 200mb autoextend on next 10mb maxsize unlimited;
  • -------------
  •     datafile :表空間資料檔案存放路徑
  •     size:設定初始大小為200m
  •     autoextend on/off :表示啟動/停止自動擴充套件表空間
  •     next 10m maxsize  :表空間資料檔案大小每次擴充套件10M
  •     unlimited: 無限制擴充套件
  •     使用者名稱----英文
  •     .ldf 日誌檔案
  •     .dbf 主資料檔案
  • --------------
  • 9)、建立臨時表空間
  •    create temporary tablespace 使用者名稱 tempfile '絕對路徑..\使用者名稱.dbf' size 200mb autoextend on next 10mb maxsize unlimited;
  • -------------
  •    臨時表空間主要用途是在資料庫進行排序運算,等操作時提供臨時的運算空間,當運算完成之後系統會自動清理,
  •    當臨時表空間不足時,表現為運算速度異常的慢,如果臨時表空間沒有設定為自動擴充套件會出問題。
  • -------------
  • 10)、查看錶空間是否存在
  •    select * from  dba_data_files    where tablespace_name = '';
  • 11)、建立使用者併為使用者指定表空間
  •   create user 使用者名稱 identified by 密碼 default tablespace 表空間;
  • 12)、檢視使用者是否建立成功
  •    select * from  dba_users where username = '使用者名稱';

23、操作表相關欄位

  • 建立表
  • create  table 表名(欄位名 資料型別)
  • 修改表結構
  • (1)、新增欄位
  • alter table 表名 add(欄位名 資料型別(長度))
  • (2)、修改欄位長度
  • alter table 表名 modify(欄位名 資料型別(更改後的長度))
  • (3)、修改欄位型別(必須無資料)
  • alter table 表名 modify(欄位名 資料型別(更改後的型別))
  • (4)、修改欄位的名字
  • alter table  表名 rename column 舊欄位名 to 新欄位名
  • (5)、刪除表字段
  • alter table 表名 drop column 表字段
  • (6)、修改表的名字
  • rename 舊錶名 to 新表名
  • (7)、刪除表
  • drop table 表名

24、新增資料

insert into 表名 values(......);

  • 插入日期,格式必須為日月年 年是兩位
  • 新增部分欄位

insert into 表名() values();

  • 新增空資料:null
  • 查詢空資料

select * from 表名 where 欄位名 is null;

25、欄位修改操作

  • update 表名 set 欄位名 = 值 where 條件;
  • 刪除資料表中的資料
  • delect from 表名 where 條件
  • 刪除表中所有記錄
  • truncate table 表名;
  • 刪表
  • drop table 表名;

---------------------------------

  • 主鍵(不允許重複) 外來鍵   ------資料完整性  約束
  • 主鍵: 標誌事物唯一屬性
  • 外來鍵: 首先是一張表中的主鍵 ,又不是另外一張表中的主鍵
  • 主鍵定義
  • primary  key 約束來建立主鍵
  • 外來鍵定義
  • foreign key約束來建立外來鍵
  • 為現有的表中新增主鍵
  • alter table 表名 add primary key(欄位名);
  • 在兩張表中建立外來鍵
  • alter table 表一 add foreign key(欄位1) references 表二(欄位2);(表二的主鍵 作為表一和表二的外來鍵)

26、查詢奇數

--奇數
select * from (select AAA.*, rownum rn from AAA) e where mod(數字, 2)<>0 and e.ID = 3;

27、分組查詢

  • 函式進行查詢
  •  ceil(n),      取大於等於數值n的最小整數  ceil(10.1) ---> 11
  •  floor(n),     取小於等於數值n的最大整數   floor(10.1) --->10
  •  mod(m,n)      取m整數除n後的餘數
  •  power(m,n)    取m的n次方
  •  round(m,n)   四捨五入,保留位
  •  avg(欄位名)   求平均值,要求欄位為數值型
  •  count(欄位名) 統計總數
  •  min(欄位名)   計算數值型欄位最小數
  •  max(欄位名)   計算數值型欄位最大數
  •  sum(欄位名)   計算數值型欄位總和
  •  lower(欄位名) 轉換為小寫
  •  upper(欄位名) 轉換為大寫
  •  abs(欄位名)   取絕對值
  • ----------------------------
  • 分組
  • group by
  • having語句只能配合group by 語句使用

28、escape轉義符的用法

例如:

select * from table where col like 'ABC/%/_%' escape'/';
  • 模糊查詢的語句雖然不會發生SQL錯誤,但是不進行迴避的話,則無法得到要檢索的值。
  • 迴避方法較單引號複雜。需要使用轉義符。
  • 將【%】轉為【/%】,【_】轉為【/_】,然後在加上【escape'/' 】就可以了。

29、多表聯查

內連線查詢:

select * from table1 inner join table2   on    table1.XX = table2.XX;

左外連線查詢(左邊為基準):

select s.name,c.age from table1 s left join table2 c on s.xx  =  c.xx;

右外連線查詢(右邊為基準):

 select s.name,c.age from table1 s right  join table2 c on s.xx  =  c.xx;

30、複製

insert into table1  select * from table2;

當表1的欄位比表2的欄位多的時候

insert into table1(欄位名1,欄位名2) select * from table2

31、升降序

order by 欄位名    |desc 降序

                             |asc  升序

32、模糊查詢

  • (1)like | %      ------任意多個字元
  •             | _       ------一個位元組
  • (2)between xx and xx
  • (3)in()
  •     not in()
  • (4)is not
  •     null

33、子查詢

select 欄位名1 from 表1

where 欄位名2|=(select 欄位名2 from 表2 where 欄位3 = '##')

                          |in

                          |>any大運其中任意一個

                          |...