常用数据库sql总结(不断总结更新中)

来源:互联网 发布:网络对战游戏排行榜 编辑:程序博客网 时间:2024/05/17 13:42

1.统计表的列数

   oracle:

         select count(*) from USER_TAB_COLUMNS where table_name ='TABLE_NAME';//表名要大写
   sqlserver:
         select count(1) from syscolumns where id =object_id('table_name');

2.复制表结构

   oracle:

         create table dest_table_name  as  select * from src_table_name;

   sqlsever:

         select *  into dest_table_name  from src_table_name  where 0=1

3.复制表结构以及表内数据

   sqlserver:   

         select *  into  dest_table_name from  src_table_name                     //适用于目标表不存在
         insert     into  dest_table_name(fld1, fld2)  select  fld2, 5  from src_table_name  //目标表必须存在
4.日期有关
    sqlserver:   

         CONVERT(varchar(100), sys_time, 23) AS sys_time                   //截取年月日   ex.2009-03-08
         CONVERT(varchar(7), sys_time, 23) AS sys_time                       //截取年月      ex.2009-03
         select DATEPART(weekday,'2009-10-18')                                   //统计日期在一周中的天数 周日为1  周六为7
         select DATENAME(week, '2009-10-18')                                       //统计日期在一年中的周数

        

         //2009-12-30 和2010-1-1 虽然属于同一周 sqlserver把其按年份分割开来

         select  DATEPART(yy, '2009-12-30'),DATENAME(week, '2009-12-30')   //输出:2009    53
         select  DATEPART(yy, '2010-1-1'),DATENAME(week, '2010-1-1')           //输出:2010    1

 

        按周统计的问题
        --2009-10-18为周日
        select DATEpart(week, '2009-10-18') ,DATEpart(weekday,'2009-10-18');       --2009年第43周的第1天

        --2009-10-18为周日
        set datefirst 1;
        select DATEpart(week, '2009-10-18') ,DATEpart(weekday,'2009-10-18');        - -2009年的42周第7天

      

          /*
           * 统计数据的所属年份,所属周数,以及该周拥有几天的数据记录
          */
         set datefirst 1;//设置星期一为一个星期第一天,sqlserver默认星期天为一个星期第一天
         select T.msc_name,T.year,T.week,count(*)  from
                 (SELECT
                     msc_name,
                     DATEPART(yy, sys_time) AS year,
                     DATEPART(week, sys_time) AS week,
                     DATEPART(weekday,sys_time) As weekday
                FROM         dbo.FUN_OMC_GSM_CELL_MSC_NAME
                group by  msc_name,DATEPART(yy, sys_time),DATEPART(week, sys_time),DATEPART(weekday,sys_time)
          ) T

          group by T.msc_name,T.year,T.week
     informix:
           extend(systime,year to day)//2003-01-01
           extend(systime,year to month)//2003-01
           extend(systime,year to year)//2003
           extend(current - 2 units minute)   //当前时间减 2分钟

  

5.sql性能统计
       sqlserver
         
declare @d datetime;
          set @d=getdate();
          --sql语句
           select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate());

         

           set statistics time on    --统计时间
           --sql
           set statistics time off
           set statistics io   on      --统计io
           --sql 
          set statistics io  off
6.其他
      sqlserver
      1.清除sqlserver缓存
          DBCC FREEPROCCACHE;
          DBCC DROPCLEANBUFFERS;
      2.from 子查询
         select *  from ( select parent_id,count(*) as count from entity group by parent_id ) a
         -- 子查询需要给统计列给别名,比如 count(*) 别名为count

      3.sqlserver 分页方法一

         -- 每页10条数据,第三页数据,按时间降序排列

         SELECT  * 
           FROM ( SELECT  TOP 30 sysdate
                                  from tb
                                  where 1=1 group by sysdate order by sysdate desc ) temptb
                           where sysdate not in (select top 20  sysdate
                                            from tb
                                            where 1=1 group by sysdate order by sysdate desc )
                           order by sysdate desc
     4.统计查询分页
       SELECT  * 
        FROM ( SELECT  TOP 30 CONVERT(varchar(12),sysdate,112)+lac as pk, sysdate,lac,count(*) as count
             from tb_demo 
             where 1=1 group by sysdate,lac order by sysdate desc,lac) tb
                           where pk not in (
                                   select pk from 
                                   (select top 20 CONVERT(varchar(12),sysdate,112)+lac as pk, sysdate,lac
                                            from tb_demo 
                                            where  1=1 group by sysdate ,lac order by sysdate desc,lac ) tb2 )
                           order by sysdate desc

