• 数据库之间的区别


    最近在做oracle兼容,原来项目是用postgresql数据库,发现有许多区别,故就想把工作中遇到过的几种数据库整理一下。

    在工作中,用到过的几种数据库,ms sqlserver,postgresql,oracle,现记录下来其中区别,以备以后查阅。

    记录不全,只是记录遇到过的,以后遇到其他再慢慢补全。

    一、sql语句的差别:其中sql语句基本差不多,只是有少许差别

    1.查询前10条数据

    .sqlserver

    select top 10 * from T where ..condition order by 某一列名;

    . postgresql

    select * from T where  ..condition order by 某一列名 limit 10;

    . oracle

    在oracle中,要实现查询前N条数据:不能用select top N,
    要用order by 跟rownum组合来实现。

    (1). select * from (select * from T order by 某一列名) t where rownum<=10; 先排序后取值 

    (2). select * from (select t1.* ,rownum rn from tabName  t1 order by t1.colname) t2 where t2.rn<=10;

    --不能对rownum使用">"
    select * from emp where rownum > 10;注定要失败!
     
    .mysql
    select * from table where [condition] order by [condition] limit 10;
    -------------------------------------------------------------------------------------------------------------
    2. 表别名前能不能加as
    oracle中,表别名前不能加as,用空格代替,列名前可以加;
    错:select  * from T as t ;
    错:select * from (select rownum as rn,t1.* from T  as t1) as t2 where t2.rn between 10 and 20;
    其他数据库都可以加。
    ----------------------------------------------------------------------------------

    3. 某列值是日期时间(datetime或stamp)类型

    Oracle:

    oracle中插入日期、日期时间格式必须to_date转换,比如'08-21-2003', '2012-12-10 11:05:21'

    insert into student(subTime) values(to_date('08-21-2003','MM-DD-YYYY'));
    insert into T(subTime) values (to_date('2012-12-10 11:05:21','yyyy-mm-dd hh24:mi:ss'));
     
    oracle查询时间格式也必须要to_date转换
    select count(1) FROM kakou_wzxx  where  subTime between to_date('2011/1/19 10:02:27','yyyy-mm-dd hh24:mi:ss') and to_date('2012/12/19 10:02:28','yyyy-mm-dd hh24:mi:ss')
    select count(1) FROM kakou_wzxx  where  subTime>=to_date('2011/1/19 10:02:27','yyyy-mm-dd hh24:mi:ss') and subTime<=to_date('2012/12/19 10:02:28','yyyy-mm-dd hh24:mi:ss')
     

    ---------------------------------------------------------------------------------------------------------------

    4. 分页语句

    从第M条记录开始取N条记录
    ------------------------------
    . sqlserver: (top)四种写法
    第一种写法:
    select top N * 
    from userinfo 
    where userId in
    (select top (M+N-1) userId from userinfo  where condition.. order by userId desc)
    order by userId desc;
     
    第二种写法:
    select top N *
     from userinfo
     where userId not in
     (select top M userId from userInfo order by userId asc)
    order by userId
     
    第三种写法:
    select top N* 
    from userInfo 
    where userId>
    (select max(userId) from (select top M userId from userInfo order by userId) a)
    order by userId
     
    第四种写法: (sqlserver 2005及以上版本)
    select * from 
    (select Row_Number() over (order by userId) as RN, * from UserInfo) U
    where U.RN between M and M+N ;
    -----------------------------------------------
    .postgresql :  (limit)
     
    select * from UserInfo 
    where name like '%a%'
    order by id 
    limit N offset M;
     
    ---------------------------------------------------
    .oracle: (rownum)
    oracle分页时必须用rownum,如果还有排序,则只能用子查询来实现先排序.
    (1)
    select * 
    from (select rownum  rn, u1.* from userinfo u1 where condition.. order by condition..) u2
    where u2.rn between 10 and 20 ;
    (2) 
    select * 
    from (select rownum  rn, u1.* from userinfo u1 where rownum<=20 order by name) u2
    where u2.rn >10 ;
     --------------------------------------------------------------------------------------------------------
    .mysql: (limit)
     
    select * from table where [condition] order by [condition] limit start,pageNum;
    说明:      
       start:取数据的定位点   [开始是从0开始]      pageNum:每次取多少          
       比如:start=10,pageNum=10        那么就是说,取11-20   条数据
    ------------------------------------------------------------------------------
     

    二、在程序中引用的区别

    1. 命名空间不同

    .sqlserver

    using System.Data.SqlClient; 

    对象:SqlConnection、SqlCommand、SqlParameter 、SqlDataAdapter

    .postgresql

    using System.Data.Odbc;
    OdbcConnectionOdbcCommand、OdbcParameter、OdbcDataAdapter

    .oracle

     using System.Data.OracleClient;
    OracleConnectionOracleCommand OracleParameter OracleDataAdapter

    -----------------------------------------------------------------------------

    2.参数化查询变量表示不同

    .sqlserver

    标识符用@,比如:

    StringBuilder strSql = new StringBuilder();

    strSql.Append("update T_User(name,phone,email) set name=@name,phone=@phone,email=@eamil;");

    SqlParameter[] parameters = {
         new SqlParameter("@name",SqlType.VarChar,50),
         new SqlParameter("@phone",SqlType.VarChar,50),
         new SqlParameter("@eamil",SqlType.VarChar,50)     
    }
    parameters[0].Value= ..;
    parameters[1].Value=..;
    parameters[2].Value=..;

    .postgresql

    标识符用?

    StringBuilder strSql = new StringBuilder();

    strSql.Append("update T_User(name,phone,email) set name=?,phone=?,email=?;");

    OdbcParameter[] parameters = {
         new OdbcParameter("@name",OdbcType.VarChar,50),
         new OdbcParameter("@phone",OdbcType.VarChar,50),
         new OdbcParameter("@eamil",OdbcType.VarChar,50)    
    }
    parameters[0].Value= ..;
    parameters[1].Value=..;
    parameters[2].Value=..;

    .oracle

    标识符用:

    StringBuilder strSql = new StringBuilder();

    strSql.Append("update T_User(name,phone,email) set name=:name,phone=:phone,email=:email;");

    OracleParameter[] parameters = {
         new OracleParameter(":name",OracleType.VarChar,50),
         new OracleParameter(":phone",OracleType.VarChar,50),
         new OracleParameter(":eamil",OracleType.VarChar,50)    
    }
    parameters[0].Value= ..;
    parameters[1].Value=..;
    parameters[2].Value=..;
    ----------------------------------------------
    3.在程序中获取DataTable时,表的列名有区别
    oracle中,程序中查出来的DataTable里面的列名全部是大写,不管建表时是小写还是大写。
     
    而在postgresql中,根据建表时列名是大写和小写有关。 是小写查询出来的列名就是小写。
     
    鉴于这两者数据库有这种区别,所以在程序要兼容这两种数据库的时候,程序前台绑定时要注意:列名大小写的区别
    $('#gvList').datagrid({
                    iconCls: 'icon-save',
                    autoRowHeight: true,
                    nowrap: true,
                    striped: true,
                    fit: true,
                    fitColumns: true,
                    pageSize: 30,
                    collapsible: false,
                    url: 'List.aspx?paramType=Query',
                    queryParams: params,
                    sortName: 'xxbh',
                    sortOrder: 'desc',
                    remoteSort: false,
                    singleSelect: true,
                    idField: 'xxbh',
                    columns: [[
                        { field: 'hpzl', title: '号牌种类' , 150, align: 'center' },
                        { field: 'hphm', title: '号牌号码' , 150, align: 'center' },
                        { field: 'start_time', title: '有效期开始' , 150, align: 'center', formatter: timeFormatter },
                        { field: 'end_time', title: '有效期结束' , 150, align: 'center', formatter: timeFormatter },
                        { field: 'examineflow_type', title: '审核状态' , 80, align: 'center' },
                        { field: 'temp_flow', title: '操作选项' , 150, align: 'center', formatter: oprFormatter }
                    ]],
                    pagination: true,
                    rownumbers: true,
                });
    ---------------------------------------------
    $('#gvList').datagrid({
                    iconCls: 'icon-save',
                    autoRowHeight: true,
                    nowrap: true,
                    striped: true,
                    fit: true,
                    fitColumns: true,
                    pageSize: 30,
                    collapsible: false,
                    url: 'List.aspx?paramType=Query',
                    queryParams: params,
                    sortName: 'XXBH',
                    sortOrder: 'desc',
                    remoteSort: false,
                    singleSelect: true,
                    idField: 'XXBH',
                    columns: [[
                        { field: 'HPZL', title: '号牌种类' , 150, align: 'center' },
                        { field: 'HPHM', title: '号牌号码' , 150, align: 'center' },
                        { field: 'START_TIME', title: '有效期开始' , 150, align: 'center', formatter: timeFormatter },
                        { field: 'END_TIME', title: '有效期结束' , 150, align: 'center', formatter: timeFormatter },
                        { field: 'APPROVE_FLOW', title: '审核状态' , 150, align: 'center' },
                        { field: 'BKXXBH', title: '操作选项' , 150, align: 'center', formatter: oprFormatter }
                    ]],
                    pagination: true,
                    rownumbers: true
                });

    当然为了兼容,并且列名大小写不一致的情况下,我的做法是:在程序中,对获取到的DataTable再做一次处理,即将所获取到的表列名全部转换为一致,要么全小写,要么全大写。方法很简单:

     /// <summary>
            /// 将Datatable中的列名转换为小写
            /// </summary>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static DataTable ConvertColumnName2Lower( DataTable dt)
            {
                if (dt == null )
                {
                    return null ;
                }
     
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    dt.Columns[i].ColumnName = dt.Columns[i].ColumnName.ToLower();
                }
                return dt;
            }
    -----------------------------------------------------------------------------------------------------------------------------------------

    以上就是工作中遇到的一些区别,肯定还有许多,以后会在工作中慢慢补充。

  • 相关阅读:
    Altium Designer 16 问题解决
    IAR FOR AVR 仿真过程中出现全局变量值不断随意变化的问题
    linux '--stdin'错误 -批量修改密码
    EmWin 字体相关函数
    EmWin 文本显示函数
    Win10下 usart驱动PL2303无法安装的问题
    EmWin 接触---基础函数
    Linux 下 Samba 服务器搭建
    MPLAB X IDE V4.15 创建工程,编译,问题处理
    EF Core MVC
  • 原文地址:https://www.cnblogs.com/chay1227/p/2836076.html
Copyright © 2020-2023  润新知