zoukankan      html  css  js  c++  java
  • SQL进阶-去重

    一、去重的2种基本方法

    1、DISTINCT

    ##
    建表:
    CREATE TABLE teacher(
    teacher_id VARCHAR(50),
    teacher_name VARCHAR(50),
    id_no VARCHAR(50)
    );
    
    CREATE INDEX idx_teacher_id ON teacher(teacher_id);
    
    插入重复数据:
    DELETE FROM teacher;
    INSERT INTO teacher VALUES('20180204060001','李斌','530102192005080114');
    INSERT INTO teacher VALUES('20180204060002','张成','530102192005080115');
    INSERT INTO teacher VALUES('20180204060001','李斌','530102192005080114');
    INSERT INTO teacher VALUES('20180204060002','张成','530102192005080115');
    INSERT INTO teacher VALUES('20180204060001','李斌','530102192005080114');
    INSERT INTO teacher VALUES('20180204060002','张成','530102192005080115');
    
    
    DISTINCT去重查询:
    SELECT DISTINCT * FROM teacher;
    
    
    group by去重查询:
    SELECT 
    teacher_id,
    MIN(teacher_name),
    MIN(id_no)
    FROM teacher
    GROUP BY teacher_id;

    在重复数据都一样的时候,可以用group by,但是当重复数据不完全一样时,可能就会出问题;


    二、其他6中去重方法

    ##
    在重复数据都一样的时候,可以用group by,但是当重复数据不完全一样时,可能就会出问题;
    
    插入数据
    DELETE FROM teacher;
    INSERT INTO teacher VALUES('20180204060001','李斌','530102192005080114');
    INSERT INTO teacher VALUES('20180204060002','张成','530102192005080115');
    INSERT INTO teacher VALUES('20180204060001','白斌','630102192005080114');
    INSERT INTO teacher VALUES('20180204060002','赵成','630102192005080115');
    
    
    ###
    (1)可以用子查询+group byselect * from teacher a where (a.teacher_id,a.id_no) in
    (select b.teacher_id,max(b.id_no) id_no from teacher b group by b.teacher_id);
    
    
    ###
    (2)
    SELECT * FROM teacher a WHERE NOT EXISTS 
    (SELECT 1 FROM teacher b WHERE a.teacher_id = b.teacher_id AND a.id_no > b.id_no);
    
    
    ###
    (3)
    SELECT a.* FROM teacher a WHERE a.id_no <= ALL(
      SELECT b.id_No
      FROM teacher b
      WHERE a.teacher_id = b.teacher_id
    );
    
    
    ###
    (4)
    SELECT a.*
    FROM teacher a
    INNER JOIN teacher b
    ON a.teacher_id = b.teacher_id
    AND a.id_no >= b.id_no
    GROUP BY a.teacher_id,a.teacher_name,a.id_no
    HAVING COUNT(*)=1;
    
    
    ###
    (5)
    SELECT 
    teacher_id,
    SUBSTRING_INDEX(
    GROUP_CONCAT(teacher_name ORDER BY id_no ASC),
    ',',1),
    SUBSTRING_INDEX(
    GROUP_CONCAT(id_no ORDER BY id_no ASC),
    ',',1)
    FROM teacher
    GROUP BY teacher_id;
    
    
    ###
    (6)
    SELECT teacher_id,teacher_name,id_no
    FROM
    (
    SELECT 
    teacher_id,teacher_name,id_no,
    ROW_NUMBER() OVER(PARTITIONING BY teacher_id
    ORDER BY id_no ASC) AS rn_no
    FROM teacher
    )
    WHERE rn_no = 1;
    
    MySQL不支持ROW_NUMBER()的写法!
  • 相关阅读:
    4.羽翼sqlmap学习笔记之Post登录框注入
    3.羽翼sqlmap学习笔记之Cookie注入
    2.羽翼sqlmap学习笔记之MySQL注入
    1.羽翼sqlmap学习笔记之Access注入
    转:C语言中的头文件可以自己写吗?
    12.Struts2自定义拦截器
    linux 软件安装篇
    微信开发-PC调试-JS-SDK功能之分享功能调试
    JS加载相对路径脚本的方法
    apache环境之困扰,Rewrite导致无法加载多个不同的.html文件
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/11463167.html
Copyright © 2011-2022 走看看