SQL 面试题 一 (有关内连接、左、右连接、最大最小值)

题目一:

 有两张表:部门表department  部门编号dept_id  部门名称dept_name            
               员工表employee     员工编号emp_id  员工姓名emp_name  部门编号dept_id   工资emp_wage 
根据下列题目写出sql:
1、列出工资大于5000的员工所属的部门名、员工id和员工工资; 
2、列出员工表中的部门id对应的名称和员工id(左连接) 
3、列出员工大于等于2人的部门编号 
4、列出工资最高的员工姓名 
5、求各部门的平均工资 
6、求各部门的员工工资总额 
7、求每个部门中的最大工资值和最小工资值,并且它的最小值小于5000,最大值大于10000 
8、假如现在在库中有一个和员工表结构相同的空表employee2,请用一条sql语句将employee表中的所以记录插入到employee2表中。 
answer:

1: 列出工资大于5000的员工所属的部门名、员工id和员工工资;
 
select emp_id,emp_wage,dept_name from employee as e inner join department as d on e.dept_id=d.dept_id where e.emp_wage>5000 group by e.emp_id;

 2: 列出员工表中的部门id对应的名称和员工id(左连接)
 
select dept_name,emp_id from department d left join employee e on e.dept_id=d.dept_id group by e.emp_id;
 
+------------+--------+
| dept_name  | emp_id |
+------------+--------+
| 咨询部     | NULL   |
| 软件开发部 |   1001 |
| 市场策划部 |   1002 |
| 销售部     |   1003 |
| HR         |   1004 |
| HR         |   1005 |
| HR         |   1006 |
| 软件开发部 |   1007 |
+------------+--------+
 

 3: 列出员工大于等于2人的部门编号
 
 select dept_name from department d [inner] join employee e on d.dept_id=e.dept_id group by dept_name
 having count(e.dept_id) >=2;
 

 4: 列出工资最高的员工姓名
 
  select * from employee
where emp_wage =(select max(emp_wage) from employee);
+--------+----------+---------+----------+
| emp_id | emp_name | dept_id | emp_wage |
+--------+----------+---------+----------+
|   1007 | ad       |       1 |    12000 |
+--------+----------+---------+----------+

5:  求各部门的平均工资

select dept_name,AVG(emp_wage) as '平均工资' from employee  e join department d on e
.dept_id=d.dept_id Group by dept_name;
 +------------+------------+
| dept_name  | 平均工资   |
+------------+------------+
| HR         | 7500.0000  |
| 市场策划部 | 2500.0000  |
| 软件开发部 | 10000.0000 |
| 销售部     | 3200.0000  |
+------------+------------+
如果用右连接:
  select dept_name,AVG(emp_wage) as '平均工资' from employee  e right
 join department d on e.dept_id=d.dept_id Group by dept_name;
+------------+------------+
| dept_name  | 平均工资   |
+------------+------------+
| HR         | 7500.0000  |
| 咨询部     | NULL       |
| 市场策划部 | 2500.0000  |
| 软件开发部 | 10000.0000 |
| 销售部     | 3200.0000  |
+------------+------------+


 

6:求各部门的员工工资总额
select dept_name,SUM(emp_wage) as '部门工资总额' from employee  e join department d on e.dept_id=d.dept_id 
Group by dept_name;

 7: 求每个部门中的最大工资值和最小工资值,并且它的最小值小于5000,最大值大于10000
select dept_name ,max(emp_wage)from employee e inner join department d on e.dept_id=d.dept_id
where emp_wage>=10000
group by dept_name
union all
select dept_name ,
min(emp_wage) from employee e inner join department d on e.dept_id=d.dept_id
where emp_wage<=5000
group by dept_name;
如果是求每个部门中的最大工资值和最小工资值-->
select dept_name ,max(emp_wage),min(emp_wage) from employee e inner join department d on e.dept_id=d.dept_id group by dept_name;


 8: 假如现在在库中有一个和员工表结构相同的空表employee2,请用一条sql语句将employee表中的所以记录插入到employee2表中。
insert  into employee2 select * from employee;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值