会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132377个问题

SQL语句练习.doc

老师关于实操练习我有几个疑问

问题一:第25题,给的答案似乎时没有考虑薪水要求在1200以上的雇员这个条件,以下是代码,请老师帮我看看,我写的对不对

我的代码

select department_id,avg(salary),max(salary) from employees where salary>1200 group by department_id having avg(salary) >1500 order by avg(salary) desc;

习题答案的代码:

select department_id,avg(salary),max(salary) from employees group by department_id having avg(salary) >1500 order by avg(salary) desc;


问题二:第29题 求比普通员工的最高薪水还要高的经理人名称

代码:

select distinct em.last_name from employees em where em.salary>(select max(e.salary) from employees e,employees em where e.manager_id = em.employee_id);

不明白为什么下面这句代码得出的是普通员工的最高薪水,我将max(salary)改成distinct e.employee_id,e.last_name得出的是全部员工,并没有排除是经理的员工

select max(e.salary) from employees e,employees em where e.manager_id = em.employee_id


问题三:31题求部门经理人中平均薪水最低的部门名称

虽然结果一样,但是答案给的代码计算的是最低的经理人薪水,而不是平均薪水最低的部门,请老师看一下我的代码是否正确,还是我理解的有问题

我的代码:

select rownum,department_id from(select m.department_id from employees e,employees m  where e.manager_id = m.employee_id group by m.department_id order by avg(m.salary) ) where rownum = 1;

答案:

select department_id from employees  where salary = ( select min(manager.salary) from  employees emp,employees manager where emp.manager_id = manager.employee_id);


问题四:33题 求薪水最高的第 6 到第 10 名雇员

答案给的代码运行后得出的并不是薪水的第6到第10 名

这是我的代码,请老师看一下

select * from(select rownum rw,last_name,salary from (select  last_name,salary from employees order by salary desc )) e where e.rw between 6 and 10;


问题五:13题  分别利用 like 操作符和正则表达式,查处名字中含有"S"或者"M"的人员

正则表达式不会写



JAVA 全系列/第三阶段:数据库编程/SQL 语言 662楼
JAVA 全系列/第三阶段:数据库编程/SQL 语言 664楼
JAVA 全系列/第三阶段:数据库编程/MySQL数据库的使用 665楼
JAVA 全系列/第三阶段:数据库编程/MySQL数据库的使用 667楼
JAVA 全系列/第三阶段:数据库编程/MySQL数据库的使用 668楼
JAVA 全系列/第三阶段:数据库编程/SQL 语言 670楼
JAVA 全系列/第三阶段:数据库编程/SQL 语言 671楼

视频和讲义中如下两个问题,我觉的好像不对:


查询名字中含有两个 o 的雇员的名字与薪水。

select last_name,salary from employees where last_name REGEXP 'o.{2}'

查询雇员名字中包含 1 个或者两个 o 的雇员姓名与薪水。

select last_name,salary from employees where last_name REGEXP 'o.{1,2}'


一、问题分析:

select last_name,salary from employees where last_name REGEXP 'o.{2}'

我认为这条语句表示含有1个'0',2个或2个以上'.',也就是含有1个以上字母'o',最终返回结果:字符串出现第一个'o'的后面字符长度在2个以上,即满足要求,那么oldLu 也可以被选中。



二、问题验证:

mysql> select * from employees;
+-------------+-----------+-------------+---------+
| employee_id | last_name | email       | dept_id |
+-------------+-----------+-------------+---------+
|           1 | asb       | gjj@q.com   | NULL    |
|           2 | adal      | aa@da.com   | NULL    |
|           3 | huli      | dfd@qe.3com | NULL    |
|           4 | fox       | gdfx@gr     | NULL    |
|           5 | cagayauj  | zc          | NULL    |
|           6 | oldLu     | bm          | NULL    |
|           7 | oldoLu    | bj          | NULL    |
|           8 | oldoLou   | sxt         | NULL    |
+-------------+-----------+-------------+---------+
8 rows in set
mysql> select * from employees where last_name regexp'o.{1,3}';
+-------------+-----------+---------+---------+
| employee_id | last_name | email   | dept_id |
+-------------+-----------+---------+---------+
|           4 | fox       | gdfx@gr | NULL    |
|           6 | oldLu     | bm      | NULL    |
|           7 | oldoLu    | bj      | NULL    |
|           8 | oldoLou   | sxt     | NULL    |
+-------------+-----------+---------+---------+
4 rows in set
mysql> select * from employees where last_name regexp'o.{2,3}';
+-------------+-----------+-------+---------+
| employee_id | last_name | email | dept_id |
+-------------+-----------+-------+---------+
|           6 | oldLu     | bm    | NULL    |
|           7 | oldoLu    | bj    | NULL    |
|           8 | oldoLou   | sxt   | NULL    |
+-------------+-----------+-------+---------+
3 rows in set
mysql> select * from employees where last_name regexp'o.{6,8}';
+-------------+-----------+-------+---------+
| employee_id | last_name | email | dept_id |
+-------------+-----------+-------+---------+
|           8 | oldoLou   | sxt   | NULL    |
+-------------+-----------+-------+---------+
1 row in set
mysql>

如上代码,

select * from employees where last_name regexp'o.{6,8}';

只选中 oldoLou,是因为这个字符串总长为7,出去1个o,还有6个字符长度,不选中oldoLu,是因为oldoLu除去1个o只剩5个字符了不满足 '.{6,8}'。

select * from employees where last_name regexp'o.{2,3}';

选中 oldLu 而不选中 fox,也是因为 fox中的 o后面只有1个字符,不满足'.{2,3}'。



三、疑问(我没找到解决方案)

针对如上的 employees 这个table,我要查询 last_name 有 2个o,也就是只选中“oldoLu”,怎么搞定呢?

同理如何搞定只有1个 o的,即只选中 “fox”和 “oldLu”。

再搞定有 2~3个o的,即只返回  "oldoLu"和 "oldoLou"。


JAVA 全系列/第三阶段:数据库编程/MySQL数据库的使用 673楼
JAVA 全系列/第三阶段:数据库编程/SQL 语言 674楼
JAVA 全系列/第三阶段:数据库编程/JDBC技术(旧) 675楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637