MySQL是一个开源关系型数据库管理系统,在数据分析、数据处理和信息管理等方面广泛应用。如何利用是MySQL数据处理中一个重要的话题。本文将介绍如何在MySQL中进行数据筛选去重的方法,并举例说明的过程。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、网页空间、营销软件、网站建设、屏边网站维护、网站推广。
一、SQL语言中的筛选命令
SQL语言有多种命令可以用来筛选去重操作,其中,SELECT语句是最常用的查询语句。SELECT语句的完整语法如下:
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name
HAVING condition
ORDER BY column_name ASC|DESC;
其中,column_name表示需要返回的列的名称,table_name是查询的数据表名称,WHERE表示查询的具体条件,GROUP BY则表示对结果进行分组,HAVING用于筛选分组结果,ORDER BY则表示结果的排序方式。
在MySQL中,筛选命令往往通过WHERE语句进行筛选,其语法格式如下:
SELECT column_name(s)
FROM table_name
WHERE condition;
其中,condition表示列名和值之间的逻辑关系,符合条件的数据将被返回。
二、MySQL实现数据筛选去重
在MySQL中实现数据筛选去重操作往往需要用到DISTINCT和GROUP BY命令,下面以常见的情况为例介绍其中的方法。
1. 筛选单列数据
在MySQL中,可以通过SELECT DISTINCT命令去重即可实现单列数据的筛选。其语法格式如下:
SELECT DISTINCT column_name
FROM table_name
WHERE condition;
例如,假设需要从employee表中找到所有不同的员工名称,则可以使用以下命令:
SELECT DISTINCT name
FROM employee;
这样就可以找到该表中所有去重后的员工名称。
2. 筛选多列数据
在MySQL中,可以使用GROUP BY命令实现多列数据的筛选,并通过COUNT()、SUM()、AVG()等函数对结果进行统计。其语法格式如下:
SELECT column_name1, column_name2,…
FROM table_name
WHERE condition
GROUP BY column_name1, column_name2, …;
例如,假设需要从employee表中找到所有不同的部门和其对应的员工数量,则可以使用以下命令:
SELECT department, COUNT(*)
FROM employee
GROUP BY department;
这样就可以得到该表中所有去重后的部门名称以及部门中员工的数量。
3. 使用HAVING筛选分组
在MySQL中使用HAVING命令可以筛选分组结果,并判断其是否符合条件。其语法格式如下:
SELECT column_name1, column_name2,
FROM table_name
GROUP BY column_name1, column_name2
HAVING condition;
例如,假设需要从employee表中找到工资更高的员工姓名及其工资,则可以使用以下命令:
SELECT name, MAX(salary)
FROM employee
GROUP BY name
HAVING salary = MAX(salary);
这样就可以得到该表中工资更高的员工信息。
4. 筛选复杂条件数据
在MySQL中,可以通过使用AND、OR、NOT等逻辑操作符,实现复杂条件的筛选。例如,可以使用以下语法筛选所有部门为Sales或者Marketing,且工资大于5000的员工信息:
SELECT *
FROM employee
WHERE (department = ‘Sales’ OR department = ‘Marketing’)
AND salary > 5000;
以上方法只是MySQL中的常见筛选去重操作,使用SELECT语句进行数据清洗和处理还有许多其他的方法。需要根据具体的业务情况和数据特点,选择合适的方法进行筛选去重。
三、MySQL实现数据筛选去重案例
下面以一个实际案例来演示如何使用MySQL进行数据筛选去重操作。
假设有一个销售数据表sales,其中包含了销售日期、产品编号、销售数量等信息。现在需要从该表中筛选出所有不同的产品编号以及对应的销售总量。
我们需要使用GROUP BY命令对产品编号进行分组:
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id;
以上命令可以计算出该表中所有不同的产品编号以及对应的销售总量信息。
此外,我们还可以在计算过程中使用HAVING命令进行筛选,例如,可以使用以下命令筛选出销售总量大于1000的产品编号和销售总量:
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id
HAVING SUM(quantity) > 1000;
通过以上命令,我们可以得到所有销售总量大于1000的产品编号及其销售总量信息。
综上所述,MySQL可以轻松实现数据筛选去重操作,并且支持复杂条件筛选和统计计算等功能。在数据处理中,使用MySQL进行清洗和处理,有助于提高数据的质量和准确性,为后续的数据分析和决策提供有力的支持。
成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!
以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据。
可以做如下操作:
1)打开两个客户端,均设置为RR;
2)在一个事务中,查询某个操作查到某份数据;比如是某个字段version=1存在数据;
3)在另一个事务中,删除这份version=1的数据;删除后,在2所属的事务中查询数据是没有变化的,还是存在version=1的数据;
4)当我们在2所属的事务中继续更新数据,那么会发现更新不了,明明我们就看到了这份version=1的数据;
缓存一致性:
缓存一致,与什么一致?是与数据库一致,对外查询每个时刻一致;所以在针对于缓存与数据库之间该先更新哪一个呢?可能有人觉得我先更新数据库,再更新缓存不就行了吗?但是有想过个问题吗?
当用户已经支付成功了,更新到数据库,但是呢?你还在缓存中显示升宴森未支付,在用户点击频率很高并且数据库压力过大,来不及同步到缓存时,那你是不是很尴尬吵亩,这就是典型的不一致了。此时用户再支付,那你又告诉他已经支付了,那他会把你骂死的
那该怎么来做呢?我们可以这样,先更新缓存再更新数据库,那么存在什么问题呢?
1)缓存更新成功,但是数据库更新失败,而被其祥和它的并发线程访问到
2)缓存淘汰成功,但是数据库更新失败,这也会引发后期数据不一致
在MySQL 8.0 之前, 我们假设一下有一条烂SQL,
mysqlselect * from t1 order by rand() ;
以多个线程在跑,导致CPU被跑满了,其他的请求只能被阻塞进不来。那这种情况怎么办?
大概有以下几种解决办法:
设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。
自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。
那能不能不要杀掉而让他正常运行,但是又仿则碧不影响其他的请求呢?
那mysql 8.0 引入的资源组(resource group,后面简写微RG)可以基本盯敬上解决这类问题。
比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他备举继续运行,如果有新的此类语句,让他排队好了。
为什么说基本呢?目前只能绑定CPU资源,其他的暂时不行。
那我来演示下如何使用RG。
创建一个资源组user_ytt. 这里解释下各个参数的含义,
type = user 表示这是一个用户态线程,也就是前台的请求线程。如果type=system,表示后台线程,用来限制mysql自己的线程,比如Innodb purge thread,innodb read thread等等。
vcpu 代表cpu的逻辑核数,这里0-1代表前两个核被绑定到这个RG。可以用lscpu,top等列出自己的CPU相关信息。
thread_priority 设置优先级。user 级优先级设置大于0。
mysqlmysql> create resource group user_ytt type = user vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (0.03 sec)
RG相关信息可以从 information_schema.resource_groups 系统表里检索。
mysqlmysql> select * from information_schema.resource_groups;+++++—+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+++++—+| USR_default| USER ||| 0 || SYS_default| SYSTEM||| 0 || user_ytt| USER |||19 |+++++—+3 rows in set (0.00 sec)
我们来给语句select guid from t1 group by left(guid,8) order by rand() 赋予RG user_ytt。
mysql> show processlist;+—–+—++——++++—+| Id | User| Host | db | Command | Time | State | Info|+—–+—++——++++—+| 4 | event_scheduler | localhost | NULL | Daemon || Waiting on empty queue | NULL|| 240 | root| localhost | ytt | Query || Creating sort index | select guid from t1 group by left(guid,8) order by rand() || 245 | root| localhost | ytt | Query || starting | show processlist|+—–+—++——++++—+3 rows in set (0.00 sec)
找到连接240对应的thread_id。
mysqlmysql> select thread_id from performance_schema.threads where processlist_id = 240;++| thread_id |++||++1 row in set (0.00 sec)
给这个线程278赋予RG user_ytt。没报错就算成功了。
mysqlmysql> set resource group user_ytt for 278;Query OK, 0 rows affected (0.00 sec)
当然这个是在运维层面来做的,我们也可以在开发层面结合 MYSQL HINT 来单独给这个语句赋予RG。比如:
mysqlmysql> select /*+ resource_group(user_ytt) */guid from t1 group by left(guid,8) order by rand()….rows in set (4 min 46.09 sec)
RG的限制:
Linux 平台上需要开启 CAPSYSNICE 特性。比如我机器上用systemd 给mysql 服务加上
systemctl edit mysql@80 AmbientCapabilities=CAP_SYS_NICE
mysql 线程池开启后RG失效。
freebsd,solaris 平台thread_priority 失效。
SELECT * FROM `006` GROUP BY num HAVING COUNT(num) =1 ORDER BY num ASC LIMIT 0,1
//贺卜结果为
id num
//此拍脊解析:森渗
GROUP BY num HAVING COUNT(num) =1 获得num不重复的所有列。
ORDER BY num ASC 对不重复列进行排序。
LIMIT 0,1只取最小的一个结果。
PS:取更大值将ASC换成DESC即可。
关于mysql筛选不重复数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
创新互联(cdcxhl.com)提供稳定的云服务器,香港云服务器,BGP云服务器,双线云服务器,高防云服务器,成都云服务器,服务器托管。精选钜惠,欢迎咨询:028-86922220。
文章名称:MySQL实现数据库筛选去重(mysql筛选不重复数据库)
转载来于:http://www.shufengxianlan.com/qtweb/news5/490205.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联