select employee_id, manager_id, department_id from employees where manager_id in ( select manager_id from employees where employee_id in(141, 174) ) and department_id in ( select department_id from employees where employee_id in(141, 174) ) and employee_id notin (141, 174);
select employee_id, manager_id, department_id from employees where (manager_id, department_id) in ( select manager_id, department_id from employees where employee_id in (141, 174) ) and employee_id notin(141, 174);
from 子句中使用子查询
selectmax(avg(salary)) from employees groupby department_id;
selectmax(avg_sal) from ( selectavg(salary) avg_sal from employees groupby department_id ) e
select last_name, department_id, salary, (selectavg(salary) from employees where department_id = e1.department_id) from employees e1 where salary > ( selectavg(salary) from employees e2 where e1.department_id = e2.department_id )
select last_name, e1.department_id, salary, avg_sal from employees e1, ( select department_id, avg(salary) avg_sal from employees groupby department_id ) e2 where e1.department_id = e2.department_id and e1.salary > e2.avg_sal;
case...when ... then... when ... then ... else ... end
select employee_id, last_name, case department_id when ( select department_id from departments where location_id = 1800 ) then'Canada'else'USA'end"location" from employees;
update employees e1 set salary = ( selectmax(salary) from employees e2 where e1.department_id = e2.department_id ), job_id = ( select job_id from employees groupby job_id havingavg(salary) = ( selectmin(avg(salary)) from employees groupby job_id ) ) where employee_id = 108;
删除 108 号员工所在部门中工资最低的那个员工.
deletefrom employees e1 where salary = ( selectmin(salary) from employees where department_id = ( select department_id from employees where employee_id = 108 ) )
select * from employees where employee_id = 108; select * from employees where department_id = 100 orderby salary;
selectcount(教师号) from teacher where 教师姓名 like'孟%';
2.汇总统计分组分析
面试题:查询课程编号为“0002”的总成绩
--分析思路 --select 查询结果 [总成绩:汇总函数sum] --from 从哪张表中查找数据[成绩表score] --where 查询条件 [课程号是0002] selectsum(成绩) from score where 课程号 = '0002';
查询选了课程的学生人数
--这个题目翻译成大白话就是:查询有多少人选了课程 --select 学号,成绩表里学号有重复值需要去掉 --from 从课程表查找score; selectcount(distinct 学号) as 学生人数 from score;
查询各科成绩最高和最低的分, 以如下的形式显示:课程号,最高分,最低分
/* 分析思路 select 查询结果 [课程ID:是课程号的别名,最高分:max(成绩) ,最低分:min(成绩)] from 从哪张表中查找数据 [成绩表score] where 查询条件 [没有] group by 分组 [各科成绩:也就是每门课程的成绩,需要按课程号分组]; */ select 课程号,max(成绩) as 最高分,min(成绩) as 最低分 from score groupby 课程号;
查询每门课程被选修的学生数
/* 分析思路 select 查询结果 [课程号,选修该课程的学生数:汇总函数count] from 从哪张表中查找数据 [成绩表score] where 查询条件 [没有] group by 分组 [每门课程:按课程号分组]; */ select 课程号, count(学号) from score groupby 课程号;
查询男生、女生人数
/* 分析思路 select 查询结果 [性别,对应性别的人数:汇总函数count] from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表student] where 查询条件 [没有] group by 分组 [男生、女生人数:按性别分组] having 对分组结果指定条件 [没有] order by 对查询结果排序[没有]; */ select 性别,count(*) from student groupby 性别;
查询平均成绩大于60分学生的学号和平均成绩
/* 题目翻译成大白话: 平均成绩:展开来说就是计算每个学生的平均成绩 这里涉及到“每个”就是要分组了 平均成绩大于60分,就是对分组结果指定条件 分析思路 select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表score] where 查询条件 [没有] group by 分组 [平均成绩:先按学号分组,再计算平均成绩] having 对分组结果指定条件 [平均成绩大于60分] */ select 学号, avg(成绩) from score groupby 学号 havingavg(成绩)>60;
查询至少选修两门课程的学生学号
/* 翻译成大白话: 第1步,需要先计算出每个学生选修的课程数据,需要按学号分组 第2步,至少选修两门课程:也就是每个学生选修课程数目>=2,对分组结果指定条件 分析思路 select 查询结果 [学号,每个学生选修课程数目:汇总函数count] from 从哪张表中查找数据 [课程的学生学号:课程表score] where 查询条件 [至少选修两门课程:需要先计算出每个学生选修了多少门课,需要用分组,所以这里没有where子句] group by 分组 [每个学生选修课程数目:按课程号分组,然后用汇总函数count计算出选修了多少门课] having 对分组结果指定条件 [至少选修两门课程:每个学生选修课程数目>=2] */ select 学号, count(课程号) as 选修课程数目 from score groupby 学号 havingcount(课程号)>=2;
查询同名同性学生名单并统计同名人数
/* 翻译成大白话,问题解析: 1)查找出姓名相同的学生有谁,每个姓名相同学生的人数 查询结果:姓名,人数 条件:怎么算姓名相同?按姓名分组后人数大于等于2,因为同名的人数大于等于2 分析思路 select 查询结果 [姓名,人数:汇总函数count(*)] from 从哪张表中查找数据 [学生表student] where 查询条件 [没有] group by 分组 [姓名相同:按姓名分组] having 对分组结果指定条件 [姓名相同:count(*)>=2] order by 对查询结果排序[没有]; */
select 姓名,count(*) as 人数 from student groupby 姓名 havingcount(*)>=2;
查询不及格的课程并按课程号从大到小排列
/* 分析思路 select 查询结果 [课程号] from 从哪张表中查找数据 [成绩表score] where 查询条件 [不及格:成绩 <60] group by 分组 [没有] having 对分组结果指定条件 [没有] order by 对查询结果排序[课程号从大到小排列:降序desc]; */ select 课程号 from score where 成绩<60 orderby
课程号 desc;
查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
/* 分析思路 select 查询结果 [课程号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩表score] where 查询条件 [没有] group by 分组 [每门课程:按课程号分组] having 对分组结果指定条件 [没有] order by 对查询结果排序[按平均成绩升序排序:asc,平均成绩相同时,按课程号降序排列:desc]; */ select 课程号, avg(成绩) as 平均成绩 from score groupby 课程号 orderby 平均成绩 asc,课程号 desc;
检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
/* 分析思路 select 查询结果 [] from 从哪张表中查找数据 [成绩表score] where 查询条件 [课程编号为“04”且分数小于60] group by 分组 [没有] having 对分组结果指定条件 [] order by 对查询结果排序[查询结果按按分数降序排列]; */ select 学号 from score where 课程号='04'and 成绩 <60 orderby 成绩 desc;
/* 分析思路 select 查询结果 [要求输出课程号和选修人数] from 从哪张表中查找数据 [] where 查询条件 [] group by 分组 [每门课程:按课程号分组] having 对分组结果指定条件 [学生选修人数(超过2人的课程才统计):每门课程学生人数>2] order by 对查询结果排序[查询结果按人数降序排序,若人数相同,按课程号升序排序]; */ select 课程号, count(学号) as'选修人数' from score groupby 课程号 havingcount(学号)>2 orderbycount(学号) desc,课程号 asc;
/* 第1步:得到每个学生的平均成绩,显示学号,平均成绩 select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [涉及到成绩:成绩表score] where 查询条件 [没有] group by 分组 [每个学生的平均:按学号分组] having 对分组结果指定条件 [没有] order by 对查询结果排序[没有]; */ select 学号, avg(成绩) as 平均成绩 from score groupby 学号;
/* 第2步:再加上限制条件: 1)不及格课程 2)两门以上[不及格课程] select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [涉及到成绩:成绩表score] where 查询条件 [限制条件:不及格课程,平均成绩<60] group by 分组 [每个学生的平均:按学号分组] having 对分组结果指定条件 [限制条件:课程数目>2,汇总函数count(课程号)>2] order by 对查询结果排序[没有]; */ select 学号, avg(成绩) as 平均成绩 from score where 成绩 <60 groupby 学号 havingcount(课程号)>=2;