MYSQL聯表查詢LEFT JOIN 中 條件放在ON后面和放在WHERE后面的區(qū)別

假設有一個用戶表(d_user):

CREATE TABLE IF NOT EXISTS `d_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `name` varchar(50) NOT NULL COMMENT '用戶名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用戶表';

用戶數據如下:

mysql> select * from d_user;
+----+--------+
| id | name   |
+----+--------+
|  1 | 張三   |
|  2 | 李四   |
+----+--------+
2 rows in set (0.00 sec)

一個訂單表(d_order):

CREATE TABLE IF NOT EXISTS `d_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `user_id` bigint(20) NOT NULL COMMENT '用戶id',
  `status` tinyint(1) default 0 NOT NULL COMMENT '訂單狀態(tài) 1:已支付 0:待支付',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='訂單表';

訂單數據如下:

mysql> select * from d_order;
+----+---------+--------+
| id | user_id | status |
+----+---------+--------+
|  1 |       1 |      1 |
+----+---------+--------+
1 row in set (0.00 sec)

假如需要查詢用戶已支付訂單數量:
第一種寫法:

mysql> SELECT
    -> d_user.NAME,
    -> count( d_order.id ) AS total
    -> FROM
    -> d_user
    -> LEFT JOIN d_order ON d_order.user_id = d_user.id
    -> WHERE
    -> d_order.STATUS = 1
    -> GROUP BY
    -> d_user.id;
+--------+-------+
| NAME   | total |
+--------+-------+
| 張三   |     1 |
+--------+-------+
1 row in set (0.00 sec)

第二種寫法:

mysql> SELECT
    -> d_user.NAME,
    -> count( d_order.id ) AS total
    -> FROM
    -> d_user
    -> LEFT JOIN d_order ON d_order.user_id = d_user.id
    -> AND d_order.STATUS = 1
    -> GROUP BY
    -> d_user.id;
+--------+-------+
| NAME   | total |
+--------+-------+
| 張三   |     1 |
| 李四   |     0 |
+--------+-------+
2 rows in set (0.00 sec)

總結:
聯表時條件放在WHERE后面,條件會影響主表返回條數;
聯表時條件放在ON后面,條件不會影響主表返回條數;

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容