工作中總結的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]
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
2、select 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大運其中任意一個
|...