༺ 个人主页 · 纪念229 ༻
🏠我的博客主页🏠
༒专栏目录:《数据结构》༒
༒专栏目录:《算法》༒
༒专栏目录:《MySQL数据库》༒
༒其它有趣的计算机知识༒
༺世上本没有路,走的人多了自然就有了༻
本篇文章讲的是我在做MySQL题中的一些见解,希望对你有所帮助。
这里有个提醒,sql题中有些就没给测试用列,所以测试用列错误试着提交
看看这题是否OJ
以下是题目链接
文章目录
- 1.查找所有员工入职时候的薪水情况
- 2.获取所有非manager的员工emp_no
- 3.获取所有员工当前的manager
1.查找所有员工入职时候的薪水情况
题目如下所示:
题目要求:
查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)
看题所知,给了两个表一般来说都要用上
给出emp_no以及salary
emp_no两表都有,salary只有salaries有
显然这是多表联合查询
代码展示:
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 表之间的关系
代码展示:
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_datedate NOT NULL,to_datedate NOT NULL,
这里指上班从哪天开始到现在
用
where where e.hire_date=s.from_date这么写在查找薪水即可找到员工入职时候的薪水情况
最后emp_no进行逆序
order by e.emp_no desc;注意括号里的内容与找所有员工入职时候的薪水情况无关用不着
考察的是对题目的了解,这是一个坑
2.获取所有非manager的员工emp_no
题目如下所示
语法展示
select e.emp_no from employees e left join dept_manager d on e.emp_no=d.emp_no where d.emp_no ISNULL;要求:请你找出所有非部门领导的员工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
where d.emp_no ISNULL由这题看
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
题目如下所示:
语法展示:
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两表的编号不同)
where e.emp_no<>m.emp_no因为用的是关联表select显示的是e.xxxxx/m.xxxxx
题目要求
取别名即可
e.xxxxx/m.xxxxx 别名/ e.xxxxx/m.xxxxx as 别名
文章到此就告一段落,希望对你有所帮助,感谢观看!