zoukankan      html  css  js  c++  java
  • MySQL与Oracle的语法区别

    转载 http://zy116494718.iteye.com/blog/796827

    Oracle和mysql的一些简单命令对比
    1)  SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
      SQL> select to_char(sysdate,'hh24-mi-ss') from dual;
      mysql> select date_format(now(),'%Y-%m-%d');
      mysql> select time_format(now(),'%H-%i-%S');
      日期函数
      增加一个月:
      SQL> select to_char(add_months(to_date ('20000101','yyyymmdd'),1),'yyyy-mm-dd') from dual;
      结果:2000-02-01
      SQL> select to_char(add_months(to_date('20000101','yyyymmdd'),5),'yyyy-mm-dd') from dual;
      结果:2000-06-01
      mysql> select date_add('2000-01-01',interval 1 month);
      结果:2000-02-01
      mysql> select date_add('2000-01-01',interval 5 month);
      结果:2000-06-01
      截取字符串:
      SQL> select substr('abcdefg',1,5) from dual;
      SQL> select substrb('abcdefg',1,5) from dual;
      结果:abcdemysql> select substring('abcdefg',2,3);
      结果:bcd
      mysql> select mid('abcdefg',2,3);
      结果:bcd
      mysql> select substring('abcdefg',2);
      结果:bcdefg
      mysql> select substring('abcdefg' from 2);
      结果:bcdefg

    2) 在MySQL中from 后的表如果是(select.......)这种,那么后面必须有别名

    3) 连接字符串在Oracle中用|| ,SqlServer中用+,MySQL中用concat('a','b','c')

    4)

    在SqlServer中的写法:

    declare @id varchar(50);
    set @id='4028e4962c3df257012c3df3b4850001';
    select * from sims_sample_detect where ID= @id;

    在MySQL中的写法:

    set @a = 189;
    select * from bc_article where id = @a //不用declare

    在Orcale中的写法:

    5)MySQL存储过程:

    Sql代码 复制代码 收藏代码
    1. DELIMITER $$   
    2.   
    3. DROP PROCEDURE IF EXISTS `SIMS`.`transaction_delSampleInfo`$$   
    4.   
    5. CREATE DEFINER=`root`@`%` PROCEDURE `transaction_delSampleInfo`(in sampleInfoId varchar(50))   
    6. BEGIN  
    7.     start transaction;     
    8.     update sims_sample_info set del='1' where ID =  sampleInfoId;   
    9.     update sims_sample_detect set del='1' where SAMPLE_ID_PARENT = sampleInfoId;   
    10.     update sims_sample_detect_info set del='1' where DETECT_ID in(   
    11.     select ID from sims_sample_detect where SAMPLE_ID_PARENT = sampleInfoId   
    12.    );    
    13.        
    14.     commit;   
    15.     END$$   
    16.   
    17. DELIMITER ;  
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS `SIMS`.`transaction_delSampleInfo`$$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `transaction_delSampleInfo`(in sampleInfoId varchar(50))
    BEGIN
        start transaction;  
        update sims_sample_info set del='1' where ID =  sampleInfoId;
        update sims_sample_detect set del='1' where SAMPLE_ID_PARENT = sampleInfoId;
        update sims_sample_detect_info set del='1' where DETECT_ID in(
        select ID from sims_sample_detect where SAMPLE_ID_PARENT = sampleInfoId
       ); 
        
        commit;
        END$$
    
    DELIMITER ;

    变量名不能跟列名相同,否则效果为1=1,且MySQL不区分大小写。

    6)mysql 游标 

         mysql没有像orcale的动态游标,只有显示游标,例子如下:

    Java代码 复制代码 收藏代码
    1. DELIMITER $$   
    2.   
    3. DROP PROCEDURE IF EXISTS `test`.`liyukun`$$   
    4.   
    5. CREATE DEFINER=`ids`@`localhost` PROCEDURE `liyukun`(out z int)   
    6.   
    7.   
    8.   
    9. BEGIN   
    10.   
    11.     declare count1 int;   
    12.     DECLARE done INT DEFAULT 0;     
    13.       
    14.     declare v_haoma varchar(50);   
    15.     declare v_yingyeting varchar(100);   
    16.        
    17.        
    18.     DECLARE cur1 CURSOR FOR select haoma,yingyeting  from eryue where id<2;     
    19.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;     
    20.    //这里和oracle有区别,Oracle的PL/SQL的指针有个隐性变   
    21. 量%notfound,Mysql是通过一个Error handler的声明来进行判断的   
    22.   
    23.     
    24.      OPEN cur1;     
    25.      cur1: LOOP     
    26.          FETCH cur1 INTO v_haoma,v_yingyeting;     
    27.          IF done=1 THEN   //如果没有数据了,则离开     
    28.              LEAVE cur1;     
    29.          ELSE   
    30.           
    31.          select count(*) into count1 from year2012 where haoma=v_haoma ;   
    32.          if(count1=0) then   
    33.              
    34.          insert into year2012(haoma, yingyeting)    
    35.          values(v_haoma,v_yingyeting);   
    36.             
    37.          else    
    38.          set z = z+1;   
    39.          update year2012 set eryue = ‘100’ where haoma=v_haoma;     
    40.   
    41.          end if;   
    42.   
    43.   
    44.          END IF;   
    45.      END LOOP cur1;     
    46.      CLOSE cur1;     
    47.   
    48.        
    49.   
    50.     END$$   
    51.   
    52. DELIMITER ;  
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS `test`.`liyukun`$$
    
    CREATE DEFINER=`ids`@`localhost` PROCEDURE `liyukun`(out z int)
    
    
    
    BEGIN
    
        declare count1 int;
        DECLARE done INT DEFAULT 0;  
       
        declare v_haoma varchar(50);
        declare v_yingyeting varchar(100);
        
        
        DECLARE cur1 CURSOR FOR select haoma,yingyeting  from eryue where id<2;  
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;  
       //这里和oracle有区别,Oracle的PL/SQL的指针有个隐性变
    量%notfound,Mysql是通过一个Error handler的声明来进行判断的
    
     
         OPEN cur1;  
         cur1: LOOP  
             FETCH cur1 INTO v_haoma,v_yingyeting;  
             IF done=1 THEN   //如果没有数据了,则离开  
                 LEAVE cur1;  
             ELSE
           
             select count(*) into count1 from year2012 where haoma=v_haoma ;
             if(count1=0) then
              
             insert into year2012(haoma, yingyeting) 
             values(v_haoma,v_yingyeting);
             
             else 
             set z = z+1;
             update year2012 set eryue = ‘100’ where haoma=v_haoma;  
    
             end if;
    
    
             END IF;
         END LOOP cur1;  
         CLOSE cur1;  
    
        
    
        END$$
    
    DELIMITER ;

       执行:

    call liyukun(@a);
    select @a;

    7) mysql的group by 语句可以select 没有被分组的字段,如

    select id,name,age from A group by age 这样

    但是在orcale和sqlserver中是会报错的。这个取出的id,name所在的行是每个分组中的第一行数据。

    8)orcale用decode()来转换数据,mysql,sqlserver用case when:

    case t.DETECT_RESULT when '2402' then t.SAMPLEID end (必须有end)

    9)mysql: 两个select 出的数据相减:

    (COUNT(distinct(t.SAMPLEID))-
    CONVERT((COUNT(distinct(case t.DETECT_RESULT when '2402' then t.SAMPLEID end))), SIGNED)) AS NEGATIVE
    FROM `view_sims_for_report` t

    10)convert,cast用法

    mysql将varchar转为int

    convert(字段名, SIGNED)

    字符集转换 : CONVERT(xxx USING gb2312)

    类型转换和SQL Server一样,就是类型参数有点不同 : CAST(xxx AS 类型) , CONVERT(xxx,类型)

    可用的类型 
    二进制,同带binary前缀的效果 : BINARY
    字符型,可带参数 : CHAR()
    日期 : DATE
    时间: TIME
    日期时间型 : DATETIME
    浮点数 : DECIMAL
    整数 : SIGNED
    无符号整数 : UNSIGNED

    11)如果从mysql数据库中取的时候没有乱码,而在Java的List中得到的是乱码的话,那么可能是SQL语句中的有字段不是 varchar的数据类型,这时需要转换convert(字段名, 类型)转换一下,Orcale则用ToChar函数

    12)Orcale的大字段用clob,图像用blob,clob字段在Hibernate的映射文件中用String就可以

    13) mysql,orcale,sqlserver 语句执行顺序

    开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果
    每个子句执行后都会产生一个中间结果 ,供接下来的子句使用,如果不存在某个子句,就跳过。
    14) LPAD函数
    1在oracle的数据库里有个函数 LPAD(String a,int length,String addString).

    2作用:把addString添加到a的左边,length 是返回值的长度。

    3例子

    A : SQL> select lpad('test',8,0) from dual;

    LPAD('TEST',8,0)
    ----------------
    0000test

    B: select lpad('test',8) from dual;

    LPAD('TEST',8)
    --------------
    test 注:不写最后一个参数,函数会默认在返回值左边加一个空格。

    C: SQL> select lpad('test',2,0) from dual;

    LPAD('TEST',2,0)
    ----------------
    te

    D:SQL> select lpad('test',3) from dual;

    LPAD('TEST',3)
    --------------
    tes
    15 Orcale中没有TOP,是通过
    select * from (select * from A order by id desc) where rownum=1
    注:不能直接写 select * from A where rownum=1 order by id desc 因为语句执行的顺序是先where再order by ,如果这样写就无法按id的排序来取第一个了。
    不能写rownum=2或rownum>1这样,因为Orcale 默认必须包含第一条。
    如果非要取第二条的话,可以写成:
    select * from (select id,rownum as row_num from lws_q_bl_result r where r.sample_id = 'B10226072') where row_num=2
    16 Orcale,MySql while循环比较
    Orcale:
     
    while num<10
    loop
    str := to_char(num);
    num := num+1;
    end loop;
     
    也可以:
    for num in 1..10 --这样的缺陷是无法间隔取值
    loop
    str := to_char(num);
    end loop;
    mysql:
    while num<10
    do
    str := to_char(num);
    num := num+1;
    end while;
    16 orcale 生成唯一序列是 select sys.guid() from dual ,mysql是 select uuid() from dual
    17 MySql和Orcale的ID自增
         MySql由于是在数据库中实现ID自增,所以如果想返回插入一条序列的该条ID,只能用如下方法:
       
    Java代码 复制代码 收藏代码
    1. public int insertSign(final SpaceSign sign) throws Exception {   
    2.     try{   
    3.       KeyHolder keyHolder = new GeneratedKeyHolder();     
    4.     final   String sql = "insert into space_sign(userId,userName,nickName,contentText,contentHtml,isPublic,commentCount,userIp,status,insertTime)" +   
    5.                 " values(?,?,?,?,?,?,?,?,?,?)";   
    6.         template.update(new PreparedStatementCreator() {     
    7.                    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {     
    8.                               
    9.                           PreparedStatement ps = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);     
    10.                           ps.setInt(1, sign.getUserId());     
    11.                           ps.setString(2,  sign.getUserName());     
    12.                           ps.setString(3, sign.getNickName());     
    13.                           ps.setString(4, sign.getContentText());     
    14.                           ps.setString(5, sign.getContentHtml());     
    15.                           ps.setInt(6, sign.getIsPublic());     
    16.                           ps.setInt(7,sign.getCommnetCount());     
    17.                           ps.setString(8, sign.getUserIp());     
    18.                           ps.setInt(9,  sign.getStatus());     
    19.                           ps.setTimestamp(10,   new java.sql.Timestamp(sign.getInsertTime().getTime()));     
    20.                           return ps;     
    21.                    }     
    22.                }, keyHolder);     
    23.          
    24.         Long generatedId = keyHolder.getKey().longValue();     
    25.         return generatedId.intValue();   
    26.     } catch (Exception e) {   
    27.         // TODO Auto-generated catch block   
    28.         e.printStackTrace();   
    29.         throw new SQLException("发表签名失败", e);   
    30.     }   
    31.        
    32. }  
    	public int insertSign(final SpaceSign sign) throws Exception {
    		try{
    		  KeyHolder keyHolder = new GeneratedKeyHolder();  
    		final	String sql = "insert into space_sign(userId,userName,nickName,contentText,contentHtml,isPublic,commentCount,userIp,status,insertTime)" +
    				    " values(?,?,?,?,?,?,?,?,?,?)";
    		    template.update(new PreparedStatementCreator() {  
    			           public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {  
    			                   
    			                  PreparedStatement ps = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);  
    			                  ps.setInt(1, sign.getUserId());  
    			                  ps.setString(2,  sign.getUserName());  
    			                  ps.setString(3, sign.getNickName());  
    			                  ps.setString(4, sign.getContentText());  
    			                  ps.setString(5, sign.getContentHtml());  
    			                  ps.setInt(6, sign.getIsPublic());  
    			                  ps.setInt(7,sign.getCommnetCount());  
    			                  ps.setString(8, sign.getUserIp());  
    			                  ps.setInt(9,  sign.getStatus());  
    			                  ps.setTimestamp(10,   new java.sql.Timestamp(sign.getInsertTime().getTime()));  
    			                  return ps;  
    			           }  
    			       }, keyHolder);  
    		  
    		    Long generatedId = keyHolder.getKey().longValue();  
    		    return generatedId.intValue();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			throw new SQLException("发表签名失败", e);
    		}
    		
    	}
        由于Orcale的ID是在插入该条数据之前就通过select SEQ_BLOG_ID.nextval from dual 获得的,所以直接返回既可。ps:SEQ_BLOG_ID为在数据库中设置的sequence。
  • 相关阅读:
    阿里DatatX mysql8往 Elasticsearch 7 插入时间数据 时区引发的问题
    通俗易懂 k8s (3):kubernetes 服务的注册与发现
    ReplicaSet 和 ReplicationController 的区别
    使用Go module导入本地包
    k8s之statefulset控制器
    终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩
    Atitit drmmr outline org stat vb u33.docx Atitit drmmr outline org stat v0 taf.docx Atitit drmmr out
    Atitit all diary index va u33 #alldiary.docx Atitit alldiaryindex v1 t717 目录 1. Fix 1 2. Diary deta
    Atitit path query 路径查询语言 数据检索语言 目录 1.1. List map >> spel 1 1.2. Html数据 》》Css选择符 1 1.3. Json 》map》
    Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  • 原文地址:https://www.cnblogs.com/future2012lg/p/2938723.html
Copyright © 2011-2022 走看看