mysql 中 where 與 on 的區別


以前從來沒有搞清楚多表連接的時候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

如果文章對你有幫助,麻煩幫忙點個贊哦!嘿嘿!做一個靠譜的技術博主!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM