【SQL】做项目时用到的语句整理(去重/多表关联)

1. 对日期去重(groupby)

需要:新建一张表,对原来表中的某个列(href)进行去重,并按照最新的日期进行排版

适用:如果有一张表,我们重复往里面存入数据,有一些除了日期以外,其他字段一样的内容写进去,这时候,我们需要按照最新日期进行数据去重。

主要的语句:group by

CREATE TABLE Table_new
SELECT href,ID,`status`,max(update_time) AS `update_time` 
#如果是功能性的词,要用引号框住
FROM Table_1
GROUP BY href;

原表:

数据重复,想要迭代最新的数据:在这里插入图片描述
结果:数据总算清干净了在这里插入图片描述

2.两表关联,附表补充主表(Left join):

2.1 需要:

有两个表,其中两个表的数据大量交叉重复,如果我们想要两个表的数据合并,用附表补充主表,构建一个新的表,对两个表的内容做去重,这时候可以用left join 的方法对两个表关联并做去重。而附表的一些字段需要做筛选,且需要其他字段一对一能匹配得上;

例子:在两个表Table_1和Table_2之间,选取Table_1的整个表,且保证选取字段列net是能一 一对应得上的,同时附表Table_2的状态status为1 的部分;

这种情况适用于,主表Table_1可能没有状态值的这一项,需要关联附表Table_2,筛选出状态值为1 的选项,最后为Table_1做补充。

方法:使用左连接LEFT JOIN ,也就是左边表的所有部分;从附表b的数据,用来补充主表a的数据,这里是找某一项是同类项。

CREATE TABLE Table_new
select a.* 
from table_1 a #把这个表命名为a
LEFT JOIN (select * from table_2 where status=1) b  
on a.net=b.net

(实现逻辑如下,蓝色部分为Table_new)在这里插入图片描述

结果:如果在右表中找到了匹配的记录,结果集中会包含左表的记录加上右表匹配的记录

2.2 需要:
如果想要两个表的数据合并,需要附表补充主表,而同时附表需要一些限定条件,这时在上面的基础上加上where的限制条件;

举个例子:

主表Table_1完成的是,已经完成网址项的表,但是因为有时候我们在某一项是空的时候,运行的过程会空的网址的项也运行完了,以此需要筛选出,这部分被误标记status=1且网址为空的表出来。

而这部分空网址在附表Table_2里。现在需要将Table_1的已经完成的部分,加上Table_2中status=1且net=null的数据,组成Table_new。

逻辑图如下:在这里插入图片描述

方法:使用左连接LEFT JOIN ,也就是左边表Table_1的所有部分;而附表有两个限制条件,一个是状态值,一个是筛选 的数据,用来补充主表a的数据,而增加对b的限制。

我们先用其中一个筛选条件——状态值

CREATE TABLE Table_new
select a.* #
from table_1 a #选取第一个表 并命名为a
LEFT JOIN (select * from table_2 where status=1) b 
on a.net=b.net
where b.net is null

#大小写是为了看得顺眼,大家写的时候建议都改成大写呀

两表关联建新表,可以对两个表的数据整合出来,如果想要去重,可以在新表的设计表弄key, 例如上面的例子,给net字段弄个key,作为表的唯一项来去重。

2.3. 倒序筛选

select table_1.* ,table_2. url from table_1
left join table_2  on  table_1.ID=table_2.ID
order by create_time desc limit 20;

以上的做法是, 选取两个表之间,其中某一项的相同的数据。有时候有些表以ID命名关联,但是有些表的一些列在另一个表里,因此需要关联两个表。例如下面的例子是ID 相同,表1的所有部分,以日期倒叙。

3. 选取某字段不重复的数据:

选取表里某一个字段的不重复数据

主要方法:distinct

select distinct Problem from table_1 
where update_time >='2021-01-01 10:00:00'

PS:以上写法为了好看,不区分大小写,大家在测试的时候记得自行修改呀~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值