Natural join即天然鏈接,natural join等同於inner join或inner using,其做用是將兩個表中具備相同名稱的列進行匹配mysql
用https://www.w3resource.com的圖例:
sql
Natural join特徵:session
創建兩張表:3d
CREATE TABLE t1(id INT,desc1 VARCHAR(50),desc2 VARCHAR(50))ENGINE=INNODB; CREATE TABLE t2(id INT,desc3 VARCHAR(50),desc4 VARCHAR(50))ENGINE=INNODB;
往兩張表寫數據:code
INSERT INTO t1(id,desc1,desc2) VALUES(100,'desc11','desc12'),(101,'desc21','desc22'),(102,'desc31','desc32'); INSERT INTO t2(id,desc3,desc4) VALUES(101,'desc41','desc42'),(103,'desc51','desc52'),(105,'desc61','desc62');
內鏈接查詢id相同的數據blog
SELECT t1.id,t2.id,desc1,desc2,desc3,desc4 FROM t1 INNER JOIN t2 ON t1.id = t2.id;
natural join鏈接查詢的效果等同於如上sql圖片
SELECT t1.id,t2.id,desc1,desc2,desc3,desc4 FROM t1 NATURAL JOIN t2;
ok,接着驗證列類型不同是否還能夠繼續關聯,本博客只在mysql5.7版本驗證
修改一下t1的id類型博客
ALTER TABLE t1 MODIFY id VARCHAR(50);
繼續查詢,用natural join,驗證後發現還能夠查詢的io
SELECT t1.id,t2.id,desc1,desc2,desc3,desc4 FROM t1 NATURAL JOIN t2;
用內鏈接的方法,ps:Oracle裏id類型不同(一個爲int,一個爲varchar)是會報錯的,不過我在5.7版本驗證,並無報錯class
SELECT t1.id,t2.id,desc1,desc2,desc3,desc4 FROM t1 INNER JOIN t2 ON t1.id = t2.id;
因此,我懷疑是否由於sql_mode沒有開啓爲嚴格模式致使的?
SET @session.sql_mode = 'STRICT_TRANS_TABLES';
開啓嚴格模式,繼續查詢都沒問題,因此mysql的語法仍是相對沒那麼嚴格限制的
ok,綜上,能夠得出,natural join只是根據列的名稱和數據進行關聯而已,在5.7版本並無限制要求列的類型要同樣,並且natural join鏈接時候也不須要使用on或者using關鍵字