一、学习背景
(一)今天遇到了什么问题?
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 语法细节很重要:一个多余的逗号就能导致错误
- 理解自连接的本质:必须通过不同别名区分表实例
- 仔细阅读题目要求:输出列名必须完全匹配
- 分步调试:先验证连接结果,再添加筛选条件
(二)避免的常见错误:
- ❌
SELECT e.name,→ ✅SELECT e.name AS Employee - ❌
ON e.managerId = e.id→ ✅ON e.managerId = m.id - ❌ 忘记处理 NULL 值 → ✅ 使用 INNER JOIN 或显式处理 NULL
- ❌ 列名不匹配 → ✅ 使用 AS 指定正确列名
6万+

被折叠的 条评论
为什么被折叠?



