精华内容
下载资源
问答
  • Mysql语句编写循环

    万次阅读 2018-08-22 10:48:50
    Mysql语句编写循环 1.单层循环 2.双层循环

    0 总结

    Get to the points first. The article comes from LawsonAbs!
    • updata on 20200506:修改相关格式;在单层循环中,增加test的创表语句

    1.单层循环

    • 先定义测试表
    create table test(location_id int ,location_name varchar(10));
    
    • 再编写存储过程,其中涉及到循环的使用。我们欲通过这个存储过程,来达到往表中插入数据的效果。
    drop procedure if exists test_loop;
    delimiter //
    create procedure test_loop()
    begin
    	declare i int default 1;
    	while i<10
    	do
    		insert into test values(i,concat('hangzhou',i));
    		set i=i+1;
    	end while;
    	commit;
    end //
    delimiter ;
    
    • 接着检验输出
    mysql> select * from test;
    Empty set (0.00 sec)
    
    mysql> call test_loop();
    Query OK, 0 rows affected (0.35 sec)
    
    mysql> select * from test;
    +-------------+---------------+
    | location_id | location_name |
    +-------------+---------------+
    |           1 | hangzhou1     |
    |           2 | hangzhou2     |
    |           3 | hangzhou3     |
    |           4 | hangzhou4     |
    |           5 | hangzhou5     |
    |           6 | hangzhou6     |
    |           7 | hangzhou7     |
    |           8 | hangzhou8     |
    |           9 | hangzhou9     |
    +-------------+---------------+
    9 rows in set (0.00 sec)
    

    发现存储过程调用成功,即循环调用成功。

    2.双层循环

    • 创建表
    CREATE TABLE `dim_time` (
      `TimeKey` int(11) NOT NULL,
      `Hour` tinyint(4) DEFAULT NULL,
      `Minute` tinyint(4) DEFAULT NULL,
      PRIMARY KEY (`TimeKey`)
    )
    
    • 编写存储过程
    drop procedure if exists insertValueIntoDimTime;
    delimiter //
    create procedure insertValueIntoDimTime()
    begin
    	declare hour int default 0;
    	declare min int default 0;	
    		while hour < 24
    		do
    			while min < 60
    			do
    				insert into dim_time values(hour*100+min,hour,min);
    				set min=min+1;
    			end while;
    			set min = 0;
    			set hour = hour+1;
    		end while;
    end //
    delimiter ;
    
    • 运行存储过程
    mysql> call insertValueIntoDimTime;
    Query OK, 1 row affected (22.12 sec)
    
    • 验证输出
    mysql> select count(*) from dim_time;
    +----------+
    | count(*) |
    +----------+
    |     1440 |
    +----------+
    1 row in set (0.02 sec)
    
    mysql> select * from dim_time order by timekey limit 10;
    +---------+------+--------+
    | TimeKey | Hour | Minute |
    +---------+------+--------+
    |       0 |    0 |      0 |
    |       1 |    0 |      1 |
    |       2 |    0 |      2 |
    |       3 |    0 |      3 |
    |       4 |    0 |      4 |
    |       5 |    0 |      5 |
    |       6 |    0 |      6 |
    |       7 |    0 |      7 |
    |       8 |    0 |      8 |
    |       9 |    0 |      9 |
    +---------+------+--------+
    10 rows in set (0.00 sec)
    
    mysql> select * from dim_time order by timekey desc limit 10;
    +---------+------+--------+
    | TimeKey | Hour | Minute |
    +---------+------+--------+
    |    2359 |   23 |     59 |
    |    2358 |   23 |     58 |
    |    2357 |   23 |     57 |
    |    2356 |   23 |     56 |
    |    2355 |   23 |     55 |
    |    2354 |   23 |     54 |
    |    2353 |   23 |     53 |
    |    2352 |   23 |     52 |
    |    2351 |   23 |     51 |
    |    2350 |   23 |     50 |
    +---------+------+--------+
    10 rows in set (0.00 sec)
    

    3. 日期循环

    3.1 需求

    今天需要从订单库中找出过去六个月的订单中是桌面机的订单,所以需要写一个简单的日期循环,用于读取数据。

    3.2实现

    drop procedure if exists date_loop;
    
    delimiter //
    create procedure date_loop()
    begin
        declare i int default 1;
    	declare start_date date ;  -- 当前日子减去6个月
    	declare end_date date ; -- 当前天
    	
    	select date_sub(current_date(),interval 6 month) into start_date;
    	select current_date() into end_date;
    	
        while start_date < end_date
        do
            select start_date;
            set start_date = date_add(start_date,interval 1 day);
        end while;
        commit;
    end //
    delimiter ;
    

    4.参考文章

    • https://blog.csdn.net/luogan129/article/details/73691286
    展开全文
  • mysql 语句关联查询问题 mysql 语句关联查询问题mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题
  • mysql语句添加索引

    万次阅读 2019-01-08 15:33:03
    mysql语句添加索引 创建或添加索引可以使用如下语句。 一、使用ALTER TABLE语句创建索引。 语法如下: 1.PRIMARY KEY(主键索引)  mysql&gt;ALTER TABLE `table_name` ADD PRIMARY KEY ( `column.....

    参考:

    mysql索引学习----2----创建索引、修改索引、删除索引的命令语句

    mysql语句添加索引

    创建或添加索引可以使用如下语句。

    一、使用ALTER TABLE语句创建索引。

    语法如下:

    1.PRIMARY  KEY(主键索引)
            mysql>ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY (  `column`  ) 
    2.UNIQUE(唯一索引)
            mysql>ALTER  TABLE  `table_name`  ADD  UNIQUE (`column` ) 
    3.INDEX(普通索引)
            mysql>ALTER  TABLE  `table_name`  ADD  INDEX index_name (  `column`  )
    4.FULLTEXT(全文索引)
            mysql>ALTER  TABLE  `table_name`  ADD  FULLTEXT ( `column` )
    5.多列索引
            mysql>ALTER  TABLE  `table_name`  ADD  INDEX index_name (  `column1`,  `column2`,  `column3`  )

     

    二、使用CREATE INDEX语句对表增加索引。

    能够增加普通索引和UNIQUE索引两种。其格式如下:
    create index index_name on table_name (column_list) ;
    create unique index index_name on table_name (column_list) ;
    说明:table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

     

    三、删除索引。
    删除索引可以使用ALTER TABLE或DROP INDEX语句来实现。DROP INDEX可以在ALTER TABLE内部作为一条语句处理,其格式如下:
    drop index index_name on table_name ;
    alter table table_name drop index index_name ;
    alter table table_name drop primary key ;
    其中,在前面的两条语句中,都删除了table_name中的索引index_name。而在最后一条语句中,只在删除PRIMARY KEY索引中使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
    如果从表中删除某列,则索引会受影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

    展开全文
  • 数据库----如何将oracle语句转换成mysql语句

    万次阅读 多人点赞 2019-08-18 11:03:36
      最近由于公司业务上需要,需要将原项目的数据库由oracle转换成mysql,转换的时候我们通常需要先将数据库转成mysql,然后再去为项目添加mysql语句,至于如何将oracle数据库转换成mysql数据库且保证数据库数据的...

    前言

      最近由于公司业务上需要,需要将原项目的数据库由oracle转换成mysql,转换的时候我们通常需要先将数据库转成mysql,然后再去为项目添加mysql语句,至于如何将oracle数据库转换成mysql数据库且保证数据库数据的正确性,可以参考我的上一篇文章,这篇文章的主要作用就是来讲一下oracle语句中用到的那些函数,在mysql中应该怎么使用。


    文章地址:

      将Oracle数据库转换成mysql数据库


    正文

      首先我们可以先来说一下oracle和mysql的区别,他们的区别就是我们改动的sql的原因。至于其他的区别我就不在这里多说了,主要是讲函数的区别,以及对应情况的处理.
      Oracle最大的特点就是sql的灵活性,它具有强大的分组查询功能,而对应的函数在mysql中是没有的,那么我们如果想要实现同样的功能,就需要通过其他的方法来实现同样的功能。
    2020.11.13补充:目前mysql8.0以上版本已经支持分组排序函数,对应的ron_numer() over 的使用方式,在mysql中也已经支持。具体可以翻阅资料,如果读者版本较高的话,可以在mysql中依旧使用此函数

    简单函数之间的转换

      快速查询:
      column表示字段名

    函数作用 oracle mysql
    日期转字符串 to_char date_format
    字符串转日期 to_date str_to_date
    判断空值 nvl IFNULL
    转换数字 to_number cast
    条件判断 decode case then或if else
    时间串拼接 numtodsinterval contact
    decimal的转换 to_char cast(column as char)
    当前时间 sysdate now()
    substring区别 开始位置可以为0 开始位置不能为0
    时间的计算 可以直接相减(默认单位:天) 使用 TIMESTAMPDIFF(需指定默认单位)
    分组排序 row number over 使用变量来实现

    具体实例:

    一、当前时间–(sysdate)

      oracle语句:

    		select sysdate from dual
    

      mysql语句:

    		select now()
    
    二、日期转字符串–(to_char)

      oracle语句:

    		select  to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
    

      mysql语句:

    		select DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
    
    三、字符串转日期–(to_date)

      oracle语句:

    		select to_date('2019-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss') from dual
    

      mysql语句:

    		select STR_TO_DATE('2019-01-01 08:00:00',"%Y-%m-%d %H:%i:%s")
    
    四、判断空值–(nvl)

      oracle语句:

    		NVL(a,b)
    

      mysql语句:

    		IFNULL(a,b)
    
    五、转换数字–(to_number)

      oracle语句:

    		to_number(column)
    

      mysql语句:

    	转换成整形:
    		cast(column as unsigned int)
    	转换成浮点型:
    		cast(column as decimal(10,2))
    
    六、条件判断–(decode)

      oracle语句:

    		select decode(mod(quantity,7),0,'A',1,'B','C') as qtype from biz_order
    

      mysql语句:

    	使用case whenSelect case mod(quantity,7) when 0 then 'A'
    		 	when 1 then 'B'
    			else 'C'
    			end as qtype
    		from biz_order
    
    	使用if else:
    		不推荐使用if-else,因为我写不出来,建议使用case when,咳咳咳咳咳-----,
    
    七、时间串拼接–(numtodsinterval)

      oracle语句:

    		select a.*,
        		case when length(ltrim(substr(numtodsinterval(ceil(a.reportperiod), 'second'),2,15),'0')) = 6
       			then '0天' || substr(numtodsinterval(ceil(a.reportperiod), 'second'),12,8)
       			when a.reportperiod is null
        		then ''
       			else ltrim(substr(numtodsinterval(ceil(a.reportperiod), 'second'),2,9),'0') || '天' ||
        		substr(numtodsinterval(ceil(a.reportperiod), 'second'),12,8)
        		end as ReportWaitTime 
       		from biz_dev_fault_repair_result a
    

      mysql语句:

    	SELECT
            a.*,
            CONCAT(
            FLOOR( a.reportperiod / 86400 ),
            '天',
            LPAD( FLOOR( a.reportperiod % 86400 / 3600 ), 2, 0 ),
            ':',
            LPAD( FLOOR( a.reportperiod % 86400 % 3600 / 60 ), 2, 0 ),
            ':',
            LPAD( CEIL( a.reportperiod % 86400 % 3600 % 60 ), 2, 0 )
            ) AS ReportWaitTime 
         FROM biz_dev_fault_repair_result a
    
    八、decimal的转换

      oracle语句:

    		select to_char(quantity) from biz_order
    

      mysql语句:

    	需要注意的是,在mysql中转换时不能使用as varchar//SELECT cast(quantity as VARCHAR) from biz_order  ----这是错误的语法
    		SELECT cast(quantity as CHAR) from biz_order ----这是正确的语法
    
    九、substring的区别

      oracle语句:

    		select substr('1234567890',0,2) from dual	//返回结果12
    

      mysql语句:

    		select substr('1234567890',1,2)		//返回结果12,即相同返回结果
    
    十、时间的计算

      oracle语句:

    		select maintaintime,createtime,maintaintime-createtime t from biz_order
    		//返回结果以天为单位
    

      mysql语句:

    		select maintaintime,createtime,TIMESTAMPDIFF(second,maintaintime,createtime) t from biz_order 
    		//返回结果以秒为单位,直接相减默认结果说实话我没看懂是以什么为单位,它是每分钟为100,秒数作为十分位和百分位,逢60就加100
    

      返回结果以秒为单位,直接相减默认结果说实话我没看懂是以什么为单位,它是每分钟为100,秒数作为十分位和百分位,逢60就加100

    十一、分组排序–(row_number() over)

      oracle语句:

    		SELECT a.*,
    		ROW_NUMBER() OVER(partition by a.orderchildId order by a.CheckEndTime desc) as rum_num
    		FROM biz_qa_check_first a
    

      mysql语句:

    		select @rownum:=@rownum+1 rownum,a.*, 
              if(@orderchildId=a.orderchildId,@rank:=@rank+1,@rank:=1) as rum_num,
               @orderchildId:=a.orderchildId
     		  from(SELECT * from biz_qa_check_first order by orderchildId,CheckEndTimedesc)a,
     		(select @rownum:=0,@orderchildId:=null,@rank:=0)b
    

    补充知识说明:


      1.在mysql中如何获取当前周

      oracle语句:

    		select to_char(sysdate,'iw') from dual
    

      返回结果:
    在这里插入图片描述
    这表示2019-08-18是该年的第33个周
      mysql语句:

    		SELECT DATE_FORMAT(now(),'%u')
    		//大写U与小写u不一样
    

      返回结果:
    在这里插入图片描述
       下面附上mysql中日期标识符的作用,

    		%M 月名字(January……December) 
    		%W 星期名字(Sunday……Saturday) 
    		%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) 
    		%Y 年, 数字, 4 位   www.2cto.com  
    		%y 年, 数字, 2 位 
    		%a 缩写的星期名字(Sun……Sat) 
    		%d 月份中的天数, 数字(00……31) 
    		%e 月份中的天数, 数字(0……31) 
    		%m 月, 数字(01……12) 
    		%c 月, 数字(1……12) 
    		%b 缩写的月份名字(Jan……Dec) 
    		%j 一年中的天数(001……366) 
    		%H 小时(00……23) 
    		%k 小时(0……23) 
    		%h 小时(01……12) 
    		%I 小时(01……12) 
    		%l 小时(1……12) 
    		%i 分钟, 数字(00……59) 
    		%r 时间,12 小时(hh:mm:ss [AP]M) 
    		%T 时间,24 小时(hh:mm:ss) 
    		%S 秒(00……59) 
    		%s 秒(00……59) 
    		%p AM或PM 
    		%w 一个星期中的天数(0=Sunday ……6=Saturday ) 
    		%U 星期(0……52), 这里星期天是星期的第一天 
    		%u 星期(0……52), 这里星期一是星期的第一天 
    		%% 一个文字“%”。
    

      2.mysql实现row number over的原理

      在oracle中,ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)。
      然后在mysql中没有对应的函数,所以我们选择使用变量来实现,那么具体的实现过程是什么?下面一起来看一下
      oracl语句:

    		SELECT a.*,
    		ROW_NUMBER() OVER(partition by a.orderchildId order by a.CheckEndTime desc) as rum_num
    		FROM biz_qa_check_first a
    

      mysql语句:

    		select @rownum:=@rownum+1 rownum,a.*, 
              if(@orderchildId=a.orderchildId,@rank:=@rank+1,@rank:=1) as rum_num,
               @orderchildId:=a.orderchildId
     		  from(SELECT * from biz_qa_check_first order by orderchildId,CheckEndTimedesc)a,
     		(select @rownum:=0,@orderchildId:=null,@rank:=0)b
    

    假如我们的数据库对应的数据是下表

    orderchildid
    10
    10
    10
    11
    12

      mysqlsql运行步骤:
        查询第一行,此时的变量值

    @rownum @orderchildId @rank
    0 null 0

        判断条件执行此时orderchilidid不相等,将@rank=1,将@orderchilidid=10
        查询第二行,此时的变量值:

    @rownum @orderchildId @rank
    1 10 1

        判断条件执行此时orderchilidid相等,将@rank=@rank+1,将@orderchilidid=10
        查询第三行,此时的变量值:

    @rownum @orderchildId @rank
    2 10 2

        判断条件执行此时orderchilidid相等,将@rank=@rank+1,将@orderchilidid=10
        查询第四行,此时的变量值:

    @rownum @orderchildId @rank
    3 10 3

        判断条件执行此时orderchilidid不相等,将@rank=1,将@orderchilidid=11
        查询第五行,此时的变量值:

    @rownum @orderchildId @rank
    4 11 1

        判断条件执行此时orderchilidid不相等,将@rank=1,将@orderchilidid=12
        对于以上步骤最终的结果对应的表如下

    orderchildid @rank
    10 1
    10 2
    10 3
    11 1
    12 1

      那么在我们做完查询之后,只需要指定查询出@rank=1的就是实现了以orderchildid分组,由于我们设置了别名,所以我们的筛选条件可以写为 where rum_num=1,这样我们就实现了分组,而在分组之前,我们的嵌套查询已经实现了排序功能。


      3.说一下mysql中表的别名问题

      比如说这条sql吧

    		select *from (
                select distinct a.*,e.name workshopname,f.name rolename,h.name shiftname, m.row_num 
                from  biz_base_person_group a 
                left join biz_base_person_group_asso b on a.id=b.GroupId
                left join biz_base_person_group_dev d on a.id = d.groupid
                left join biz_base_workshop e on a.workshopid = e.id
                left join sys_role f on a.roleid = f.id
                left join biz_base_shift g on a.classcode = g.code
                left join v_sys_dict h on g.code = h.code and h.pCode = 'ShiftType' and h.type = 'zh_CN' 
    			left join (select a.id ,if(@id=a.id,@rank:=@rank+1,@rank:=1) as row_num,
                @id:=a.id
    			from (SELECT *from biz_base_person_group order by id) a) m on a.id = m.id
    			) a
           		where a.row_num = 1
           order by maintaintime desc
    

      首先我们看到,我们将内部的查询结果作为一个表,但是其实我们可以看一下,通常我们写sql的时候,写
    select *from table where column=’’
      这里我不为表名别名也应该可以,但是在mysql中,不为表名别名会报这个错误,但是在oracle中就可以,这个希望大家以后注意
    在这里插入图片描述


      4.使用mysql实现rownum

       首先看一下oracle的语句:

       	select rownum rn ,a.* from
      		   (
      		   select a.*,b.name typename,c.value from sys_res_i18n a
       			left join sys_dict b on a.type = b.code and b.pcode = 'I18nType'
      			left join sys_res_i18n_type c on a.id = c.pid and c.type = 'zh_CN'
      			order by a.id desc
      			)  a
    

      返回的结果:
    在这里插入图片描述
      我第一次写出的mysql语句,是这样的

    	select @rownum:=@rownum+1 rn,a.* from 
    	(
    		select a.*,b.name typename,c.value from sys_res_i18n a
    		left join sys_dict b on a.type = b.code and b.pcode = 'I18nType'
    		left join sys_res_i18n_type c on a.id = c.pid and c.type = 'zh_CN'
    		order by a.id desc
    	) a,
    	(SELECT @rownum:=0) b
    

      返回的结果相同,但是使用我们公司框架的时候会出现转换问题,在页面的数据会显示为
    在这里插入图片描述
      这对客户来说就很尴尬,不知道出现这问题的原因是什么,debug之后发现通过反射调用方法之后,返回的就带有.0,最后我将sql语句改了一下,写成下面的形式,完美解决问题.

    		select cast(@rownum:=@rownum+1 as char) rn,a.* from 
    		(
    		select a.*,b.name typename,c.value from sys_res_i18n a
    		left join sys_dict b on a.type = b.code and b.pcode = 'I18nType'
    		left join sys_res_i18n_type c on a.id = c.pid and c.type = 'zh_CN'
    		order by a.id desc
    		) a,
    		(SELECT @rownum:=0) b
    

      补充: 并不是所有的rownum都需要这么来实现,假如前台不需要rownum的值,你可以看一下具体的业务,很可能他的sql只是想取出第一条数据,在mysql中你可以直接使用limit关键字就能拿到数据。


      5.使用mysql执行语句块

      在Oracle中执行语句块应该以下面的形式:

      begin
          insert into sys_sequence(ObjectName, Id, CreateTime)
                  select '${tableobjname}', 1, sysdate from dual where not exists (
                       select 1 from sys_sequence where ObjectName = '${tableobjname}') ;
          update sys_sequence set id = (select nvl(max(id), 1) from ${tableobjname}) where ObjectName = '${tableobjname}';
      end;       
    

    在mysql中执行语句块,不需要添加begin和end

            insert into sys_sequence(ObjectName, Id, CreateTime)
                    select '${tableobjname}', 1, sysdate from dual where not exists (
                         select 1 from sys_sequence where ObjectName = '${tableobjname}') ;
            update sys_sequence set id = (select nvl(max(id), 1) from ${tableobjname}) where ObjectName = '${tableobjname}';    
    

      6.自增ID

      MySQL不存在sequence,所以在进行数据插入时,需要自增的列需要特殊处理。
      oracle:

       select seq_id.nextval from dual
    

    MySQL:更改表中需要自增的列,如id,更改语句如下:

        alter table biz_order modify id int auto_increment primary key
    

      在mysql中执行插入时,就不用列出id。

      7.使用mysql实现merge into

    oracle语句:

        merge into biz_url_request_para a
    		    using (select #{clientid} as clientid, #{url} as url, #{para} as para from dual) b
    		    on (a.clientid = b.clientid and a.url = b.url and a.clientid = #{clientid}) 
    		    when matched then
    		       update set a.para = b.para, timestamp = to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
    		    when not matched then
    		       insert values(#{clientid}, #{url}, #{para}, to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'))
    

    mysql

        insert into biz_url_request_para
            (
                clientid,
                url,
                para,
                timestamp
            )
            values (
                #{clientid},
                #{url},
                #{para},
                date_format(now(),'%Y-%m-%d %H:%i:%s')
            )
            on duplicate key update para = values(para), timestamp = values(timestamp)
    
      8.mysql实现connect by

      首先,关于connect by这个用法我也不是很清楚,具体的大家可以参考这篇文章,但是我这里举的例子,因为功能业务的需求,不是像下面文章一样的例子。在mysql中,这里这处业务的实现通过substring_index函数来实现,同样也有一篇推荐文章。下面我会解释我所要讲的内容。


    文章地址:
      (一)connect by 和level 的用法
      (一)字符串截取之substring_index


      首先我们先看一下数据。
      我们数据库中的数据是这个样子
    在这里插入图片描述
      我需要的结果就是以’,’为分割线,将所有的结果都查询出来,结果就是这个样子的。
    在这里插入图片描述
      我们这里就要使用substring_index函数,但是我们在使用这个函数的时候,需要指定count的值,但是我们不知道数据库中有多少个数据,所以我们不能写一个明确的值,这个时候,我们需要另外一张表来协助,这张表的值是下面的形式
    在这里插入图片描述
      就是从0开始增长,那么我们写出来的sql语句为

    SELECT a.id,SUBSTRING_INDEX(SUBSTRING_INDEX(a.exceptiontype,',',b.Id+1),',',-1) as name  
    	from biz_mold_maintain_result a 
    	left join v_biz_seq_id b 
    	on b.Id < (LENGTH(a.exceptiontype)-LENGTH(REPLACE(a.exceptiontype,',',''))+1) 
    where a.id=1 
    

      首先我们来看on条件的意思,前面的length结果是10,后面的length里面嵌套了一个replace,是将字段中的‘,’替换为空,结果是8,那么这是什么意思?通过这个结果,我们可以知道的是该字段中有几个需要切割的值,前面我已经将字段中的值贴出了,我们可以看到,一共有三个值。那么我们这里计算出来的结果也是3,但是由于我们协助表从0开始,所以我们条件选择<3。
      这里使用了两次substring_index来切割字符串,第一次的时候,b.id=0,那么内部的substring_index切出来的字符串为‘HMFQ’,外部的从右往左切割拿到的字符串同样是它本身,因为结果只有一个。
      第二次执行的时候,内部的substring_index切出来的字符串切出的结果是’HMFQ,XC’,外部的从右往左切,得一个,那么它拿到的就是’XC’。
      第二次执行的时候,内部的substring_index切出来的字符串切出的结果是’HMFQ,XC,AS’,外部的从右往左切,得一个,那么它拿到的就是’AS’。
      我们就是通过这种方式来实现了递归查询。

      9.mysql实现sum over(partition by column)

    还是先拿出oracle语句以及查询结果:

      		select distinct a.scrapreason,
            sum(a.scrapcount) over(partition by a.itemid) as scrapcount,
            sum(a.scrapcount) over(partition by a.factoryid) as count 
            from da_qa_scrap_daily a
            left join biz_base_workshop b on a.workshop = b.code and a.factoryid = b.factoryid
            where 1=1
            and a.checktype = 'QaCheckFirst'
    

      查询出的结果:
    在这里插入图片描述
      解释一下oracle语句的作用,他是将数据以项目id即itemid分组计算出每个项目的报废产品数量,又以工厂id,即factoryid分组计算出总项目的报废数量,但是却是以itemid分组后的结果来显示数据。在mysql中,我没有想到很好的实现方法,就把两个sum over拆分成了两张表,第一张以itemid分组计算出报废产品数量,第二张以工厂id分组计算出全部产品报废数量,然后通过其中一个字段来进行左连接,因为我们都是从同一张表中拿的数据,一定可以找到这个字段。最后写成的mysql语句如下:

    			select distinct
                a.*,b.count count
                from
                (
                    select a.*,b.name workshopname,b.id workshopid ,sum(a.scrapcount) itemscrapcount from
                    da_qa_scrap_daily a
                    left join biz_base_workshop b on a.workshop = b.code and a.factoryid = b.factoryid
                    where 1=1 and a.checktype = 'qacheckfirst'
                    group by a.itemid
                ) a
                left join
                (
                    select a.*,sum(a.scrapcount) count from da_qa_scrap_daily a
                    left join biz_base_workshop b on a.workshop = b.code and a.factoryid = b.factoryid
                    where 1=1 and a.checktype = 'qacheckfirst'
                    group by a.factoryid
                ) b on a.factoryid=b.factoryid
    

      如果你有更好的实现方法,欢迎在下面评论留言或者私信我。


      由于写的都是在转换过程中遇到的一些函数问题,所以整理了一下,当然也有未解决的问题,比如oracle中的connect by函数的实现,我在网上看的教程就是通过自己创建存储过程来实现同样的效果,这个就涉及到我的知识盲区了,如果我弄懂了之后会在这里补充.

    总结

      在这里和大家说一下转换之中的感想吧,其实在转换的时候我们大可不必担心,只要自己慢慢来,先明白原先sql的作用的,包括从哪张表的查询,查询了什么字段。在你转换的过程中,一步步的分解,先解决嵌套查询中的转换工作,在看外部查询有没有需要转换的内容,大部分的函数mysql和oracle中还是相同的,比如一些聚合函数的使用,这都不需要你更改。转换时要细致。

      如果文章哪里有写的不对的地方,欢迎指出!!!


      咸鱼IT技术交流群:89248062,在这里有一群和你一样有爱、有追求、会生活的朋友! 大家在一起互相支持,共同陪伴,让自己每天都活在丰盛和喜乐中!同时还有庞大的小伙伴团体,在你遇到困扰时给予你及时的帮助,让你从自己的坑洞中快速爬出来,元气满满地重新投入到生活中!

    展开全文
  • MySQL语句分类

    万次阅读 多人点赞 2020-06-08 00:43:42
    文章目录数据定义语言DDL(Data Definition Language)数据查询语言DQL(Data Query ...如大家所知SQL语句被分为四大类: 数据定义语言DDL 数据查询语言DQL 数据操纵语言DML 数据控制功能DCL 事务控制语言TCL

    如大家所知SQL语句被分为五大类:

    • 数据定义语言DDL

    • 数据查询语言DQL

    • 数据操纵语言DML

    • 数据控制功能DCL

    • 事务控制语言TCL

    相信大多数人都对SQL有一定的了解,这里只对分类做一些简单介绍,方便理解

    数据定义语言DDL(Data Definition Language)

    CREATE,DROP,ALTER

    主要为创建、修改、删除数据库的逻辑结构,其中包括表结构,视图和索引等。

    创建、删除数据库:CREATE DATABASE; DROP DATABASE

    创建、修改、重命名、删除表:CREATE TABLE; ALTER TABLE; RENAME TABLE; DROP TABLE;

    创建和删除索引:CREATE INDEX; DROP INDEX

    数据查询语言DQL(Data Query Language)

    SELECT

    用于数据库中数据的检索查询。各种简单查询,连接查询等都属于DQL。

    数据操纵语言DML(Data Manipulation Language)

    INSERT,UPDATE,DELETE

    主要用于数据库中数据的修改,包括添加、删除、修改等

    插入数据到一个表中:INSERT语句

    更新表中已有的数据:UPDATE语句

    删除表中的数据:DELETE语句

    数据控制语言DCL(Data Control Language)

    GRANT,REVOKE,COMMIT,ROLLBACK

    主要为数据库访问权限控制,给用户授予访问权限:GRANT语句,取消授权:REVOKE

    事务控制语言TCL(Transaction Control Language)

    BEGIN,SAVEPOINT xxx,ROLLBACK,ROLLBACK TO xxx,COMMIT

    用于提交事务和回滚事务,维护数据的一致性

    展开全文
  • mysql语句执行超时设置

    万次阅读 2017-09-20 17:42:43
    mysql 语句超时时间设置
  • 查看MySQL语句耗时

    千次阅读 2018-08-21 17:28:26
    在做开发的时候经常需要考虑到耗时的问题,而其中很重要的一点就是SQL查询语句的耗时,今天就做一下笔记如何查看MySQL语句耗时 我用的管理工具是Navicat 打开命令行界面,输入 show profiles; 输入show variables...
  • MYSQL语句错误时,退出当前语句

    千次阅读 多人点赞 2018-05-15 16:14:32
    很多朋友和我一样,在刚开始学习mysql语句时,会因为中英文切换而输错语句,比如下面这个例子,我在输入“男”后,忘记将输入法切换成英文,因此下下一行时出现了错误, 出现错误之后,我们知道在mysql中输入“\c...
  • python中执行mysql语句 方法一: cur.execute('select data from datanum where nodeid = %s and datatype = %s and ctime = %s', (nodeid, datatype, curctime) 方法二: sql = "select ctime from datanum where ...
  • 查看mysql语句运行时间

    千次阅读 2019-04-09 13:48:22
    为了验证select 1 与 select 1 from ...于是总结一下,查看mysql语句运行时间的方法。 方法一: show profiles。 1.Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后。 Query Prof...
  • mysql 语句优化的十个经验

    千次阅读 2018-07-20 22:23:38
    mysql 语句优化的十个经验mysql 语句优化的十个经验 本文算是前一篇 查询语句优化经验总结1的后续,总结了&lt;高性能mysql&gt;中与网上常见的一些优化经验中出现的案例进行总结与勘误.但是要注意本文中...
  • C#调用mysql,使用带参数mysql语句

    千次阅读 2016-03-02 16:39:16
    最近学习中,尝试使用带参数的mysql语句。sqlserver中参数以@para替换,但是Mysql语句中参数需要以?para替换,不支持@para方式。 例如: //mysql string cmd ="select userBackImage from users where userName=?...
  • mysql语句-图书管理系统(增删改查)

    千次阅读 多人点赞 2019-01-18 04:46:19
    文章目录一、相关表二、系统需求三、任务需求1、用mysql语句创建四张表2、用mysql语句插入所有记录3、用mysql语句完成一次借阅4、mysql查询语句5、mysql删除语句 一、相关表 图书管理系统 共涉及四张表: 1、图书...
  • mysql语句可以这样写

    千次阅读 2013-06-20 00:57:27
    今天看到同事写的一条mysql语句,居然没有完全看懂,顿时感觉到差距,在我的思维里,mysql语句只是增、删、查、改,原来还可以这样写。 $sql = "SELECT category_general_table FROM product_category WHERE...
  • 关于配置MySQL语句长度限制的问题

    万次阅读 2017-03-08 10:35:38
    关于配置MySQL语句长度限制的问题 出发点:因一个客户需求,需要一批次往数据表写入5000~10000的数据。 为了功能扩展性,避免客户继续增加写入数据导致原有功能出现bug,上线测试时,特地测试了15000到20000的写入...
  • 通过Mysql语句查询得到mysql安装路径

    万次阅读 2012-08-21 09:13:22
    1、通过Mysql语句得到mysql安装路径: select @@basedir as basePath from dual  2、通过dos命令将库导出到mysql安装目录bin下: C:\Program Files\MySQL\MySQL Server 5.0\bin>...
  • nodeJS 一次执行多条MySQL语句

    千次阅读 2019-04-28 16:16:54
    nodeJS 中,如果希望执行多条 mysql 语句,只用在createConnection 的方法中,设置multipleStatements 属性的值为 true,即可。 var obj = { host: '127.0.0.1', //IP port: 3306, //端口 databas...
  • mysql语句统计每个小时的订单总数sql语句Mysql 查询一天中每半小时记录的数量 sql语句 SELECT HOUR ( e.create_time ) AS HOUR, count( * ) AS Count FROM sale_order e WHERE e.create_time between '2018-...
  • mysql语句中if语句

    千次阅读 2017-02-07 21:07:54
    sql语句中if语句。每个班级有多少人及格,有多少人不及格。SELECT class,sum(IF(score>60,1,0)) JIGE ,sum(IF(score,1,0)) BUJIGE FROM student GROUP BY class ;输出结果:mysql> select * from student order by ...
  • mysql 语句优化

    千次阅读 2018-11-07 10:37:31
    检查代码,寻找到一处sql 语句,然后分析其执行计划。 这段SQL想要得到的结果是appid 为100032下面,打包状态小于3,或者测试状态小于3 且测试状态不等于初始态的结果集。 通过mysql explain 分析其执行计划。...
  • mysql语句 怎么得到三天前的零点时间
  • 将json转换为MySql语句

    千次阅读 2016-08-09 16:21:04
    将json转换为MySql语句例如下面的一段json:{ "Entity": { "Main": { "note_details": true } }, "Condition": { "Equ": { "note_details": { "title": "hello,world." } } } }
  • 检测mySql语句

    千次阅读 2018-06-11 17:30:41
    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。...
  • 巧用sprintf()构造mysql语句

    千次阅读 2016-08-09 19:37:29
    接我上一篇博客,在c中调用mysql,要用到mysql_query()函数来执行mysql语句,在调用这个函数之前,你需要先构造好相应的mysql语句.譬如,要给表格中加入数据,需要用到INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1...
  • 最近写python项目,其中遇到mysql语句带双引号的问题是在头疼,网上关于这类的帖子也很少,遇到到SQL语句死活出问题的情况。由于最初没有将异常打印出来,一直不知道原因。随后,将异常打印出来之后,通过异常信息,...
  • mysql语句判断某一字段是否为空

    千次阅读 2018-10-11 19:09:20
    mysql语句中,null的默认值为‘ ’(空字符串)。 所以, 判断某一字段为空时: 字段名 is not null and length(字段名)=0; 判断某一字段不为空时: 字段名 is not null and length(字段)&gt;0;  ...
  • c++编程中使用mysql语句的案例: 给你个参考例子吧。 #include #include #include #include "mysql.h" MYSQL *mysql; MYSQL_RES *results; MYSQL_ROW record; static char *server_options[] = { "mysql_...
  • 一条mysql语句查询出男女的人数

    万次阅读 2017-08-09 13:54:09
    统计报表中,为了实现一条mysql语句查询出男女的人数,sql语句如下: #年末年龄统计表 select COUNT(case when info.sex = 'm' then sex end ) as maleCount, COUNT(case when info.sex = 'f' then sex end ) as ...
  • 执行mysql语句卡死

    千次阅读 2018-10-17 17:32:47
    问题:执行ALTER TABLE table1 ADD COLUMN name text(10) NOT NULL;... 1、通过mysql日志查找原因,查log语句:select * from INFORMATION_SCHEMA.processlist where COMMAND = "Query"\G  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 192,716
精华内容 77,086
关键字:

mysql语句

mysql 订阅