mysq,oraclel複雜SQL操作彙總

2022-06-27 12:30:10 字數 1614 閱讀 8041

一.對資料庫原有字段預設值的設定

1.刪除原有字段預設值

alter table 表名 alter column 字段 drop default;

2..重寫原有字段預設值

alter table 表名 alter column 字段 set default 0;

二.儲存過程函式f_lookup(),計數函式count(1),group by只對select後包含的字段有意義,日期函式timestampdiff(day,sys_shrq,sysdate())

2.1mysql操作

//超過一天未做的事情

select

f_lookup(1137,mdjlx) as mdjlx ,count(1) as ncount

from

表名 where

*******

and timestampdiff(day,sys_shrq,sysdate())>1

group by mdjlx;

通過mdjlx group 之後,select 這邊就不要出現mdjlx之外的字段了,沒意義的,也不符合規範,你看到的這些其他欄位的資訊,只是對應mdjlx的第一條資料而已

2.2oracle資料庫

select

cname as cname,

count( 1 ) as ncount

from

表名a,表名b

where

and round(to_number(sysdate - to_date(jhdksrq,'yyyy-mm-dd'))) > 1

group by

cname

3..mysql包含之in

select count(1) as count from 表名 a,表名 b where a.主鍵 = b.外來鍵  and a.欄位 in('1','2,'3') and  a.欄位<> 1;

4..and與or的結合使用

update 表名set 欄位1= 99,s欄位2 = 1 where (欄位3= '1' and 欄位4 <> '99') or (s欄位5<>1 and 欄位6 = 99) ;

5..instr與in

update sr表名 set  sys_spzt = 0 where mhzsfz in (342623199709098090 , 3301026410244561245 ,  33010252 , 3301120252);

update sr_main_ww  set  sys_spzt = 0 where  instr('33011203022252,3301120252', mhzsfz) >= 1

select * from 表名 where 欄位1= 1 and 欄位2 = 0 and (欄位3= '' or 欄位4 is null or 欄位5 = '' or 欄位6 is null or 欄位7= '' or 欄位8 is null) and instr('db_jz,kn_jz,wb_jz',欄位9) > 0;

6..not in的使用

select 學生學號 from 表名 where  學生學號 not in(select 學生學號 from  表名2 a,表名3 b where a.主鍵= b.外來鍵 and a.學生學號= b.學生學號);

SQ 模糊查詢

between.and.在資料庫內部是做作特殊優化的,執行效率比 and 等這種方式快 between a and b 相當於 字段 a and欄位 b 例如 select from dbo.mystudent where s age between 20 and 30 between and還可以...

SQ優化策略

1.對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在進行條件判斷的字段上建立索引 2.應盡量避免在where子句中對字段進行null值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄 select from scott emp where job is null 3.應盡量避免在where字句中使用 ...

sq分頁原理

查詢第x頁,每頁y條記錄 最基本的處理方法 原理 如果表中有主鍵 記錄不重複的字段也可以 可以用類似下面的方法,當然y,x 1 y要換成具體的數字,不能用變數 select top y from 表 where 主鍵 not in select top x 1 y 主鍵 from 表 如果表中無主鍵...