一、

获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。
结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。
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`));

这道题是读取dept_emp 中的 当前员工(9999-01-01)的部门(d001),从dept_manager 中读取该部门的经理(10002)。注意同一个人的话不输出。

1、

select e.emp_no,m.emp_no from dept_emp as e,dept_manager as m
where e.to_date="9999-01-01" and e.dept_no=m.dept_no and e.emp_no!=m.emp_no and m.to_date="9999-01-01"

注意是靠部门联系两个表,然后再判断 具体条件

2、join

select e.emp_no,m.emp_no as manager_no  --改名为manager_no
from dept_emp as e join dept_manager as m
on e.to_date="9999-01-01" and e.dept_no=m.dept_no and e.emp_no!=m.emp_no and m.to_date="9999-01-01"

3、left join

select e.emp_no,m.emp_no as manager_no  --改名为manager_no
from dept_emp as e left join dept_manager as m
on e.to_date="9999-01-01" and e.dept_no=m.dept_no and e.emp_no!=m.emp_no and m.to_date="9999-01-01"
where manager_no is not NUll

左连接去掉NULL。

二、

获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
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 `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`));

十个人六个部门,有重叠,找最高.

可以看到d001部门有两个员工,10001和1002,一个表中不能将1001和1002和为一类比较。所以得先用join连接两个表,而不能直接from a,b这种形式。

1、

select d.dept_no,d.emp_no,max(s.salary) from dept_emp as d join salaries as s --连接表

on d.emp_no=s.emp_no  --连接条件

where d.to_date="9999-01-01" and s.to_date="9999-01-01" --找到当前部门,薪水

group by d.dept_no  --按部门分组,找最大的

2、

select d.dept_no,d.emp_no,s.salary from dept_emp as d join salaries as s --连接表

on d.emp_no=s.emp_no  --连接条件

where d.to_date="9999-01-01" and s.to_date="9999-01-01" --找到当前部门,薪水

group by d.dept_no  --按部门分组,找最大的

having max(s.salary)  --函数放最后

三、

题目描述

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

统计职称人数

group by 分组,count 统计个数,having 控制条件

1、

select title,count(title) as t from titles 

group by title

四、

题目描述

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略。
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

where和having的不同之处在于,where是查找之前的限定,而having是查找之后。 

这道题是去这两个重

首先按engineer分组,然后按10010 去重

1、

select title,count(distinct emp_no) as t from titles
group by title
having t>=2

2、

select tt.title,count(1) as t from (select distinct emp_no,title from titles )as tt
group by tt.title
having t>=2

这里注意名称的命名  

五、

题目描述

查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
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`));

select * from employees as e
where e.emp_no%2==1 and e.last_name!="Mary"
order by hire_date desc

六、

题目描述

统计出当前各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。
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`));
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

1、

select t.title,avg(s.salary) from titles as t join salaries as s --合并表
on t.emp_no=s.emp_no and t.to_date="9999-01-01" and s.to_date="9999-01-01"--三个条件,人和职位对应起来,对应现在的工资,现在的人
group by t.title --按职位分类

虽然能通过测试,这段程序还是有问题的,如果向上题那样重复记录了,其实计算就是错误的。

七、

题目描述

获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
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`));
1、
条件限制,排序,读取
select emp_no,salary from salaries
where to_date="9999-01-01"
order by salary desc
limit 1,1

2、上面这段程序并没有考虑重复的情况

用distinct 去重复

select emp_no,salary from salaries
where to_date="9999-01-01" and salary=(select distinct salary from salaries where to_date="9999-01-01" order by salary desc limit 1,1)

3、比较大小的方式

select emp_no,max(salary) from salaries
where to_date="9999-01-01" and salary <(select max(salary) from salaries)

先读取最大的,然后比较选出次大的

八、

查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
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`));
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`));  

1、不用排序就是用比较的方法

select e.emp_no,max(s.salary),e.last_name,e.first_name from employees as e,salaries as s
where e.emp_no=s.emp_no and s.to_date="9999-01-01" and s.salary <(select max(salary) from salaries where to_date="9999-01-01")

九、

查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
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 `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`));  

输出结果如下才对

没有部门的显示none,10010编号的显示了两次

三个表,6个部门,11个人对应于部门,每个人情况表

首先employees和dept_emp左连接形成一个表,然后再左连接departments 形成新的表.考察left join的双层嵌套

select e.last_name,e.first_name,de.dept_name   --所有获取的内容放在前面

from (employees as e left join dept_emp as dp on e.emp_no=dp.emp_no) --第一层left join,形成新的表

