初始環境: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;
執行如下兩sql:1、select * from product a left join product_details b on a.id=b.id and a.amount=100;
結果:idamountidweightexist
1100nullnullnull
2200nullnullnull
3300nullnullnull
4400nullnullnull
2、select * from product a left join product_details b on a.id=b.id and a.amount=200;
結果:idamountidweightexist
1100nullnullnull
3300nullnullnull
4400nullnullnull
原因解釋:
首先要清除sql執行順序
首先對a和b表做笛卡爾積生成虛擬表vt1
根據on條件刷選vt1資料生成虛擬表vt2
如果是外連線則需要將保留表中被過濾的的資料(外部行)新增到vt2中生成vt3
具體分析語句1,a b表生成笛卡爾積後根據a.id=b.id and a.amount=100條件刷選,沒有符合條件的行,所以保留表a表的所有行被過濾掉,在新增外部行時a表的所有行被新增到虛擬表中b表的字段都為null,所以就得出結果。
語句2與1過程一致,根據a.id=b.id and a.amount=200刷選出一行結果新增外部行後得出實際結果。
參考:《mysql技術內幕:sql程式設計.姜承堯》
原文:
mysql特別點 常見的MySQL面試點(二)
1.什麼是死鎖?如何解決資料庫死鎖?因為資料庫鎖的最細粒度是行鎖,當乙個開啟事務後,修改某行,在提交事務前,同一行資料在另乙個執行緒也出現了修改。這個時候,後面出現的這個修改語句會發生堵塞,等待前面的事務提交後再開始執行。如果同一時刻兩個執行緒發生這種情況 begin update a 行 upda...
shell雜記 shell特別點
1 shell變數 變數名和等號之間不能有空格 your name runoob.com 唯讀變數定義 readonly you name,在定義後無法被修改 刪除變數 unset your name 獲取字串長度 echo 提取子字串 echo 2 shell陣列 定義陣列用空格隔開或者換行。僅支...
mysql所有表都查詢特別慢 MySQL慢查詢日誌
慢查詢日誌是mysql日誌功能的一種,記錄查詢時間大於預設或設定值的sql語句,也就是記錄執行時間超過long query time值的sql 支援寫入檔案中 mysql資料庫的long query time預設值的10,即10秒。這個值可由我們自己設定。預設情況下,mysql資料庫沒有開啟慢查詢日...