MySQL 使用左連接替換not in


  眾所周知,左連接和右連接的含義是以哪一張表為准。

  左連接就是以左表為准,查出的結果中包含左表所有的記錄,如果右表中沒有與其對應的記錄,那么那一行記錄中B表部分的內容就全是NULL。

  

  

  現在有兩個表,一個category表和goods表:

mysql> select * from category;
+----+---------+
| id | cate    |
+----+---------+
|  1 | food    |
|  2 | clothes |
|  3 | book    |
|  4 | sport   |
|  5 | music   |
|  6 | video   |
+----+---------+
6 rows in set (0.01 sec)

mysql> select * from goods;
+----+---------+-------------------+
| id | cate_id | name              |
+----+---------+-------------------+
|  0 |       5 | You Are Not Alone |
|  1 |       2 | T-shirt           |
|  2 |       1 | water             |
|  3 |       1 | rice              |
|  4 |       3 | C++ primer        |
|  5 |       4 | basketbal         |
+----+---------+-------------------+
6 rows in set (0.00 sec)

  

  現在要查出每一種分類下的商品,那么可以很簡單的使用左連接了:

mysql> select * from category
    -> left join goods
    -> on category.id = goods.cate_id
    -> order by category.id;
+----+---------+------+---------+-------------------+
| id | cate    | id   | cate_id | name              |
+----+---------+------+---------+-------------------+
|  1 | food    |    2 |       1 | water             |
|  1 | food    |    3 |       1 | rice              |
|  2 | clothes |    1 |       2 | T-shirt           |
|  3 | book    |    4 |       3 | C++ primer        |
|  4 | sport   |    5 |       4 | basketbal         |
|  5 | music   |    0 |       5 | You Are Not Alone |
|  6 | video   | NULL |    NULL | NULL              |
+----+---------+------+---------+-------------------+
7 rows in set (0.01 sec)

  從上面的結果中很全就能看到video分類中沒有商品。

 

  需求:只查詢哪一種分類下面沒有商品

  這個很好實現,可以用下面幾個方法:

  1、使用not in

mysql> select * from category where id not in ( select cate_id from goods);
+----+-------+
| id | cate  |
+----+-------+
|  6 | video |
+----+-------+
1 row in set (0.01 sec)

  2、仍舊使用左連接,只不過對於結果加一個where篩選

mysql> select * from category
    -> left join goods
    -> on category.id = goods.cate_id
    -> where goods.id is NULL;
+----+-------+------+---------+------+
| id | cate  | id   | cate_id | name |
+----+-------+------+---------+------+
|  6 | video | NULL |    NULL | NULL |
+----+-------+------+---------+------+
1 row in set (0.00 sec)

  

  至於為什么不適用not in,這是因為他不使用索引,如果數據量大的時候,效率並不高。

  同樣,如果要顯示和總表中匹配了記錄,隱藏左表沒有匹配到的記錄,可以將后面的where goods.id is not NULL;

  同樣,對於右連接來說也是一樣的。


免責聲明!

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



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