MySQL 数据库查询练习

时间:2023-03-09 01:56:13
MySQL 数据库查询练习
-- ----------------------------
-- mysql练习sql脚本
-- ----------------------------
create database db10; -- 创建db10数据库
use db10; -- 切换到db10数据库
create table dept( -- 创建部门表
deptno int primary key, -- 部门编号
deptname varchar(), -- 部门名称
loc varchar() -- 部门位置
);
create table emp( -- 创建员工表
empno int primary key, -- 员工编号 primary key设置主键:值必须唯一且不能为空
empname varchar(), -- 员工姓名
job varchar(), -- 职位
mgr int, -- 直属上级
hiredate date, -- 受雇日期
sal int, -- 薪资
comm int, -- 奖金
deptno int, -- 所在部门编号
foreign key(deptno) references dept(deptno)
);
-- ----------------------------
-- Records of dept 部门表数据
-- ----------------------------
INSERT INTO `dept` VALUES ('', '会计部', '北京');
INSERT INTO `dept` VALUES ('', '调查部', '杭州');
INSERT INTO `dept` VALUES ('', '销售部', '上海');
INSERT INTO `dept` VALUES ('', '营销部', '深圳'); -- ----------------------------
-- Records of emp 员工表数据
-- ----------------------------
INSERT INTO `emp` VALUES ('', '张无忌', '办事员', '', '1980-12-17', '', null, '');
INSERT INTO `emp` VALUES ('', '曹操', '推销员', '', '1981-02-20', '', '', '');
INSERT INTO `emp` VALUES ('', '杨志', '推销员', '', '1981-02-22', '', '', '');
INSERT INTO `emp` VALUES ('', '朱元璋', '经理', '', '1981-04-02', '', null, '');
INSERT INTO `emp` VALUES ('', '殷天正', '推销员', '', '1981-09-28', '', '', '');
INSERT INTO `emp` VALUES ('', '张三丰', '经理', '', '1981-05-01', '', null, '');
INSERT INTO `emp` VALUES ('', '关羽', '经理', '', '1981-06-09', '', null, '');
INSERT INTO `emp` VALUES ('', '宋江', '分析员', '', '1987-04-19', '', null, '');
INSERT INTO `emp` VALUES ('', '韩少云', '董事长', null, '1981-11-17', '', null, '');
INSERT INTO `emp` VALUES ('', '孙二娘', '推销员', '', '1981-09-08', '', '', '');
INSERT INTO `emp` VALUES ('', '张飞', '办事员', '', '1987-05-23', '', null, '');
INSERT INTO `emp` VALUES ('', '赵云', '办事员', '', '1981-12-03', '', null, '');
INSERT INTO `emp` VALUES ('', '诸葛亮', '分析员', '', '1981-12-03', '', null, '');
INSERT INTO `emp` VALUES ('', '夏侯惇', '办事员', '', '1982-01-23', '', null, '');

要求:

-- .列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。

-- .列出薪资比关羽高的所有员工。

-- .列出所有员工的姓名及其直接上级的姓名。

-- .列出最低薪资大于1500的各种职位及从事此职位的员工人数。

-- .列出在销售部职位的员工的姓名,假定不知道销售部的部门编号。

-- .列出与曹操从事相同职位的所有员工及部门名称。

-- .列出薪资高于在销售部(已知部门编号为30)就职的所有员工的薪资的员工姓名和薪资、部门名称。

-- .列出在每个部门职位的员工数量、平均工资。

-- .查出至少有一个员工的部门。显示部门人数、部门编号、部门名称、部门位置。

-- .列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。

-- .列出所有职员的姓名及其部门名称,部门的人数。

答案:

