解决外连接无法查询有NULL的数据
起因是学习sql语句时做练习题:
– 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
发现前面几道题目用where语句都可以解决,这一题目不行,经过回忆发现是前面视频刚讲的内外连接根本没记住,所以在此整理一下相关知识点。
多表查询的分类
内连接
1. 隐式内连接: 即用含where的语句消除无用数据
语法格式:
select * from 表单1名称,表单2名称 where 条件
2. 显示内连接:用含on的语句消除,但功效一样,所以记一个就好了
语法格式:
select * from 表单1名称 jion 表单2名称 on 条件
外连接
左外连接:可以查询左表包括NULL在内的值(右外连接因为只是逻辑上的调转,所以略去)
语法格式:
select * from 左表名称 left join 右表名称 on 条件
此题用左外连接就可以解决。题目及解决代码如下:
– 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
员工表
id | name | 领导编码 |
---|---|---|
001 | 张三 | 002 |
002 | 李四 | 003 |
003 | 王五 | 004 |
004 | 赵六 | 005 |
005 | 王四聪 | (NULL) |
因为王四聪最大,所以没有领导,这题如果用外连接来做,则无法显示王四聪,因为外连接认为NULL的为非法语句,在条件判断时会排除在外。
错误示例:select
员工表.name,
t2.name leaderfrom
员工表,
员工表 t2where
员工表.领导编码= t2.id;
结果:
name | leader |
---|---|
张三 | 李四 |
李四 | 王五 |
王五 | 赵六 |
赵六 | 王四聪 |
从结果可以发现没有王四聪的行,因为王四聪领导为NULL,所以此方法不能使用,要想显示王四聪,则需要使用左外连接
select
员工表.name,
t2.name leaderfrom
员工表leftjoin
员工表 t2on
员工表.领导编码= t2.id;
则此时结果就可以显示王四聪一栏了。
name | leader |
---|---|
张三 | 李四 |
李四 | 王五 |
王五 | 赵六 |
赵六 | 王四聪 |
王四聪 | (NULL) |