資料庫一直是自己的弱項,以前基本上也沒涉及到非常複雜的sql,即使有也不是俺做,所以對sql的認識一直很膚淺,在面試的時候也是最怕遇見資料庫的問題。
最近常遇見一些相對麻煩一點的sql語句,決定做個記錄,以後有機會再來完善。
1.
select m.org_id,(select org_name from org where org_id=m.org_id),count(*)
from htm_machine m group by m.org_id
上面這句sql的作用是查詢htm_machine中,每個org對應的記錄條數。這條語句與下面的語句等價:
select o.org_id,o.org_name,ma.m_num from org o
left join (select m.org_id org_id,count(*) m_num from htm_machine m
group by m.org_id) ma on ma.org_id=o.org_id
where o.org_id=ma.org_id
2.關於樹的遞迴問題。
員工表staff中含有dep_id欄位,dep中的主鍵為dep_id,還有其父結點parent_id,現要將某部門員工的數量列出來(包括根部門):
select count(*) from staff s where s.dep_id in
(select dep_id from dep where is_leaf = 'y' and dep_type_id = 2
and (status = 'c' or status = 'u')
start with dep_id = #depid#
connect by prior dep_id = parent_id)
上面主要用到的就是start with .. connect by prior,start with表示連線的起始條件,
connect by prior表示連線條件。
3.日期處理函式。
由於日期一般會有兩種格式:yyyy-mm-dd與yyyymmdd,所以要想將這個欄位的值轉換成日期,我能想到的就是寫個自定義函式。
create or replace function birthformat(bir varchar2)
return date
is begin
if bir is null then return bir;
elsif regexp_like(bir,'[[:digit:]][-][[:digit:]][-][[:digit:]]')
then return to_date(bir,'yyyy-mm-dd');
elsif regexp_like(bir,'[[:digit:]]') then
return to_date(bir,'yyyymmdd');
else return null;
end if;
exception
when others then return null;
end;
上面**很容易懂,但對於我這個不常寫sql的人來說,還是花了不少時間。而且最近發現居然可以用regexp_like來匹配多個要like的值,確實有些意外。
4.乙個通過身份證獲取年齡的函式:
create or replace function birthdate(bir in varchar2)
return varchar2 is
back varchar2(16);
begin
if length(trim(bir))=15 then back:=trunc(months_between(sysdate,to_date('19' || substr(bir, 7, 6),'yyyymmdd'))/12);
elsif length(trim(bir))=18 then back:=trunc(months_between(sysdate,to_date(substr(bir, 7, 8),'yyyymmdd'))/12);
end if;
return back;
exception
when others then return null;
end;
5.負數作為0處理。如果乙個欄位為負數,查詢出來是把它置為0,因為資料庫中沒有這麼乙個方法,所以需要一點技巧,就是通過(a+|a|)/2的方式來解決。
6.日期比較。一般加上一天再用小於,因為預設的比較時間是到00:00:00分。
m.create_time
7. 從多條記錄中隨機取出其中的一條。
select * from (select * from user_type order by dbms_random.value) where rownum=1
8.將日期轉換成周。如將當前日期轉換成當年的第幾周:
to_char(sysdate,'iw')
9.處理不是group by列的問題。如果使用了group by,則查詢列或者order by列等都只能使用group by裡面的列或者採用聚合函式,如果每列的資料都一樣,可以直接使用max(列名),這種方法相當有效,減少了很多**。
oracleSQL基本查詢
create table dept deptno number primary key,dname nvarchar2 50 log nvarchar2 50 select from dept for update create table enp empno number primary key,...
oracle sql應用總結
1.case應用和 應用例項 select o.oidleft o.oidrite o.oidtype as onuid,d.nmsuserlabel as 裝置名稱,c.name as 裝置編碼,as 接入型別,as 所屬機房id,o.location3 as 所屬機房,o.networkid a...
oracle sql使用總結
1.按照in的順序查詢出結果排序 select xh,xm from xjgl zxsjbxx where xh in 2120196132 2120196133 order by instr 2120196132,2120196133 xh 2.sql更新 如果為空按照第二個更新,如果不為空按照第...