1.mysql过滤重复数据的方式有几种?

a.使用 DISTINCT 关键词

语法:SELECT DISTINCT 列名称 FROM 表名称

SELECT DISTINCT 列名称 FROM 表名称

(1)两条记录或者多条记录的每一个字段值完全相同,这种情况去重复最简单,用关键字distinct就可以去掉。

SELECT DISTINCT * FROM TABLE

(2)两条记录之间之后只有部分字段的值是有重复的,但是表存在主键或者唯一性ID。如果是这种情况的话用DISTINCT是过滤不了的,这就要用到主键id的唯一性特点及group by分组。

SELECT * FROM TABLE WHERE ID IN (SELECT MAX(ID) FROM TABLE GROUP BY [去除重复的字段名列表,....])

(3)两条记录之间之后只有部分字段的值是有重复的,但是表不存在主键或者唯一性ID。这种情况可以使用临时表,将数据复制到临时表并添加一个自增ID,在删除重复数据之后再删除临时表

//创建临时表,并将数据写入到临时表
SELECT IDENTITY(INT1,1) AS ID,* INTO NEWTABLE(临时表) FROM TABLE
//查询不重复的数据
SELECT * FROM NEWTABLE WHERE ID IN (SELECT MAX(ID) FROM NEWTABLE GROUP BY [去除重复的字段名列表,....])
//删除临时表
DROP TABLE NEWTABLE

b.使用group by方法

查出重复数据
Select count(num), max(name) from student 列出表中的重复的记录数和学生名字的属性,

Group by num

Having count(num)>1 并按照num分组后找出表中num列出现次数大于一次的。


#删除表中num列所有重复的数据
Delete from student

Group by num

Having count(num)>1

c.使用Rowid方法

根据Oracle带的Rowid属性,可以进行判断是否存在重复语句;

#查出表1和表2中name相同的数据
Select * from table1 a

Where rowid !=(select max(rowid)

 from table2 b
               
 Where  a.name1 = b.name1
               
 And  a.name2 = b.name2......)
 
#删除表1和表2 中name相同的所有数据

Delete from table1 a

Where rowid !=(select max(rowid)

 From table2 b

 Where  a.name1 = b.name1

 And  a.name2 = b.name2.......)
2.left join、join、right join、full join之间的区别?

mysql去重conut mysql去重复关键字_结果集


mysql去重conut mysql去重复关键字_mysql_02

3.UNION 和 UNION ALL的区别?

Union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是否重复。

Union对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION

select *  
    from student  
    where id>2 and id<6
    union   
    select *  
    from test  
    where id<4

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

select *  
   from test  
    where id<4  
    union all
    select *  
    from student  
    where id>2 and id<6
4.什么时候使用视图呢?

应用场景1:保密工作,比如有一个员工工资表,如果你只希望财务看到员工工资这个字段,而其他人不能看到工资字段,那就用一个视图,把工资这个敏感字段过滤掉

应用场景2:有一个查询语句非常复杂,大概有100行这么多,有时还想把这个巨大无比的select语句和其他表关联起来得到结果,写太多很麻烦,可以用一个视图来代替这100行的select语句,充当一个变量角色

5.什么时候用临时表呢?

应用场景1:你在短期内有很多DML操作,比如京东淘宝亚马逊的购物车表,把东西放购物车(insert),变更数量(update),删除商品(delete),一旦结算金钱后,这些数据就要清掉,这时需要用临时表

应用场景2:在导出数据时,你可能不想导完整的数据库,或者表,你可能只想要导出符合某些条件的数据,那么你可以创建临时表,把select语句插入到临时表,接着导出这个临时表,导完以后通过结束session或者事务的方式,让这些没用的数据自动清理掉

应用场景3:你在写存储过程时,有很多的连接,比如你需要连接A,B,C,D,E,F,G,H那么多张表,才能得到你的结果表,同时做连接的消耗太大,你可以先A,B,C连接的结果,放在临时表,接着再把这张临时表,跟D,E,F连接,作为新的结果放在临时表,接着再把临时表与G,H连接,最后得到临时表数据,一次插入到结果表(永久表)。