SQL多表多字段比對方法實(shí)例代碼
表-表比較
整體思路
- 兩張表條數(shù)一樣
- 條數(shù)相同是前提,然后比較字段值才有意義
- 兩表字段值完全相同【兩表所有字段的值相同】
- 兩表所有字段union后,條數(shù)與另一張表條數(shù)一樣
- 兩表字段值部分相同【兩表部分字段的值相同】
- 原理:union有去重功能
- 兩表部分字段union后,條數(shù)與另一張的count(distinct 部分字段)一樣
- 找出不同字段的明細(xì)
找出不同字段的明細(xì)
T1/T2兩表ID相同的部分,是否存在不同NAME
SELECT T1.ID,T2.ID,T1.`NAME`,T2.`NAME` FROM A T1 LEFT JOIN B T2 ON T1.ID = T2.ID AND COALESCE(T1.ID,'') <> '' AND COALESCE(T2.ID,'') <> '' WHERE T1.`NAME` <> T2.`NAME`;
兩表的交集與差集:判斷兩表某些字段是否相同
判斷兩表某些字段是否相同,3種查詢結(jié)果相同
-- 寫法01 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM A ) T1; -- 寫法02 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM B ) T2; -- 寫法03 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM A UNION SELECT DISTINCT ID,`NAME` FROM B ) T0;
not in與exists
兩表的交集與差集:找出T2表獨(dú)有的id
找出只存在于T2,不在T1中的那些id
- 下面2種寫法結(jié)果一樣
-- 寫法01 SELECT T2.`NAME`,T2.* FROM A T2 WHERE T2.`NAME` IS NOT NULL AND NOT EXISTS (SELECT 1 FROM B T1 WHERE T1.ID = T2.ID); -- 寫法02 SELECT T2.`NAME`,T2.* FROM A T2 WHERE T2.`NAME` IS NOT NULL AND T2.ID NOT IN (SELECT T1.ID FROM B T1 );
字段-字段比較
判斷兩個字段間一對多或多對一的關(guān)系
測試id與name的一對多關(guān)系以下SQL會報錯,報錯原因 GROUP BY
SELECT ID,`NAME`,COUNT(*) FROM A GROUP BY ID HAVING COUNT(`NAME`)>1;
修改后:
SELECT ID, COUNT(DISTINCT `NAME`) FROM A GROUP BY ID HAVING COUNT(DISTINCT `NAME`)>1;
這樣就說明id與name是一對多的關(guān)系
擴(kuò)展:多對多關(guān)系,上述SQL中id與name位置互換后,查詢有值,就說明兩者是多對多關(guān)系
證明id字段不是主鍵
- 下面2種寫法結(jié)果一樣
-- 寫法01 SELECT ID FROM A GROUP BY ID HAVING COUNT(*)>1; -- 寫法02 SELECT ID,COUNT(ID) FROM A GROUP BY ID HAVING COUNT(ID)>1;
證明id, name字段不是聯(lián)合主鍵
SELECT ID,`NAME` FROM A GROUP BY ID,`NAME` HAVING COUNT(*)>1 ORDER BY ID;
數(shù)據(jù)準(zhǔn)備
-- 建表 CREATE TABLE IF NOT EXISTS TEST01.A ( ID VARCHAR(50) COMMENT 'ID號' -- 01 ,NUMS INT COMMENT '數(shù)字' -- 02 ,NAME VARCHAR(50) COMMENT '名字' -- 03 ) COMMENT 'A表' STORED AS PARQUET ; -- 插數(shù) INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('01',1,NULL); INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('02',2,''); INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('03',3,'c'); -- 刪數(shù) DELETE FROM TEST01.A WHERE ID = '04'; -- 刪表 DROP TABLE IF EXISTS TEST01.A;
總結(jié)
到此這篇關(guān)于SQL多表多字段比對方法的文章就介紹到這了,更多相關(guān)SQL多表多字段比對內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫鎖定機(jī)制詳細(xì)介紹
這篇文章主要介紹了Mysql數(shù)據(jù)庫鎖定機(jī)制詳細(xì)介紹,本文用大量內(nèi)容講解了Mysql中的鎖定機(jī)制,例如MySQL鎖定機(jī)制簡介、合理利用鎖機(jī)制優(yōu)化MySQL等內(nèi)容,需要的朋友可以參考下2014-12-12MySQL日期數(shù)據(jù)類型、時間類型使用總結(jié)
MySQL日期數(shù)據(jù)類型、MySQL時間類型使用總結(jié),需要的朋友可以參考下。2010-06-06MySql 知識點(diǎn)之事務(wù)、索引、鎖原理與用法解析
這篇文章主要介紹了MySql 知識點(diǎn)之事務(wù)、索引、鎖原理與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了mysql數(shù)據(jù)庫事務(wù)、索引、鎖的概念、原理、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-09-09Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情
這篇文章主要介紹了Mysql和文件系統(tǒng)的關(guān)聯(lián)詳情,Mysql常用的存儲引擎如InnoDB、MyISAM采用的是文件存儲,自然和文件系統(tǒng)掛鉤,那么Mysql都有哪些地方用到了文件系統(tǒng)呢,下面我們一起進(jìn)入文章學(xué)習(xí)詳細(xì)內(nèi)容吧2022-09-09講解Linux系統(tǒng)下如何自動備份MySQL數(shù)據(jù)的基本教程
這篇文章主要介紹了Linux系統(tǒng)下如何自動備份MySQL數(shù)據(jù)的基本教程,還給出了利用shell腳本全備份和增量備份的基本方法,需要的朋友可以參考下2015-11-11