mysql特别点_Mysql 特别注意点!
連接查詢小坑
初始環(huán)境:CREATE?TABLE?product?(
id?INT?UNSIGNED?NOT?NULL?AUTO_INCREMENT,
amount?INT?UNSIGNED?DEFAULT?NULL?,
PRIMARY?KEY?(id)
)?ENGINE?=?innodb?CHARSET?='utf8';
INSERT?INTO?product?VALUES?(1,100),?(2,200),?(3,300),?(4,400);
SELECT?*?FROM?product;
CREATE?TABLE?product_details?(
id?int?UNSIGNED?NOT?NULL,
weight?INT?UNSIGNED?DEFAULT?NULL?,
exist?INT?UNSIGNED?DEFAULT?NULL?,
PRIMARY?KEY?(id)
)?ENGINE?=?innodb?CHARSET?='utf8';
INSERT?INTO?product_details?VALUES?(2,22,0),(4,44,1),(5,55,0),(6,66,1);
SELECT?*?FROM?product_details;
執(zhí)行如下兩SQL:1、SELECT?*?FROM?product?a?LEFT?JOIN?product_details?b?ON?a.id=b.id?AND?a.amount=100;
結(jié)果:
idamountidweightexist
1100NULLNULLNULL
2200NULLNULLNULL
3300NULLNULLNULL
4400NULLNULLNULL
2、SELECT?*?FROM?product?a?LEFT?JOIN?product_details?b?ON?a.id=b.id?AND?a.amount=200;
結(jié)果:
idamountidweightexist
22002220
1100NULLNULLNULL
3300NULLNULLNULL
4400NULLNULLNULL
原因解釋:
首先要清除SQL執(zhí)行順序
首先對a和b表做笛卡爾積生成虛擬表VT1
根據(jù)ON條件刷選VT1數(shù)據(jù)生成虛擬表VT2
如果是外連接則需要將保留表中被過濾的的數(shù)據(jù)(外部行)添加到VT2中生成VT3
具體分析語句1,a b表生成笛卡爾積后根據(jù)a.id=b.id AND a.amount=100條件刷選,沒有符合條件的行,所以保留表a表的所有行被過濾掉,在添加外部行時a表的所有行被添加到虛擬表中b表的字段都為NULL,所以就得出結(jié)果。
語句2與1過程一致,根據(jù)a.id=b.id?AND?a.amount=200刷選出一行結(jié)果添加外部行后得出實際結(jié)果。
參考:《MySQL技術(shù)內(nèi)幕:SQL編程.姜承堯》
2. order by case when用法(根據(jù)不同條件選擇不同列的值排序)
寫法1:需要顯示選擇的列值
SELECT?auto_id,?(case?when?flag='1'?THEN?price?when?flag='0'?THEN?n_price?else?null?END?)?as?oprice???FROM?yaju_new.test?ORDER?BY?oprice;
寫法2:
SELECT?auto_id FROM?yaju_new.test?ORDER?BY?,?(case?when?flag='1'?THEN?price?when?flag='0'?THEN?n_price?else?null?END?);
總結(jié)
以上是生活随笔為你收集整理的mysql特别点_Mysql 特别注意点!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql里添加不了中文_为什么MySQ
- 下一篇: python27文件夹_为什么pytho