left join departments as de on de.dept_no=dp.dept_no --第二层left join

十、

查找员工编号emp_now为10001其自入职以来的薪水salary涨幅值growth
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`));  

1、默认递增排列的

select max(s.salary)-min(s.salary) as growth from salaries as s

where s.emp_no="10001"

注意growth的生成,只能select ...as...的形式  

2、排序,找出第一个和最后一个

select (
(select salary from salaries where emp_no="10001" order by from_date desc limit 0,1)
-
(select salary from salaries where emp_no="10001" order by from_date limit 0,1)
)
as growth

SQL实战(二)的更多相关文章

  1. coreseek实战(二):windows下mysql数据源部分配置说明

    coreseek实战(二):windows下mysql数据源部分配置说明 关于coreseek在windows使用mysql数据源的配置,以及中文分词的详细说明,请参考官方文档: mysql数据源配置 ...

  2. SpringSecurity权限管理系统实战—二、日志、接口文档等实现

    系列目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战 ...

  3. 牛客网数据库SQL实战解析(51-61题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  4. 牛客网数据库SQL实战解析(31-40题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  5. 牛客网数据库SQL实战解析(21-30题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  6. 牛客网数据库SQL实战解析(11-20题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  7. 牛客网数据库SQL实战解析(1-10题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  8. MySQL:怒刷牛客网“sql实战”

    MySQL:怒刷牛客网"sql实战" 在对MySQL有一定了解后,抽空刷了一下 牛客网上的 数据库SQL 实战,在此做一点小小的记录 SQL1 查找最晚入职员工的所有信息 sele ...

  9. 【NFS项目实战二】NFS共享数据的时时同步推送备份

    [NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...

  10. chrome调试工具高级不完整使用指南(实战二)

    3.3 给页面添加测试脚本 在现实的工作中,我们往往会遇到一些问题在线上就会触发然后本地就触发不了的问题.或者是,要给某个元素写一个测试脚本.这个时候如果是浏览器有提供一个添加脚本的功能的话,那么我们 ...

随机推荐

  1. 【从零单排HBase 01】从一无所知到5分钟快速了解HBase

    最近公司正好准备投入HBase,因此做了一些基础学习准备,所以先暂时停止MySQL的更新,把HBase的学习心得跟大家分享一下,接下来一段时间都会发布HBase相关内容. 在学的过程中,发现跟MySQ ...

  2. 复盘MySQL分页查询优化方案

    一.前言 MySQL分页查询作为Java面试的一道高频面试题,这里有必要实践一下,毕竟实践出真知. 很多同学在做测试时苦于没有海量数据,官方其实是有一套测试库的. 二.模拟数据 这里模拟数据分2种情况 ...

  3. web架构之Nginx简介(1)

    目录 1.Nginx概述 2.Nginx快速安装 2.1.源码方式安装Nginx 2.2.yum方式安装Nginx 3.Nginx配置文件 4.Nginx核心功能模块 5.Ningx目录介绍 1.Ng ...

  4. Go 的 http 包的源码,通过代码我们可以看到整个的 http 处理过程

    func (srv *Server) Serve(l net.Listener) error {defer l.Close() var tempDelay time.Duration // how l ...

  5. activiti工作流解决历史批注中文乱码

    /** * 根据流程实例查询流程的批注信息 * * @param processInstanceId * @return */ private List<Comment> findComm ...

  6. vscode 新版设置备份20200221 settings.json

    vscode 新版设置备份20200221 { "sync.gist": "9e6a5f7e8c52047b03c8732ff88aab0e", "s ...

  7. tableZen maxHeight 解决方案 如果数据条数小于N,不进行高度设置,超过N条,直接设置高度,解决原生iview Table 对于右侧固定列,不能计算出正确数值的解决方案

    tableZen maxHeight 解决方案 如果数据条数小于N,不进行高度设置,超过N条,直接设置高度,解决原生iview Table 对于右侧固定列,不能计算出正确数值的解决方案 if (thi ...

  8. 【opencv系列01】OpenCV4.X介绍与安装

    一.介绍 OpenCV(开源计算机视觉库:http://opencv.org)是英特尔开源的一个跨平台计算机视觉的BSD许可库,包含数百种计算机视觉算法.OpenCV由Gary Bradsky于199 ...

  9. POI小demo

    使用poi需要先下载相关jar包(http://download.csdn.net/detail/wangkunisok/9454545) poi-3.14-20160307.jar poi-ooxm ...

  10. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...