以前從來沒有搞清楚多表連接的時候ON的語法,只知道它后面是多表連接的連接條件。
今天,專門實踐了一下,ON 帶一個連接條件,ON帶多個連接條件 以及 ON的條件后面還有WHERE子句對查詢結果的影響。
CREATE TABLE `product` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `amount` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MYISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 INSERT INTO product (id,amount) VALUES (1,100),(2,200),(3,300),(4,400); CREATE TABLE `product_details` ( `id` INT(10) UNSIGNED NOT NULL, `weight` INT(10) UNSIGNED DEFAULT NULL, `exist` INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MYISAM DEFAULT CHARSET=latin1 INSERT INTO product_details (id,weight,exist) VALUES (2,22,0),(4,44,1),(5,55,0),(6,66,1);
下面就開始 真正的學習吧!
1、ON帶一個連接條件 平常使用的最常用的連接,在 ON 的子句中,有沒有括號是一樣的,不影響查詢效果
SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id);
查詢結果如圖所示:
2、 ON帶多個連接條件
SELECT * FROM product LEFT JOIN product_details ON product.id = product_details.id AND product_details.id=2; SELECT * FROM product LEFT JOIN product_details ON product.id = product_details.id AND product.amount=300; SELECT * FROM product LEFT JOIN product_details ON product.id = product_details.id AND product.amount=400;
查詢結果一:
查詢結果二:
查詢結果三:
從這3個查詢結果可以看出,實際上on的子句的作用是 篩選 連接表(product_details )要顯示的內容,並不影響查詢結果的條數。
3、ON的連接條件后還有WHERE子句
SELECT * FROM product LEFT JOIN product_details ON product.id = product_details.id WHERE product_details.id=2;
查詢結果:
從這個查詢結果可以看出,ON后的WHERE子句的實際作用是 對多表連接的結果進行篩選,滿足條件的記錄才能被留下,所以他會影響 最終的查詢記錄數。
通過以上案例的實踐,最終了解了ON子句和WHERE子句的區別,下面就來驗證一下剛剛學習到的兩個知識點是否理解正確吧!
SELECT * FROM product a LEFT JOIN product_details b ON a.id=b.id AND b.weight!=44 AND b.exist=0 WHERE b.id IS NULL; SELECT * FROM product a LEFT JOIN product_details b ON a.id=b.id AND b.weight!=44 AND b.exist=1 WHERE b.id IS NULL; SELECT * FROM product a LEFT JOIN product_details b ON a.id=b.id WHERE b.id IS NULL OR b.weight=44 OR b.exist=1;
文章寫得再好也需要你親自去驗證一下哦!
本博文借鑒於:https://www.cnblogs.com/zjfjava/p/6041445.html
如果文章對你有幫助,麻煩幫忙點個贊哦!嘿嘿!做一個靠譜的技術博主!