-- inner join - on子句: 显示的是所有匹配的信息select*from emp e
innerjoin dept d
on e.deptno = d.deptno;
select*from emp;
select*from dept;
-- 问题:-- 1.40号部分没有员工,没有显示在查询结果中-- 2.员工scott没有部门,没有显示在查询结果中-- 外连接:除了显示匹配的数据之外,还可以显示不匹配的数据-- 左外连接: left outer join -- 左面的那个表的信息,即使不匹配也可以查看出效果select*from emp e
leftouterjoin dept d
on e.deptno = d.deptno;
-- 右外连接: right outer join -- 右面的那个表的信息,即使不匹配也可以查看出效果select*from emp e
rightouterjoin dept d
on e.deptno = d.deptno;
-- 全外连接 full outer join -- 这个语法在mysql中不支持,在oracle中支持 -- 展示左,右表全部不匹配的数据 -- scott ,40号部门都可以看到select*from emp e
fullouterjoin dept d
on e.deptno = d.deptno;
-- 解决mysql中不支持全外连接的问题:select*from emp e
leftouterjoin dept d
on e.deptno = d.deptno
union-- 并集 去重 效率低select*from emp e
rightouterjoin dept d
on e.deptno = d.deptno;
select*from emp e
leftouterjoin dept d
on e.deptno = d.deptno
unionall-- 并集 不去重 效率高select*from emp e
rightouterjoin dept d
on e.deptno = d.deptno;
-- mysql中对集合操作支持比较弱,只支持并集操作,交集,差集不支持(oracle中支持)-- outer可以省略不写
99语法:三表连接查询
-- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级select*from emp;
select*from dept;
select*from salgrade;
select e.ename,e.sal,e.empno,e.deptno,d.dname,s.*from emp e
rightouterjoin dept d
on e.deptno = d.deptno
innerjoin salgrade s
on e.sal between s.losal and s.hisal
99语法:自连接查询
-- 查询员工的编号、姓名、上级编号,上级的姓名select*from emp;
select e1.empno 员工编号,e1.ename 员工姓名,e1.mgr 领导编号,e2.ename 员工领导姓名
from emp e1
innerjoin emp e2
on e1.mgr = e2.empno;
-- 左外连接:select e1.empno 员工编号,e1.ename 员工姓名,e1.mgr 领导编号,e2.ename 员工领导姓名
from emp e1
leftouterjoin emp e2
on e1.mgr = e2.empno;
92语法:多表查询
-- 查询员工的编号,员工姓名,薪水,员工部门编号,部门名称:select e.empno,e.ename,e.sal,e.deptno,d.dname
from emp e,dept d
-- 相当于99语法中的cross join ,出现笛卡尔积,没有意义select e.empno,e.ename,e.sal,e.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno;
-- 相当于99语法中的natural join -- 查询员工的编号,员工姓名,薪水,员工部门编号,部门名称,查询出工资大于2000的员工select e.empno,e.ename,e.sal,e.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno and e.sal >2000;
-- 查询员工的名字,岗位,上级编号,上级名称(自连接):select e1.ename,e1.job,e1.mgr ,e2.ename
from emp e1,emp e2
where e1.mgr = e2.empno;
-- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级select e.empno,e.ename,e.sal,e.deptno,d.dname,s.grade
from emp e,dept d,salgrade s
where e.deptno = d.deptno and e.sal >= s.losal and e.sal <= s.hisal;
-- 总结:-- 1.92语法麻烦 -- 2.92语法中 表的连接条件 和 筛选条件 是放在一起的没有分开-- 3.99语法中提供了更多的查询连接类型:cross,natural,inner,outer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了