新聞中心
MySQL是一個開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在數(shù)據(jù)分析、數(shù)據(jù)處理和信息管理等方面廣泛應(yīng)用。如何利用是MySQL數(shù)據(jù)處理中一個重要的話題。本文將介紹如何在MySQL中進行數(shù)據(jù)篩選去重的方法,并舉例說明的過程。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、屏邊網(wǎng)站維護、網(wǎng)站推廣。
一、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是查詢的數(shù)據(jù)表名稱,WHERE表示查詢的具體條件,GROUP BY則表示對結(jié)果進行分組,HAVING用于篩選分組結(jié)果,ORDER BY則表示結(jié)果的排序方式。
在MySQL中,篩選命令往往通過WHERE語句進行篩選,其語法格式如下:
SELECT column_name(s)
FROM table_name
WHERE condition;
其中,condition表示列名和值之間的邏輯關(guān)系,符合條件的數(shù)據(jù)將被返回。
二、MySQL實現(xiàn)數(shù)據(jù)篩選去重
在MySQL中實現(xiàn)數(shù)據(jù)篩選去重操作往往需要用到DISTINCT和GROUP BY命令,下面以常見的情況為例介紹其中的方法。
1. 篩選單列數(shù)據(jù)
在MySQL中,可以通過SELECT DISTINCT命令去重即可實現(xiàn)單列數(shù)據(jù)的篩選。其語法格式如下:
SELECT DISTINCT column_name
FROM table_name
WHERE condition;
例如,假設(shè)需要從employee表中找到所有不同的員工名稱,則可以使用以下命令:
SELECT DISTINCT name
FROM employee;
這樣就可以找到該表中所有去重后的員工名稱。
2. 篩選多列數(shù)據(jù)
在MySQL中,可以使用GROUP BY命令實現(xiàn)多列數(shù)據(jù)的篩選,并通過COUNT()、SUM()、AVG()等函數(shù)對結(jié)果進行統(tǒng)計。其語法格式如下:
SELECT column_name1, column_name2,…
FROM table_name
WHERE condition
GROUP BY column_name1, column_name2, …;
例如,假設(shè)需要從employee表中找到所有不同的部門和其對應(yīng)的員工數(shù)量,則可以使用以下命令:
SELECT department, COUNT(*)
FROM employee
GROUP BY department;
這樣就可以得到該表中所有去重后的部門名稱以及部門中員工的數(shù)量。
3. 使用HAVING篩選分組
在MySQL中使用HAVING命令可以篩選分組結(jié)果,并判斷其是否符合條件。其語法格式如下:
SELECT column_name1, column_name2,
FROM table_name
GROUP BY column_name1, column_name2
HAVING condition;
例如,假設(shè)需要從employee表中找到工資更高的員工姓名及其工資,則可以使用以下命令:
SELECT name, MAX(salary)
FROM employee
GROUP BY name
HAVING salary = MAX(salary);
這樣就可以得到該表中工資更高的員工信息。
4. 篩選復(fù)雜條件數(shù)據(jù)
在MySQL中,可以通過使用AND、OR、NOT等邏輯操作符,實現(xiàn)復(fù)雜條件的篩選。例如,可以使用以下語法篩選所有部門為Sales或者Marketing,且工資大于5000的員工信息:
SELECT *
FROM employee
WHERE (department = ‘Sales’ OR department = ‘Marketing’)
AND salary > 5000;
以上方法只是MySQL中的常見篩選去重操作,使用SELECT語句進行數(shù)據(jù)清洗和處理還有許多其他的方法。需要根據(jù)具體的業(yè)務(wù)情況和數(shù)據(jù)特點,選擇合適的方法進行篩選去重。
三、MySQL實現(xiàn)數(shù)據(jù)篩選去重案例
下面以一個實際案例來演示如何使用MySQL進行數(shù)據(jù)篩選去重操作。
假設(shè)有一個銷售數(shù)據(jù)表sales,其中包含了銷售日期、產(chǎn)品編號、銷售數(shù)量等信息?,F(xiàn)在需要從該表中篩選出所有不同的產(chǎn)品編號以及對應(yīng)的銷售總量。
我們需要使用GROUP BY命令對產(chǎn)品編號進行分組:
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id;
以上命令可以計算出該表中所有不同的產(chǎn)品編號以及對應(yīng)的銷售總量信息。
此外,我們還可以在計算過程中使用HAVING命令進行篩選,例如,可以使用以下命令篩選出銷售總量大于1000的產(chǎn)品編號和銷售總量:
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id
HAVING SUM(quantity) > 1000;
通過以上命令,我們可以得到所有銷售總量大于1000的產(chǎn)品編號及其銷售總量信息。
綜上所述,MySQL可以輕松實現(xiàn)數(shù)據(jù)篩選去重操作,并且支持復(fù)雜條件篩選和統(tǒng)計計算等功能。在數(shù)據(jù)處理中,使用MySQL進行清洗和處理,有助于提高數(shù)據(jù)的質(zhì)量和準(zhǔn)確性,為后續(xù)的數(shù)據(jù)分析和決策提供有力的支持。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
如何保證多線程從mysql數(shù)據(jù)庫查詢的數(shù)據(jù)不重復(fù)
以mysql來說,可能出現(xiàn)臟讀、不可重復(fù)讀以及幻讀,mysql默認(rèn)設(shè)置是可重復(fù)讀,即一次事務(wù)中不會讀取到不同的數(shù)據(jù)。
可以做如下操作:
1)打開兩個客戶端,均設(shè)置為RR;
2)在一個事務(wù)中,查詢某個操作查到某份數(shù)據(jù);比如是某個字段version=1存在數(shù)據(jù);
3)在另一個事務(wù)中,刪除這份version=1的數(shù)據(jù);刪除后,在2所屬的事務(wù)中查詢數(shù)據(jù)是沒有變化的,還是存在version=1的數(shù)據(jù);
4)當(dāng)我們在2所屬的事務(wù)中繼續(xù)更新數(shù)據(jù),那么會發(fā)現(xiàn)更新不了,明明我們就看到了這份version=1的數(shù)據(jù);
緩存一致性:
緩存一致,與什么一致?是與數(shù)據(jù)庫一致,對外查詢每個時刻一致;所以在針對于緩存與數(shù)據(jù)庫之間該先更新哪一個呢?可能有人覺得我先更新數(shù)據(jù)庫,再更新緩存不就行了嗎?但是有想過個問題嗎?
當(dāng)用戶已經(jīng)支付成功了,更新到數(shù)據(jù)庫,但是呢?你還在緩存中顯示升宴森未支付,在用戶點擊頻率很高并且數(shù)據(jù)庫壓力過大,來不及同步到緩存時,那你是不是很尷尬吵畝,這就是典型的不一致了。此時用戶再支付,那你又告訴他已經(jīng)支付了,那他會把你罵死的
那該怎么來做呢?我們可以這樣,先更新緩存再更新數(shù)據(jù)庫,那么存在什么問題呢?
1)緩存更新成功,但是數(shù)據(jù)庫更新失敗,而被其祥和它的并發(fā)線程訪問到
2)緩存淘汰成功,但是數(shù)據(jù)庫更新失敗,這也會引發(fā)后期數(shù)據(jù)不一致
在MySQL 8.0 之前, 我們假設(shè)一下有一條爛SQL,
mysqlselect * from t1 order by rand() ;
以多個線程在跑,導(dǎo)致CPU被跑滿了,其他的請求只能被阻塞進不來。那這種情況怎么辦?
大概有以下幾種解決辦法:
設(shè)置max_execution_time 來阻止太長的讀SQL。那可能存在的問題是會把所有長SQL都給KILL 掉。有些必須要執(zhí)行很長時間的也會被誤殺。
自己寫個腳本檢測這類語句,比如order by rand(), 超過一定時間用Kill query thread_id 給殺掉。
那能不能不要殺掉而讓他正常運行,但是又仿則碧不影響其他的請求呢?
那mysql 8.0 引入的資源組(resource group,后面簡寫微RG)可以基本盯敬上解決這類問題。
比如我可以用 RG 來在SQL層面給他限制在特定的一個CPU核上,這樣我就不管他,讓他備舉繼續(xù)運行,如果有新的此類語句,讓他排隊好了。
為什么說基本呢?目前只能綁定CPU資源,其他的暫時不行。
那我來演示下如何使用RG。
創(chuàng)建一個資源組user_ytt. 這里解釋下各個參數(shù)的含義,
type = user 表示這是一個用戶態(tài)線程,也就是前臺的請求線程。如果type=system,表示后臺線程,用來限制mysql自己的線程,比如Innodb purge thread,innodb read thread等等。
vcpu 代表cpu的邏輯核數(shù),這里0-1代表前兩個核被綁定到這個RG。可以用lscpu,top等列出自己的CPU相關(guān)信息。
thread_priority 設(shè)置優(yōu)先級。user 級優(yōu)先級設(shè)置大于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相關(guān)信息可以從 information_schema.resource_groups 系統(tǒng)表里檢索。
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對應(yīng)的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)
當(dāng)然這個是在運維層面來做的,我們也可以在開發(fā)層面結(jié)合 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 服務(wù)加上
systemctl edit mysql@80 AmbientCapabilities=CAP_SYS_NICE
mysql 線程池開啟后RG失效。
freebsd,solaris 平臺thread_priority 失效。
mysql中 如何查詢字段中不重復(fù)的值?而且這個值是所有值中的最小值。
SELECT * FROM `006` GROUP BY num HAVING COUNT(num) =1 ORDER BY num ASC LIMIT 0,1
//賀卜結(jié)果為
id num
//此拍脊解析:森滲
GROUP BY num HAVING COUNT(num) =1 獲得num不重復(fù)的所有列。
ORDER BY num ASC 對不重復(fù)列進行排序。
LIMIT 0,1只取最小的一個結(jié)果。
PS:取更大值將ASC換成DESC即可。
關(guān)于mysql篩選不重復(fù)數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)(cdcxhl.com)提供穩(wěn)定的云服務(wù)器,香港云服務(wù)器,BGP云服務(wù)器,雙線云服務(wù)器,高防云服務(wù)器,成都云服務(wù)器,服務(wù)器托管。精選鉅惠,歡迎咨詢:028-86922220。
當(dāng)前文章:MySQL實現(xiàn)數(shù)據(jù)庫篩選去重(mysql篩選不重復(fù)數(shù)據(jù)庫)
鏈接地址:http://m.fisionsoft.com.cn/article/cojpecs.html


咨詢
建站咨詢
