数据库的子查询
子查询充当条件
select studentNo from students where name='王昭君';
select * from scores where studentNo=(select studentNo from students where name= '王昭君');
select studentNo from students where age =18;
select score from scores where studentNo in(select studentNo from students where age =18);
select class ,age from students where name='王昭君';
select * from students where(class,age)=(select class ,age from students where name='王昭君');
子查询充当数据源
select * from courses where name in ( '数据库', '系统测试');
select * from scores as sc
inner join (
select * from courses where name in ( '数据库', '系统测试')
) as co on sc.courseNo=co.courseNo;
子查询练习
select avg(age) from students;
select * from students where age > (select avg(age) from students);
select * from students where age between 18 and 20;
select * from scores as sc inner join (
select * from students where age between 18 and 20
)as stu on sc.courseNo=stu.studentNo;
查询演练
数据准备
drop table if exists departments;
create table departments (
deptid int(10) primary key,
deptname varchar(20) not null
);
insert into departments values ( '1001 ', '市场部');
insert into departments values ( '1002 ', '测试部');
insert into departments values ( '1003 ', '开发部');
drop table if exists employees;
create table employees (
empid int(10) primary key,
empname varchar(20) not null,
sex varchar(4) default null,
deptid int(20) default null,
jobs varchar(20) default null,
politicalstatus varchar(20) default null,
leader int(10) default null
);
insert into employees values ( '1 ', '王昭君', '女', '1003 ', '开发', '群众', '9'); insert into employees values ( '2 ', '诸葛亮', '男 ', '1003 ', '开发经理', '群众', null); insert into employees values ( '3 ', '张飞', '男 ', '1002 ', '测试', '团员', '4'); insert into employees values ( '4', '白起', '男 ', '1002 ', '测试经理', '党员', null); insert into employees values ( '5 ', '大乔', '女', '1002 ', '测试', '党员', '4'); insert into employees values ( '6', '孙尚香', '女', '1001 ', '市场', '党员', '12'); insert into employees values ( '7 ', '百里玄策', '男 ', '1001 ', '市场', '团员', '12'); insert into employees values ( '8 ', '小乔', '女', '1002 ', '测试', '群众', '4'); insert into employees values ( '9 ', '百里守约 ', '男 ', '1003 ', '开发', '党员', '9'); insert into employees values ( '10', '妲己', '女', '1003 ', '开发', '团员', '9'); insert into employees values ( '11 ', '李白 ', '男 ', '1002 ', '测试', '团员', '4'); insert into employees values ( '12 ', '孙膑', '男 ', '1001 ', '市场经理', '党员', null);
drop table if exists salary;
create table salary (
sid int(10) primary key,
empid int(10) not null,
salary int(10) not null
);
insert into salary values ( '1 ', '7 ', '2100');
insert into salary values ( '2 ', '6', '2000');
insert into salary values ( '3 ', '12 ', '5000');
insert into salary values ( '4', '9 ', '1999');
insert into salary values ( '5 ', '10', '1900');
insert into salary values ( '6', '1 ', '3000');
insert into salary values ( '7 ', '2 ', '5500');
insert into salary values ( '8 ', '5 ', '2000');
insert into salary values ( '9 ', '3 ', '1500');
insert into salary values ( '10', '8 ', '4000');
insert into salary values ( '11 ', '11 ', '2600');
insert into salary values ( '12 ', '4', '5300');
演练1:列出总人数大于4的部门号和总人数
select deptid, count(*) from employees group by deptid having count(*) > 4;
演练2:列出开发部和和测试部的职工号、姓名
select deptid from departments where deptname in ( '开发部', '测试部');
select empid, empname from employees as emp inner join(
select deptid from departments where deptname in ( '开发部', '测试部'))
as dept on dept.deptid=emp.deptid;
演练3:求出各部门党员的人数,要求显示部门名称
select * from employees as emp
inner join departments as dep on emp.deptid=dep.deptid
where emp.politicalstatus= '党员';
演练4:列出市场部的所有女职工的姓名和政治面貌
select * from employees as emp
inner join departments as dep on emp.deptid=dep.deptid
where emp.sex= '女' and dep.deptname= '市场部';
演练5:显示所有职工的姓名、部门名和工资数
select * from employees as emp
inner join departments as dep on emp.deptid=dep.deptid
inner join salary as sa on sa.empid=emp.empid;