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

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


咨詢
建站咨詢
