將用逗號隔開字段拆分紅兩行:java
select * from mp_fs_file_info a,dm_process_upload b where instr(b.attachment,a.file_id,1,1)>0;
字段名小寫加雙引號
to_char轉換成制定格式。
select to_char(xmmc), 項目名稱,dwmc "name" from desulfidation,正則表達式
插入多條數據:
insert into imdt_role_permission (
(select 3,5 from dual)
union
(select 3,23 from dual)
union
(select 3,30 from dual)
union
(select 3,31 from dual)
)
)sql
delete from calm_role_permission where role_id=2 and permission_id between 1 and 12 mvc
查詢列表最大數據記錄方法:函數
select a.* from pc_evaluation_upload a where not exists(
select 1 from pc_evaluation_upload b where b.well_id=a.well_id and b.create_date >a.create_date) and a.well_id ='0000000039';//兩個字段不出現重複,時間相同時須要用distinct
select a.* from pc_evaluation_upload a inner join
(select well_id,max(create_date) maxgdtime from pc_evaluation_upload group by well_id) b
on a.well_id=b.well_id and a.create_date=b.maxgdtime
你能夠理解爲 JOIN 是 INNER JOIN 的縮寫。post
LEFT JOIN 等價於 LEFT OUTER JOIN大數據
RIGHT JOIN 等價於 RIGHT OUTER JOIN,等價於from t1,t1 where t1.id =t2.idthis
having:lua
group by之後的where過濾。url
1
2
3
|
查詢字段出現兩次以上的數據,也可用於在另外一張表中
SELECT
*
FROM
material_plan_ming a
WHERE
a.material_plan_id
IN
(
SELECT
b.material_plan_id
FROM
material_plan_ming b
GROUP
BY
b.material_plan_id
HAVING
COUNT
(b.material_plan_id)>1);
|
distinct和group by去重區別:
即只有全部指定的列信息都相同,纔會被認爲是重複的信息。
單純的去重操做使用distinct,速度是快於group by的。
group by使用的頻率相對較高,但正如其功能同樣,它的目的是用來進行聚合統計的,雖然也可能實現去重的功能,但這並非它的長項
group by 的優點是能夠包含一個聚合函數,最大值,max,min,sum等。
不包含彙集函數的GROUP BY操做來講,和DISTINCT操做是等價的
1
2
3
4
5
6
7
|
SELECT
DISTINCT
a.key_id a.well_id,a.barrier_type_id
FROM
pc_evaluate_wellhead a
WHERE
a.well_id=
'0000000206'
select
e.well_id,e.barrier_type_id
from
pc_evaluate_wellhead e
group
by
e.well_id,e.barrier_type_id
SELECT
DISTINCT
well_id
FROM
pc_evaluate_wellhead;
SELECT
well_id,
COUNT
(well_id)
from
pc_evaluate_wellhead
group
BY
well_id;
|
行轉列,group分組查詢,逗號隔開:
select con_basis_id, sum(con_amount) from contract_basis_pro group by con_basis_id;
select LISTAGG(to_char(pro_name),',') WITHIN GROUP( ORDER BY con_basis_id) pro_name,con_basis_id from contract_basis_pro group by con_basis_id;
select con_basis_id,to_char(wm_concat(pro_name)) pro_name,to_char(wm_concat(con_amount)) con_amount,to_char(wm_concat(remark)) remark
from contract_basis_pro group by con_basis_id ;
select con_basis_id,wm_concat(to_char(pro_name)) pro_name,wm_concat(to_char(con_amount)) con_amount,wm_concat(to_char(remark)) remark from contract_basis_pro group by con_basis_id ;
wm_concat(toto)over(partition by ename order by type) |
行轉列排序問題:
1
2
3
|
SELECT con_basis_id, max(pro_id) pro_id FROM(SELECT con_basis_id,
to_char(wm_concat(to_char(pro_id)) over (partition by con_basis_id order by ID)) pro_id
FROM contract_basis_pro ) GROUP BY con_basis_id
|
列轉行:
select REGEXP_SUBSTR(a.file_url ,'[^,]+',1,l) as file_url
from reply_file a,
(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(a.file_url) - LENGTH(REPLACE(file_url,','))+1;
查詢有重複的語句:(having 對group後的組進行過濾,篩選。某些條件可用where替換)
select * from pro_bas_info where pro_code in (select pro_code from pro_bas_info group by pro_code having COUNT(*)>1);
select well_id, max(create_date) maxgdtime from pc_evaluation_upload group by well_id HAVING count(*) > 2
分頁查詢:(第二種方式效率較高)
SELECT a.*, ROWNUM RN FROM (SELECT * FROM mp_fs_file_info ORDER BY R_CREATEDATE DESC) a
WHERE ROWNUM BETWEEN 0 AND 4;
SELECT * FROM (
SELECT a.*, ROWNUM RN FROM (SELECT * FROM mp_fs_file_info ORDER BY R_CREATEDATE DESC) a
WHERE ROWNUM <=4) b
WHERE RN > 0;
IN和EXISTS的用法和區別:
exists : 強調的是是否返回結果集,不要求知道返回什麼
in 最大的區別在於 in引導的子句只能返回一個字段
select a.* from contract_basis a where exists(select 1 from signed_file b where a.id = b.con_basis_id); //查詢在另外一張表中有數據,有附件。
select a.* from contract_basis a where a.id in (select b.con_basis_id from signed_file b where a.id = b.con_basis_id);
DELETE FROM contract_basis_pro t1 WHERE NOT EXISTS (SELECT 1 FROM pro_bas_info t2 WHERE t1.pro_id = t2.pro_code); 查詢在另外一張中不存在的段。
按排序取出第一條數據:
with ti as (SELECT ID,MK_NO FROM (SELECT ID,MK_NO FROM MP_APP_DEPT WHERE PID = 'JGZNBM')
WHERE mk_no>'020202' order by mk_no)
select * from ti where rownum =1;
按排序取出第一條數據:
SELECT a.key_id,b.file_id FROM dm_process_upload a,mp_fs_file_info b WHERE a.attachment = b.file_id(+) ;
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') d1 from dual;
to_date('2010-02-24 15:01:54','YYYY-MM-DD HH24:MI:SS')
select sysdate d1,trunc(sysdate) d2 from dual;//只要日期部分
select sysdate d1,EXTRACT(YEAR FROM sysdate) thisyear//日期的部分YEAR、MONTH,DAY、HOUR、MINUTE、SECOND
select date'2017-12-29'-a.branch_declare_date from special_evaluation a;
正則表達式:
SELECT * FROM pay_info WHERE 1=1 ORDER BY to_number(regexp_replace(doc_no, '[^0-9]')) DESC;//to_number的用法。
SELECT regexp_replace('20322323-07', '^[0-9]') FROM dual;
select regexp_replace('XX路1001弄12幢102室', '\d+幢', '') from dual 可取消第三個參數
sql字段爲空則替換:
SELECT t.task_id,t.process_id,to_number(nvl(t.task_id,0))+to_number(nvl(t.process_id,0)) FROM material_plan t;
replace與translate都是替代函數:
select translate('abcdcefga','abc','wo') 返回值 from dual;//wodefgw
SELECT Replace('abcdcefga','abc','wo') 返回值 FROM dual;//wodcefga
只不過replace針對的是字符串,而translate針對的是單個字符,沒有出現的,如‘c’也刪除。
Union和Union All的區別:
一、Union,對兩個結果集進行並集操做,不包括重複行,同時進行默認規則的排序;
二、Union All,對兩個結果集進行並集操做,包括重複行,不進行排序;三、都是取select後的字段名做爲統一字段名,union後的字段按順序組合便可。
清除字段中有空格的字段:
select REPLACE(report_no, ' ', '') from contract_basis;
update contract_basis set report_no=REPLACE(report_no, ' ', '');
查詢時間fan範圍:
sysdate+1就是加一天
若是要加一小時的話就是sysdate+1/24
若是要加一分鐘的話就是sysdate+1/24/60
--數據恢復:(delete閃回,drop回收站)
select * from user_recyclebin;--查詢回收站內容
flashback table 要恢復的表名 to before drop;--恢復表
flashback table 表A to before drop rename to 表B;--從回收站恢復時重命名錶(把表A從新恢復命名爲表B)
一、 insert into 表名 (select * from 表名 as of timestamp to_timestamp('刪除時間點','yyyy-mm-dd hh24:mi:ss'));-- 注意要保證主鍵不重複。
二、
--開啓行移動功能
·alter table 表名 enable row movement
--恢復表數據
·flashback table 表名 to timestamp to_timestamp(刪除時間點','yyyy-mm-dd hh24:mi:ss')
--關閉行移動功能 ( 千萬別忘記 )
·alter table 表名 disable row movement