假設有乙個班級管理應用,有乙個表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...