+----------+-------+---------+--------+------+------------+------+------+--------+
| deptname | empno | empname | job | mgr | hiredate | sal | comm | deptno |
+----------+-------+---------+--------+------+------------+------+------+--------+
| 会计部 | | 关羽 | 经理 | | -- | | NULL | |
| 会计部 | | 韩少云 | 董事长 | NULL | -- | | NULL | |
| 会计部 | | 夏侯惇 | 办事员 | | -- | | NULL | |
| 调查部 | | 张无忌 | 办事员 | | -- | | NULL | |
| 调查部 | | 朱元璋 | 经理 | | -- | | NULL | |
| 调查部 | | 宋江 | 分析员 | | -- | | NULL | |
| 调查部 | | 张飞 | 办事员 | | -- | | NULL | |
| 调查部 | | 诸葛亮 | 分析员 | | -- | | NULL | |
| 销售部 | | 曹操 | 推销员 | | -- | | | |
| 销售部 | | 杨志 | 推销员 | | -- | | | |
| 销售部 | | 殷天正 | 推销员 | | -- | | | |
| 销售部 | | 张三丰 | 经理 | | -- | | NULL | |
| 销售部 | | 孙二娘 | 推销员 | | -- | | | |
| 销售部 | | 赵云 | 办事员 | | -- | | NULL | |
+----------+-------+---------+--------+------+------------+------+------+--------+ -- .列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
/*
列: deptname, emp.*
条件: emp.deptno=dept.deptno
*/
select d.deptname, e.*
from dept d left join emp e
on e.deptno=d.deptno; -- .列出薪资比关羽高的所有员工。
/*
列: emp.*
表: emp
条件: sal>(关羽的薪资)
*/
-- 求出关羽的薪资: select *
from emp
where sal> (select sal from emp where empname='关羽'); -- .列出所有员工的姓名及其直接上级的姓名。
/*
列: e1.empname, (直接上级)e2.empname
表: emp e1, emp e2
条件: e1.mgr=e2.empno
*/
select e1.empname, e2.empname
from emp e1, emp e2
where e1.mgr=e2.empno; -- .列出最低薪资大于1500的各种职位及从事此职位的员工人数。
/*
列: job 员工人数
表: emp
条件: 最低薪资(分组)>
分组条件: job
*/ select job, min(sal) 最低工资, count(*) 员工人数
from emp
group by job
having min(sal)>; -- .列出在销售部的员工的姓名,假定不知道销售部的部门编号。
/*
列: empname
表: dept d, emp e
条件: d.deptname='销售部' d.deptno=e.deptno
*/
select e.empname, d.deptname
from dept d, emp e
where d.deptname='销售部' and d.deptno=e.deptno; -- .列出与曹操从事相同职位的所有员工及部门名称。
/*
列: e.empname d.deptname
表: emp e, dept d
条件: job='曹操的职位' e.deptno=d.deptno
*/
select e.empname, d.deptname, e.job
from emp e, dept d
where e.deptno=d.deptno and job=(select job from emp where empname='曹操'); -- .列出薪资高于在销售部(已知部门编号为30)就职的所有员工的薪资的员工姓名和薪资、部门名称。
/*
列: e.empname, e.sal, d.deptname
表: emp e, dept d
条件: e.deptno=d.deptno sal> (30号部门的最高薪资)
*/
select d.deptname, e.* /*select d.deptname, e.sal, e.empname*/
from emp e, dept d
where e.deptno=d.deptno and e.sal > (select max(sal) from emp where deptno=); -- .列出在每个部门职位的员工数量、平均工资。
/*
列: 员工数量, 平均工资
表: emp
分组条件: deptno
聚合函数: count(*), avg(sal)
*/
select deptno, count(*) 员工数量, avg(sal) 平均工资
from emp
group by deptno; -- .查出至少有一个员工的部门。显示部门人数、部门编号、部门名称、部门位置。
/*
列: 部门人数(count(*)) d.deptno, d.deptname, d.loc
表: emp e, dept d
条件: e.deptno=d.deptno
分组条件: e.deptno
*/
select d.*, count(*) 部门人数
from emp e, dept d
where e.deptno=d.deptno
group by e.deptno; -- .列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。
/*
列: e.empno, e.empname, d.deptname
表: emp e1, emp e2, dept d
条件: e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno
*/
select e1.empno, e1.empname, d.deptname
from emp e1, emp e2, dept d
where e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno; -- .列出所有职员的姓名及其部门名称,部门的人数。
/*
张三丰 调查部
列: e.empname, count(*)(分组e.deptno), d.deptname
表: emp e, dept d
条件: e.deptno=d.deptno
分组条件: e.deptno
*/
--查询员工及对应的部门
select e.empname, d.deptname, d.deptno
from emp e, dept d
where e.deptno=d.deptno; --查询部门的人数
select deptno, count(*) cnt
from emp
group by deptno --关联查询
select e.empname, d.deptname, e.deptno, e2.cnt 部门人数
from emp e, dept d, (
select deptno, count(*) cnt
from emp
group by deptno
) e2
where e.deptno=d.deptno and e.deptno=e2.deptno;