natural join即自然連線,natural join等同於inner join或inner using,其作用是將兩個表中具有相同名稱的列進行匹配
用的圖例:
natural join特徵:
建立兩張表:
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
;
往兩張表寫資料:
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相同的資料
select t1.id,t2.id,desc1,desc2,desc3,desc4 from t1 inner
join t2 on t1.id = t2.id;
natural join連線查詢的效果等同於如上sql
ok,接著驗證列型別不一樣是否還可以繼續關聯,本部落格只在mysql5.7版本驗證
修改一下t1的id型別
alter table t1 modify id varchar(50
);
繼續查詢,用natural join,驗證後發現還可以查詢的
select t1.id,t2.id,desc1,desc2,desc3,desc4 from t1 natural
join t2;
用內連線的方法,ps:oracle裡id型別不一樣(乙個為int,乙個為varchar)是會報錯的,不過我在5.7版本驗證,並沒有報錯
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關鍵字
MySQL系列之鎖
分布式鎖 疑問?什麼是共享鎖?共享鎖 共享讀鎖,排他鎖 獨佔寫鎖 鎖機制與innodb鎖演算法 在關係型資料庫中,可以按照鎖的粒度把資料庫鎖分為行級鎖 innodb引擎 表級鎖 myisam引擎 和頁級鎖 bdb引擎 myisam採用表級鎖 table level locking innodb支援行...
mysql系列之 模糊查詢
1,表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文,請使用兩個百分號 表示。比如 select from user where u name like 三 將會把u name為 張三 張貓三 三腳貓 唐三藏 等等有 三 的記錄全找出來。另外,如果需要找出u name中既有 三...
Mysql系列之鎖機制
一般乙個程式滿,從消耗的角度,乙個是cpu,乙個是io,但有的時候mysql慢,是因為某條sql不小心把整個表給鎖了。鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除了傳統的計算機資源 如cpu,ram,i o 的爭用外,資料也是供很多使用者共享的資源。如何保證資料併發訪問的一致...