
༺ 个人主页 · 纪念229 ༻
༒专栏目录:《算法》༒
༒专栏目录:《MySQL数据库》༒
༺世上本没有路,走的人多了自然就有了༻
本篇文章讲的是我在做MySQL题中的一些见解,希望对你有所帮助。
这里有个提醒,sql题中有些就没给测试用列,所以测试用列错误试着提交
看看这题是否OJ
以下是题目链接
文章目录
1.查找所有员工入职时候的薪水情况
题目如下所示:

题目要求:
查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)
看题所知,给了两个表一般来说都要用上
给出emp_no以及salary
emp_no两表都有,salary只有salaries有
显然这是多表联合查询
代码展示:
c
select e.emp_no, s.salary from employees e join salaries s
on e.emp_no = s.emp_no
where e.hire_date = s.from_date
order by e.emp_no desc;
讲解
多表联合查询:
分为两种
1.两张表存在关联字段
统称:连接查询(JOIN),细分3类
内连接 INNER JOIN
只取出两边能匹配上关联键的数据(你截图里这条就是)
左外连接 LEFT JOIN
保留左表全部数据,右表匹配不到填 NULL
右外连接 RIGHT JOIN
保留右表全部数据,左表匹配不到填 NULL
2.两张表不存在关联字段
叫:笛卡尔积
首先多表联合查询用的两个表要用别名且用join连接
要想有关联后接on 表之间的关系
代码展示:
c
select e.emp_no, s.salary from employees e join salaries s
on e.emp_no = s.emp_no
给出emp_no以及salary
两表中都有emp_no说明两表有关联
怎么写上面代码已解释过了
注意:e.emp_no, s.salary也可以写成s.emp_no, s.salary
只不过s表是主表所以用它
查找所有员工入职时候的薪水
查找用where可以找
入职时间:我们看表employees中有hire_date(入职时间)
salaries中有
from_date date NOT NULL,
to_date date NOT NULL,
这里指上班从哪天开始到现在
用
c
where where e.hire_date = s.from_date
这么写在查找薪水即可找到员工入职时候的薪水情况
最后emp_no进行逆序
c
order by e.emp_no desc;
注意括号里的内容与找所有员工入职时候的薪水情况无关用不着
考察的是对题目的了解,这是一个坑
2.获取所有非manager的员工emp_no
题目如下所示


语法展示
c
select e.emp_no from employees e left join dept_manager d
on e.emp_no=d.emp_no
where d.emp_no IS NULL;
要求:请你找出所有非部门领导的员工emp_no
这里讲一下内连接、左外连接、右外连接
以此题目来讲两表dept_manager和emp_no
on e.emp_no=d.emp_no以emp_no为链接
注意连接不改变表的实际结构,只是展示结构发生改变
内连接
左右两边只留下emp_no相同的行
左外连接
左表不变右表emp_no 多加10001(但是内容全为NULL)
右外连接
右表不变左表去掉emp_no 10001的那一行
找出非部门领导的员工emp_no
c
where d.emp_no IS NULL
由这题看
c
select e.emp_no from employees e left join dept_manager d
on e.emp_no=d.emp_no
因为是左外连接
表 IS NULL
作用:找出该表为NULL的那一行
即该题求的
所有非部门领导的员工emp_no
3.获取所有员工当前的manager
题目如下所示:


语法展示:
c
select e.emp_no emp_no ,m.emp_no manager
from dept_emp e join dept_manager m
on e.dept_no=m.dept_no
where e.emp_no<>m.emp_no;
题目要求:获取所有的员工和员工对应的经理
讲解:
首先题目给了两个表说明是关联表问题
获取所有的员工和员工对应的经理(找的人在同一部门)
及on e.dept_no=m.dept_no(dept_no部门编号前提)
如果员工本身是经理的话则不显示(说明在同一部门情况下,e和m两表的编号不同)
c
where e.emp_no<>m.emp_no
因为用的是关联表select显示的是e.xxxxx/m.xxxxx
题目要求

取别名即可
e.xxxxx/m.xxxxx 别名/ e.xxxxx/m.xxxxx as 别名
文章到此就告一段落,希望对你有所帮助,感谢观看!