我有以下查询
我在问题的第二部分遇到了麻烦。截至目前,我的查询仅显示有学生毕业的部门。我不知道如何让表格显示没有任何学生毕业的部门。按部门列出2009年毕业的学生人数。对于没有任何学生在2009年毕业的部门,结果应显示为0。
我的查询看起来像这样
select d.name, count(s.major_id) as students from departments d
right join students s on s.major_id = d.id where extract( year from s.graduation_date ) = 2009
group by d.name
我的表看起来像这样
name students
Math 2
Drama 1
我怎样才能让其他部门没有学生毕业?
数据库是
create table departments (
id integer primary key,
name varchar(255)
);
insert into departments (id, name) values (10, 'Computer Science');
insert into departments (id, name) values (20, 'Math');
insert into departments (id, name) values (30, 'Drama');
create table faculty (
id integer primary key,
name varchar(255),
department_id integer references departments(id)
);
insert into faculty (id, name, department_id) values (1, 'Turing', 10);
insert into faculty (id, name, department_id) values (2, 'Newton', 20);
insert into faculty (id, name, department_id) values (3, 'Einstein', 20);
insert into faculty (id, name, department_id) values (4, 'Brando', 30);
insert into faculty (id, name, department_id) values (5, 'Joe', 30);
insert into faculty (id, name, department_id) values (6, 'Gray', 10);
create table students (
id integer primary key,
name varchar(255),
graduation_date date,
major_id integer references departments(id)
);
insert into students (id, name, graduation_date, major_id) values
(1, 'Joe', null, 10);
insert into students (id, name, graduation_date, major_id) values
(2, 'Amy', '2009-04-22', 20);
insert into students (id, name, graduation_date, major_id) values
(3, 'Max', null, 10);
insert into students (id, name, graduation_date, major_id) values
(4, 'Sue', '2009-01-10', 20);
insert into students (id, name, graduation_date, major_id) values
(5, 'Bob', '2009-03-05', 30);
insert into students (id, name, graduation_date, major_id) values
(6, 'Kim', null, 20);
insert into students (id, name, graduation_date, major_id) values
(7, 'Art', null, 30);
insert into students (id, name, graduation_date, major_id) values
(8, 'Pat', '2005-07-11', 20);
insert into students (id, name, graduation_date, major_id) values
(9, 'Lee', null, 10);
答案 0 :(得分:1)
尝试使用LEFT JOIN
代替RIGHT JOIN
:
select d.name, count(s.major_id) as students
from departments d
left join students s on s.major_id = d.id and
extract( year from s.graduation_date ) = 2009
group by d.name
请注意,extract( year from s.graduation_date ) = 2009
谓词应放在ON
子句中,否则LEFT JOIN
会成为INNER JOIN
。
<强>输出:强>
name | students
=================+============
Computer Science | 0
Drama | 1
Math | 2