【转行日记Day1】心理学3个月HR经验|今天学了MySQL

一、学习背景

(一)今天遇到了什么问题?

create table if not exists employee(
   id int primary key comment '雇员ID',
   name varchar(10) comment '姓名',
   salary int comment '工资',
   managerId int comment '经理ID'
);
insert into employee values
(1,'Joe',70000,3),
(2,'Henry',80000,43),
(3,'Sam',760000,Null),
(4,'Max',90000,Null);

以上为正常创建表的脚本,本题来自leetcode 中的第181题“超过经理收入的员工”。

以下是我为解答本题初次写的代码。

select e.name,
from employee e
inner join employee ee on e.managerId = e.id
where e.salary > ee.salary ;

问题1 :语法错误:select语句后存在多余逗号;

问题2:列名不匹配:未按照题目要求重新命名列“employee”;

正确写法如下:

​select e.name as employee
from employee e

e:代表普通员工表

问题3:逻辑错误:join语句中的表别名混淆

正确写法如下:

inner join employee ee on e.managerId = ee.id

ee:代表经理表(同同一张表,不同别名)

问题4:where条件中表别名引用错误

正确写法如下:

where e.salary > ee.salary ;

其实这里写对了,但是join的条件错了,这里也就变得毫无意义。。。

(二)今天的知识点能解决······

1.自连接:解决“同一张表中不同行之间的比较”问题;;

2.表别名:解决“如何区分同一表的多个实例”问题;

3.SQL 语法规范:解决“如何写出正确的 SQL 语句”问题;

4.数据关系处理:解决“如何表示和查询层级关系”问题。


二、核心概念

知识点1:自连接

技术定义:自连接是将同一张表进行连接操作的特殊连接方式,通过给表起不同的别名来区分不同的实例。

通俗解释:例如上面的这道题,你有一份公司员工名单,名单里既有普通员工也有经理。现在要找出工资比直接上级高的员工。但问题是,上级也在同一份名单里!这时就需要把这份名单当作“两份”来用:一份当作“员工名单”,一份当作“经理名单”,然后找出对应关系进行比较。

知识点2:表别名

通俗解释:就像给双胞胎起不同的名字以便区分。虽然他们是同一张表(有相同的结构),但扮演不同角色(一个是员工,一个是经理)。

为什么要用别名

  • 避免混淆:区分同一表的不同实例

  • 简化代码:用短名代替长表名

  • 提高可读性:通过别名表达表的作用(如 e 代表员工,m 代表经理)

知识点3:内连接-inner join

技术定义:INNER JOIN 返回两个表中满足连接条件的所有行。只有当左表和右表的某行在连接条件下匹配时,才会包含在结果集中。

通俗解释:只关心"有关系"的记录。比如只关心那些有经理的员工(经理ID不为空),没经理的员工就不考虑了。

inner join 标准语法如下:

select 列名列表
from 表1
inner join 表2 on 表1.列 = 表2.列;

关键特点

  • 只返回两个表中都有匹配的行

  • 自动排除 NULL 值不匹配的情况

  • 适合需要"必须存在关系"的场景

2种外连接相关知识点:

  • 左外连接 left join:包含左表所有行,右表匹配则显示,不匹配则 NUL
select 
    l.id AS left_id,
    l.value AS left_value,
    r.id AS right_id,
    r.value AS right_value
from left_table l
left join right_table r on l.id = r.id;
  • 右外连接 right join:包含右边表所有行,左表匹配则显示,不匹配则 NUL
select 
    l.id AS left_id,
    l.value AS left_value,
    r.id AS right_id,
    r.value AS right_value
from left_table l
right join right_table r on l.id = r.id;

知识点4:根据要求看是否需要重新命名列

写法1:使用as

select e.name employee

写法2:省略as

select e.name employee

写法3:输出列名是“name”,不是employee

select e.name

三、关键学习要点总结

(一)从我的错误中学到什么:

  • SQL 语法细节很重要:一个多余的逗号就能导致错误
  • 理解自连接的本质:必须通过不同别名区分表实例
  • 仔细阅读题目要求:输出列名必须完全匹配
  • 分步调试:先验证连接结果,再添加筛选条件

(二)避免的常见错误:

  1. ❌ SELECT e.name, → ✅ SELECT e.name AS Employee
  2. ❌ ON e.managerId = e.id → ✅ ON e.managerId = m.id
  3. ❌ 忘记处理 NULL 值 → ✅ 使用 INNER JOIN 或显式处理 NULL
  4. ❌ 列名不匹配 → ✅ 使用 AS 指定正确列名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值