MySQL(题目讲解二)

༺ 个人主页 · 纪念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 别名


文章到此就告一段落,希望对你有所帮助,感谢观看!

相关推荐
涤生大数据1 小时前
Flink Agents 深度剖析:这才是生产级 AI Agent 该有的底座!
数据库·人工智能
消失的旧时光-19431 小时前
第 2 篇:Android 控制屏为什么与机器人主控使用 TCP 长连接?
android·tcp/ip·机器人
海上小飞龙1 小时前
Redis 持久化:RDB 与 AOF
数据库·redis·缓存
hold?fish:palm1 小时前
redis中AOF 重写机制解析
数据库·c++·redis
Minxinbb2 小时前
TDSQL for MySQL修改统计信息参数
数据库·dba
小Ti客栈2 小时前
MySQL查询原理:从Server到InnoDB
android·mysql·adb
2501_937860942 小时前
MySQL数据库入门|从零搞懂数据库基础、架构与存储引擎
数据库·mysql·架构
whn19772 小时前
达梦连接串JDBC测试程序
java·数据库
让头发掉下来2 小时前
Flink SQL 中两个频繁变化 Topic 的 Join 行为分析
大数据·数据库·sql·flink
小书房2 小时前
KMP跨平台之数据库
数据库·kmp