MySQL 之 LEFT JOIN 避坑指南

2021-10-14 02:47:41 字數 3483 閱讀 9143

假設有乙個班級管理應用,有乙個表classes,存了所有的班級;有乙個表students,存了所有的學生,具體資料如下

create table `classes` (

`id` int(10) unsigned not null auto_increment,

`name` varchar(255) default null,

primary key (`id`)

) engine=innodb auto_increment=5 default charset=utf8mb4;

insert into `test`.`classes`(`id`, `name`) values (1, '一班');

insert into `test`.`classes`(`id`, `name`) values (2, '二班');

insert into `test`.`classes`(`id`, `name`) values (3, '三班');

insert into `test`.`classes`(`id`, `name`) values (4, '四班');

create table `students` (

`id` int(10) unsigned not null auto_increment,

`class_id` int(11) default null,

`name` varchar(255) default null,

`gender` varchar(255) default null,

primary key (`id`)

) engine=innodb auto_increment=11 default charset=utf8mb4;

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (1, 1, '小明', 'm');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (2, 1, '小紅', 'f');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (3, 1, '小軍', 'm');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (4, 1, '小公尺', 'f');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (5, 2, '小白', 'f');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (6, 2, '小兵', 'm');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (7, 2, '小林', 'm');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (8, 3, '小新', 'f');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (9, 3, '小王', 'm');

insert into `test`.`students`(`id`, `class_id`, `name`, `gender`) values (10, 3, '小麗', 'f');

select * from classes;
id    name

1 一班

2 二班

3 三班

4 四班

select * from students;
id  class_id  name   gender

1 1 小明 m

2 1 小紅 f

3 1 小軍 m

4 1 小公尺 f

5 2 小白 f

6 2 小兵 m

7 2 小林 m

8 3 小新 f

9 3 小王 m

10 3 小麗 f

那麼現在有兩個需求:

找出每個班級的名稱及其對應的女同學數量

找出一班的同學總數

對於需求1,大多數人不假思索就能想出如下兩種sql寫法,請問哪種是對的?

select c.name, count(s.name) as num 

from classes c left join students s

on s.class_id = c.id

and s.gender = 'f'

group by c.name

或者

select c.name, count(s.name) as num 

from classes c left join students s

on s.class_id = c.id

where s.gender = 'f'

group by c.name

對於需求2,大多數人也可以不假思索的想出如下兩種sql寫法,請問哪種是對的?

select c.name, count(s.name) as num 

from classes c left join students s

on s.class_id = c.id

where c.name = '一班'

group by c.name

或者

select c.name, count(s.name) as num 

from classes c left join students s

on s.class_id = c.id

and c.name = '一班'

group by c.name`

答案是兩個需求都是第一條語句是正確的

結論:在left join語句中,左表過濾必須放where條件中,右表過濾必須放on條件中,這樣結果才能不多不少,剛剛好。

MySql 之 left join 避坑指南

優質文章,第一時間送達 這裡我先給出乙個場景,並丟擲兩個問題,如果你都能答對那這篇文章就不用看了。select from classes id name 1 一班 2 二班 3 三班 4 四班select from students id class id name gender 1 1 小明 m ...

MySQL 之 LEFT JOIN 避坑指南

這裡我先給出乙個場景,並丟擲兩個問題,如果你都能答對那這篇文章就不用看了。假設有乙個班級管理應用,有乙個表classes,存了所有的班級 有乙個表students,存了所有的學生,具體資料如下 那麼現在有兩個需求 找出每個班級的名稱及其對應的女同學數量 找出一班的同學總數 對於需求1,大多數人不假思...

mysql 如何優化left join

今天遇到乙個left join優化的問題,搞了一下午,中間查了不少資料,對mysql的查詢計畫還有查詢優化有了更進一步的了解,做乙個簡單的記錄 select c.from hotel info original c left join hotel info collection h on c.hot...