眾所周知,左連接和右連接的含義是以哪一張表為准。
左連接就是以左表為准,查出的結果中包含左表所有的記錄,如果右表中沒有與其對應的記錄,那么那一行記錄中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;
同樣,對於右連接來說也是一樣的。