7.常用oracle命令

//查看表结构
desc tab;
//显示当前用户的所有表
select tname from tab;
//查找sequence
select SEQUENCE_NAME from user_sequences;
//查看oracle数据库字符集
select userenv('language') from dual;

//改变sqlplus日期显示格式
alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

//建触发器
create or replace trigger iqcar_transfer_to_misc_user
  after insert or update on user_order 
  for each row
declare
  -- local variables here
  dinnerid varchar2(10);
begin
  dinnerid := '10086';
  if inserting then
    if ( trim(:New.Dinner_Id) = dinnerid) and ( trim(:New.State) = 'D01' )  then
       insert into MISC_USER values (SEQ_MISC_USER_ID.NEXTVAL,:NEW.CELL_NUMBER,:New.Dinner_Id,:New.Order_Date,:NEW.STATE);
    end if;  
  end if;
  if updating then
    if ( trim(:Old.Dinner_Id) = dinnerid) and ( trim(:New.State) = 'D10') then
       insert into MISC_USER values (SEQ_MISC_USER_ID.NEXTVAL,:Old.CELL_NUMBER,:Old.Dinner_Id,:NEW.END_DATE,:New.STATE);
    end if;
  end if;
end transfer_to_misc_user;

//查找cell_number重复的所有记录
select * from user_order where cell_number in (select cell_number from cell_user_order group by cell_number having(count(*))>1)

//查看大字节类型数据内容
set long 2000;
//显示当前用户
show user ;
//设置sqlplus行长度
set linesize 1000;
//表复制
create table b as select * from iqcar_misc_user

 

// sqlplus执行多条sql

SET   SERVEROUTPUT   ON
 --多条sql 在这

/       -- 用  / 表示结束

 //查看触发器主题内容
set long 2000;
SET   SERVEROUTPUT   ON ;
select TRIGGER_BODY from user_triggers where  TRIGGER_NAME ='MISC_USER';


 

//查看数据表锁
select   lpad( '   ',decode(l.xidusn,0,3,0))||l.oracle_username   User_name,
              o.owner,o.object_name,o.object_type
from   v$locked_object   l,dba_objects   o
where   l.object_id=o.object_id
order   by   o.object_id   desc ;

 select sess.sid,
         sess.serial#,
         lo.oracle_username,
         lo.os_user_name,
         ao.object_name,
         lo.locked_mode
   from  v$locked_object lo,dba_objects ao,v$session sess
  where  ao.object_id = lo.object_id
    and  lo.session_id = sess.sid;
//除去锁
  alter system kill session '113,8359';

--查询sequence
select SEQUENCE_NAME from user_sequences where  SEQUENCE_NAME  like 'SEQ_IQCAR%';
show error;  --显示错误
drop trigger trigger_name;
show user;   --显示当前用户

sqlserver2005客户端访问:
58.19.183.230,1393  -- 格式如: IP,Port

//导出clob数据,user/passwd@servicename
  exp govhubei/govhubei@govhubei   
  select dbms_lob.instr(ziduan ) from biao

//创建表空间 (plsql->command window)
  create tablespace TSB datafile 'D:\oracle\temp\TSB.dbf' size 200m autoextend on next 10m maxsize unlimited;
  alter database datafile 'D:\oracle\temp\TSB .dbf' autoextend on;
  alter database datafile 'D:\oracle\temp\TSB .dbf' resize 220m;

//含大数据类型数据表的导入导出问题,比如 服务器A表空间TSA转移到服务器B表空间TSB
  1.本地建TSB表空间  见上命令
  2.拷贝TSA中的表到TSB中
     create table TSB.dest_table_name  as  select * from TSA.src_table_name;
  3.导出大数据类型表 用exp命令,目前所有数据表在表空间TSB下,见上命令
  4.登录目的服务器B,导入到目的表空间

 

//导入dmp
    imp user/passwd file=f:\jc_clob.dmp full=y
    imp user/passwd file=f:\jc_clob.dmp full=y
    imp user/password@db file = /home/wcity/jcw/jcw_server.dmp ignore=y full =y

 

//查看表所在表空间
select TABLESPACE_NAME from all_tables where table_name='TB_NEWS_CONTENT';
//查看TB开头的所有表
select tname from tab where tname like 'TB%'
//排序后的前100条记录
select * from (select * from tb t where t.category_id ='9' order by t.order desc) where rownum<=100;

//oracle表重命名
alter table TB_NEWS_CONTENT1 rename to TB_NEWS_CONTENT

原创粉丝点击