编程思路是为主 代码为辅
第一题(简单):
问题描述:
下面有两张表 一张employees(员工表) 和 dept_manager(领导表)要求找出不是领导的员工号(emp_no)
数据库表结构:
drop table if exists `dept_manager` ;
drop table if exists `employees` ;
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
INSERT INTO dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
INSERT INTO dept_manager VALUES('d002',10003,'1990-08-05','9999-01-01');
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
首先这个题是找出获取所有非manager的员工emp_no 从题中我们可以提取出 非manager 这个就是切入点 这个非可以对照sql 中 not in 也就是先查出来 dept 表中emp_no的员工号作为过来条件使用 也就使用子查询 代码如下:
select emp_no from employees where emp_no not in (select emp_no from dept_manager)
第二题(中等)
问题描述:
要求获取所有员工的manager 同时 员工如果同时是部门领导就不进行显示
员工表 领导表 正确结果
表结构
drop table if exists `dept_emp` ;
drop table if exists `dept_manager` ;
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d002','1995-12-03','9999-01-01');
INSERT INTO dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
INSERT INTO dept_manager VALUES('d002',10003,'1990-08-05','9999-01-01');
首先这个思路我们可以根据题意得到 有效的条件是 查询员工所在部门的领导 但是不显示员工就是部门领导的数据 也就是说过滤条件是一个相等(员工表中的dept_no = 领导表中的dept_no) 一个不等(员工表中的 emp_no <> 领导表中的emp_no) 思路有了代码就很好实现
select a.emp_no, b.emp_no
from dept_emp a
left join dept_manager b
on a.dept_no = b.dept_no
where a.emp_no <> b.emp_no
第三题(困难)
问题描述:
获取每个部门中薪水最高的员工 返回dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列
员工表
薪资表 结果
表结构
-- Table structure for dept_emp
-- ----------------------------
DROP TABLE IF EXISTS `dept_emp`;
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`, `dept_no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of dept_emp
-- ----------------------------
INSERT INTO `dept_emp` VALUES (10001, 'd001', '1986-06-26', '9999-01-01');
INSERT INTO `dept_emp` VALUES (10002, 'd001', '1996-08-03', '9999-01-01');
INSERT INTO `dept_emp` VALUES (10003, 'd002', '2021-09-06', '2021-09-13');
DROP TABLE IF EXISTS `salaries`;
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`, `from_date`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of salaries
-- ----------------------------
INSERT INTO `salaries` VALUES (10001, 88958, '2002-06-22', '9999-01-01');
INSERT INTO `salaries` VALUES (10002, 99999, '2001-08-02', '9999-01-01');
INSERT INTO `salaries` VALUES (10003, 9999, '2021-09-28', '2021-09-15');
思路分析 从题干中可以提取几个关键字 每个(想到分组),最高(max),升序(desc) 首先将两个表连接起来 然后根据 员工表中的部门进行分组 之后使用 desc 进行排序 输出的时候salary 要是最大值所以使用max进行处理 拿到关键词 编写就很简单了
SELECT dept.emp_no,dept.dept_no,max(sa.salary) FROM dept_emp dept join salaries sa on dept.emp_no = sa.emp_no GROUP BY dept.dept_no DESC
晚安
|