MySQL没有RowNum,那我该怎么按,Java技术类校招面试题汇总

这张表有20w行数据,其中第8w条 - 15w条是多余的,也不能重新导,因为可能其他公司的同事已经在处理了,这时该怎么删除多余数据呢?

为了不被领导邀请爬山,他找到我求救。

小刘:“哈哥,救命救命,这MySQL没有自增主键,我咋删除第[8w,15w]的数据啊?”

陈哈哈:“啊?MySQL又没有rowNum,那咋搞啊?我不会,不会~”

小刘:“一顿串儿!哈哥快来”

陈哈哈:“哎呀,我这活儿急得一匹,下午再说吧。”

小刘:“今儿晚上,望京小腰,不请我是你儿子!”

陈哈哈:“什么串儿串儿的,都是兄弟,说的就跟我怕你吹牛B不请似的,来吧来吧,一起看看咋处理。”

小刘:“……”

其实,在MySQL中确实没有rownum伪列,但我们可以自己写函数定义。线上数据不方便,下面我拿一些测试数据来举例吧(15条),如下


mysql> select * from t_student;

+------------+-----+-----+-------+----------+-----------+

| NAME       | SEX | AGE | CLASS | GRADE    | HOBBY     |

+------------+-----+-----+-------+----------+-----------+

| 陈哈哈     | 男  |  15 | 18班  | 9年级1   | 上网      |

| 扈亚鹏     | 男  |  15 | 18班  | 9年级1   | 美食      |

| 徐立楠     | 女  |  14 | 18班  | 9年级1   | 阅读      |

| 陈子凝     | 女  |  15 | 18班  | 9年级1   | 看电影    |

| 刘晓莉     | 女  |  14 | 18班  | 9年级1   | 金希澈    |

| 陈哈哈1    | 男  |  15 | 18班  | 9年级2   | 上网      |

| 扈亚鹏1    | 男  |  15 | 18班  | 9年级2   | 美食      |

| 徐立楠1    | 女  |  14 | 18班  | 9年级2   | 阅读      |

| 陈子凝1    | 女  |  15 | 18班  | 9年级2   | 看电影    |

| 刘晓莉1    | 女  |  14 | 18班  | 9年级1   | 金希澈    |

| 陈哈哈2    | 男  |  15 | 18班  | 9年级2   | 上网      |

| 扈亚鹏2    | 男  |  15 | 18班  | 9年级2   | 美食      |

| 徐立楠2    | 女  |  14 | 18班  | 9年级2   | 阅读      |

| 陈子凝2    | 女  |  15 | 18班  | 9年级2   | 看电影    |

| 刘晓莉2    | 女  |  14 | 18班  | 9年级1   | 金希澈    |

+------------+-----+-----+-------+----------+-----------+

15 rows in set (0.00 sec)

如何查询这些的数据的行值呢?SQL如下:


-- 在没自增主键情况下,查询数据行(rownum),行号

select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE`

 from t_student ,(SELECT @rownum:=0) r; 

查询结果如下:


mysql> select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE` from t_student ,(SELECT @rownum:=0) r;

+--------+------------+-----+-------+----------+

| rownum | NAME       | SEX | CLASS | GRADE    |

+--------+------------+-----+-------+----------+

|      1 | 陈哈哈     | 男  | 18班  | 9年级1   |

|      2 | 扈亚鹏     | 男  | 18班  | 9年级1   |

|      3 | 徐立楠     | 女  | 18班  | 9年级1   |

|      4 | 陈子凝     | 女  | 18班  | 9年级1   |

|      5 | 刘晓莉     | 女  | 18班  | 9年级1   |

|      6 | 陈哈哈1    | 男  | 18班  | 9年级2   |

|      7 | 扈亚鹏1    | 男  | 18班  | 9年级2   |

|      8 | 徐立楠1    | 女  | 18班  | 9年级2   |

|      9 | 陈子凝1    | 女  | 18班  | 9年级2   |

|     10 | 刘晓莉1    | 女  | 18班  | 9年级1   |

|     11 | 陈哈哈2    | 男  | 18班  | 9年级2   |

|     12 | 扈亚鹏2    | 男  | 18班  | 9年级2   |

|     13 | 徐立楠2    | 女  | 18班  | 9年级2   |

|     14 | 陈子凝2    | 女  | 18班  | 9年级2   |

|     15 | 刘晓莉2    | 女  | 18班  | 9年级1   |

+--------+------------+-----+-------+----------+

15 rows in set (0.00 sec) 

可以看到查询到的行号,那我该怎么通过上面查到的rownum行来进行删除呢?其实这个想法是行不通的,因为上面的rownum就是一个展示值,是没有其他实际效果的。

但是,我可以通过找到表中的唯一列(如UUID、MD5、包名、身份证ID),通过范围条件查询rownum,从而找到需要删除的唯一键集合,比如在这张表中存在唯一键是“NAME”,那么我通过查到第[6,10]行数据的唯一键“NAME”,从而通过子查询来删除,(这里是把人名后有“1”的删除)。SQL如下:

我们先看一下第[6,10]行数据,SQL如下:


-- 查询第6到第10行数据。

SELECT * from (select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE` from 

  t_student ,(SELECT @rownum:=0) r) t where t.rownum between 6 and 10;

返回结果:


mysql> SELECT * from (select @rownum:=@rownum+1 AS rownum,`NAME`,`SEX`,`CLASS`,`GRADE` from t_student ,(SELECT @rownum:=0) r) t

    ->  where t.rownum between 6 and 10;

+--------+------------+-----+-------+----------+

| rownum | NAME       | SEX | CLASS | GRADE    |

+--------+------------+-----+-------+----------+

|      6 | 陈哈哈1    | 男  | 18班  | 9年级2   |

|      7 | 扈亚鹏1    | 男  | 18班  | 9年级2   |

|      8 | 徐立楠1    | 女  | 18班  | 9年级2   |

|      9 | 陈子凝1    | 女  | 18班  | 9年级2   |

|     10 | 刘晓莉1    | 女  | 18班  | 9年级1   |


### 最后

**如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!**

**[资料免费领取方式:点击这里](https://gitee.com/vip204888/java-p7)**

![](https://img-blog.csdnimg.cn/img_convert/daf8cfc84fdb5227b0b1618c391814ae.png)

 18班  | 9年级2   |

|     10 | 刘晓莉1    | 女  | 18班  | 9年级1   |


### 最后

**如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!**

**[资料免费领取方式:点击这里](https://gitee.com/vip204888/java-p7)**

[外链图片转存中...(img-oXvsYegx-1628416360127)]

![](https://img-blog.csdnimg.cn/img_convert/6e6463247e74e06477dd5eb773261f4b.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值