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 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进阶-去重的更多相关文章
- 《SQL基础教程》+ 《SQL进阶教程》 学习笔记
写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...
- SQL优化之SQL 进阶技巧(上)
由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL ...
- pl/sql进阶--例外处理
在pl/sql的执行过程中发生异常时系统所作的处理称为一个例外情况(exception).通常例外情况的种类有三种: 1.预定义的oracle例外情况oracle预定义的例外情况大约有24个,对于这种 ...
- SQL进阶随笔--case用法(一)
SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...
- 【SQL进阶】03.执行计划之旅1 - 初探
听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...
- pl/sql进阶一控制结构
在任何计算机语言(c,java,c#,c++)都有各种控制语句(条件语句,循环结构,顺序控制结构…),在pl/sql中也存在这样的控制结构. 在本部分学校完毕后,希望大家达到: 1)使用各种if语句 ...
- SQL优化之SQL 进阶技巧(下)
上文( SQL优化之SQL 进阶技巧(上) )我们简述了 SQL 的一些进阶技巧,一些朋友觉得不过瘾,我们继续来下篇,再送你 10 个技巧 一. 使用延迟查询优化 limit [offset], [r ...
- (一)《SQL进阶教程》学习记录--CASE
背景:最近用到统计之类的复杂Sql比较多,有种"提笔忘字"的感觉,看书练习,举一反三,巩固加强. (一) <SQL进阶教程>学习记录--CASE (二) <SQL ...
- 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)
一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...
随机推荐
- laravel hash密码生成和密码验证
在laravel中 登录表单中的密码是用hash来生成的. 在生成密码需要用到 laravel框架中的方法(都是laravel封装好了的) bcrypt($password)方法,直接将获取到的pas ...
- Linux(Ubuntu)通过nfs挂载远程硬盘
需求 现有两台Linux Server,需要把Linux01 下的8T硬盘挂在到 Linux02 下:Linux01 硬盘: Linux02 硬盘: 挂载原理 通过 nfs-server 将Linux ...
- scarpy设置日志打印级别和存储位置
在settings.py中配置 日志级别设置 LOG_LEVEL = 'ERROR' # 当LOG_LEVEL设置为ERROR时,在进行日志打印时,只是打印ERROR级别的日志 日志存储设置 LOG_ ...
- 交互式脚本expect场景示例
expect语法示例 #spawn 新建一个进程,这个进程的交互由expect控制 #expect 等待接受进程返回的字符串,直到超时时间,根据规则决定下一步操作 #send 发送字符串给expect ...
- English--不完全及物动词与授予动词
English|不完全及物动词与授予动词 动词在整个语法中都是占据着十分重要的角色.在五大句型中将动词分为五种:系动词.不及物动词.及物动词.不完全及物动词.授予动词.这篇主讲不完全及物动词和授予动词 ...
- Elasticsearch 、 Logstash以及Kibana 分布式日志
搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群 ELK简介: ELK是三个开源软件的缩写,分别为:Elasticsearch . Logstash以及Kib ...
- 【转载】C#通过Rows.Count属性获取总行数
在C#中的Datatable数据变量的操作过程中,有时候我们需要知道DataTable中是否含有数据行或者DataTable的数据总行数,此时我们就可以先拿到DataTable中的Rows属性对象,通 ...
- JavaScript 书写位置
类似于 CSS 样式,JavaScript 也有三种不同位置的书写方式. 1.写在行内 <input type="button" value="按钮" o ...
- 关于“在从服务器接收结果时发生传输级错误。 (provider: TCP Provider, error: 0 - 指定的网络名不再可用。)”的解决方法之一
最近几天发现连sql数据库服务器的时候,总是提示“在从服务器接收结果时发生传输级错误. (provider: TCP Provider, error: 0 - 指定的网络名不再可用.)”的错误. 网上 ...
- Idea 热部署插件JRebel 安装与环境配置-上海尚学堂Java培训
在企业日常项目开发中,如果我们需要调试一个Java Web项目,就需要先将项目编译之后,放入Web容器或借助Maven web 插件来运行,如果对Java源代码进行修改,那么必须重新编译并重启Web容 ...