一、去重的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 by:
select * 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()的写法!

SQL进阶-去重的更多相关文章

  1. 《SQL基础教程》+ 《SQL进阶教程》 学习笔记

    写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...

  2. SQL优化之SQL 进阶技巧(上)

    由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL ...

  3. pl/sql进阶--例外处理

    在pl/sql的执行过程中发生异常时系统所作的处理称为一个例外情况(exception).通常例外情况的种类有三种: 1.预定义的oracle例外情况oracle预定义的例外情况大约有24个,对于这种 ...

  4. SQL进阶随笔--case用法(一)

    SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...

  5. 【SQL进阶】03.执行计划之旅1 - 初探

    听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...

  6. pl/sql进阶一控制结构

    在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...

  7. SQL优化之SQL 进阶技巧(下)

    上文( SQL优化之SQL 进阶技巧(上) )我们简述了 SQL 的一些进阶技巧,一些朋友觉得不过瘾,我们继续来下篇,再送你 10 个技巧 一. 使用延迟查询优化 limit [offset], [r ...

  8. (一)《SQL进阶教程》学习记录--CASE

    背景:最近用到统计之类的复杂Sql比较多,有种"提笔忘字"的感觉,看书练习,举一反三,巩固加强. (一) <SQL进阶教程>学习记录--CASE (二) <SQL ...

  9. 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

随机推荐

  1. 示例:WPF仿制OSK做的系统键盘和数字键盘

    原文:示例:WPF仿制OSK做的系统键盘和数字键盘 一.目的:在应用osk.exe系统键盘时遇到很多不方便,比如有些系统调用不出来等问题,由此开发了一个系统键盘仿制osk 二.实现功能 1.目前实现大 ...

  2. 关于vs无法创建虚拟目录的问题

    插入链接:https://blog.csdn.net/zhao1955/article/details/92182935 补充:改完之后不要忘记以管理员的身份运行vs

  3. Ubuntu 下安装zsh和oh-my-zsh

    注意:安装前先备份/etc/passwd 一开始装oh-my-zsh我是拒绝的,因为这东西安装容易,卸载难,真的很难. Mac安装参考:http://www.cnblogs.com/EasonJim/ ...

  4. Java之路---Day12(多态)

    2019-10-26-22:40:09 目录: 1.多态的概念 2.多态的分类 3.实现多态的三个必要条件 4.多态的格式 5.多态成员变量的使用特点 6.多态成员方法的使用特点 7.多态的好处 8. ...

  5. Matlab备忘录模式

    备忘录模式(Memento)用于保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式,主要包括源发器,备忘录以及负责人.源发器:普通类,可以创建备忘录,也可以使用备忘录恢复状态. ...

  6. [摘抄] 4.require命令

    4.require命令 1. 基本用法 Node适用CommonJS模块规范,内置的require命令用于加载模块文件. require命令的基本功能是,读入并执行一个JavaScript文件,然后返 ...

  7. jQuery源码学习一: 创建一个jquery实例

    前言: jquery是每个前端都会的基础技能,众所周知,jquery返回的是jquery实例方法,但是我们似乎是直接使用$就可以获取到jquery的方法啦,可以在浏览器中判断一下 window.$ 和 ...

  8. Python3 import tensorflow 出现FutureWarning: Passing (type, 1) or '1type' 问题

    解决python调用TensorFlow时出现FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecate ...

  9. 浅谈Python设计模式 - 建造者模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 建造者模式 当我们想要创建一个由多个部分构成的对象,而且他们的构建需要一步接一步 ...

  10. React源码 Suspense 和 ReactLazy

    React 16.6 提供的一个新的开放一部分功能的 Suspense 代码 import React, { Suspense, lazy } from 'react' const LazyComp ...