欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

程序员文章站 2023-10-17 08:37:36
直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问题:找不到SCOTT员工了,只有13条数据,这显然不合理;这就是内连接的缺点 -- 内连接:只显示匹配的数据-- 外连接:显示匹配的数据,还显示(部分或者全部)不匹配的数据, ......

直入主题:

我们做一个操作,将员工scott的部门去掉,再次通过内连接查看数据,看看会产生什么现象?

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

使用内连接,查询数据

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

问题:找不到scott员工了,只有13条数据,这显然不合理;这就是内连接的缺点

-- 内连接:只显示匹配的数据
-- 外连接:显示匹配的数据,还显示(部分或者全部)不匹配的数据,那就是显示(全部)的数据

(1)左外连接:left join

特点:左表全部显示,包括不匹配的数据,右表进行匹配显示

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

(2)右外连接:right join

右表全部显示,包括不匹配的数据,左表进行匹配显示

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

(3)全外连接

左表和右表的数据都会显示,包括不匹配的数据

注意:在oracle中支持full  join

   在mysql中不支持全外连接,但是,可以通过union 连接左外连接和右外连接,达到全外连接的效果

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

(4)自连接

 思路:将一张表看做两张表  下级表   上级表

举例:显示没有上级的员工(king)

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

 

 知识扩展:

三表查询:

就是先查两张表,将查出的结果看成一张表,然后跟第三张表进行联合查询,本质还是两表查询

准备工作:先添加一张薪资等级表

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

第一步:连接emp和dept表

 查询员工的编号、姓名、薪水、部门编号、部门名称

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

第二步:连接第三张表

-- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

至此,全部的表连接讲解完毕!

欢迎留言,指出问题,有则改之无则加勉

下面,分享所有的sql语句:

create table dept
(
  deptno int(2) not null,
  dname  varchar(14),
  loc    varchar(13)
);
alter table dept
  add constraint pk_dept primary key (deptno);
create table emp
(
  empno    int(4) primary key,
  ename    varchar(10),
  job      varchar(9),
  mgr      int(4),
  hiredate date,
  sal      double(7,2),
  comm     double(7,2),
  deptno   int(2)
);
alter table emp
  add constraint fk_deptno foreign key (deptno)
  references dept (deptno);
create table salgrade
(
  grade int primary key,
  losal double(7,2),
  hisal double(7,2)
);
create table bonus
(
  ename varchar(10),
  job   varchar(9),
  sal   double(7,2),
  comm  double(7,2)
);
commit;
insert into dept (deptno, dname, loc)
values (10, 'accounting', 'new york');
insert into dept (deptno, dname, loc)
values (20, 'research', 'dallas');
insert into dept (deptno, dname, loc)
values (30, 'sales', 'chicago');
insert into dept (deptno, dname, loc)
values (40, 'operations', 'boston');
commit;
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'smith', 'clerk', 7902, '1980-12-17', 800, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'allen', 'salesman', 7698, '1981-02-20', 1600, 300, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'ward', 'salesman', 7698, '1981-02-22', 1250, 500, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'jones', 'manager', 7839, '1981-04-02', 2975, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'martin', 'salesman', 7698, '1981-09-28', 1250, 1400, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'blake', 'manager', 7839, '1981-05-01', 2850, null, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'clark', 'manager', 7839, '1981-06-09', 2450, null, 10);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'scott', 'analyst', 7566, '1987-04-19', 3000, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'king', 'president', null, '1981-11-17', 5000, null, 10);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'turner', 'salesman', 7698, '1981-09-08', 1500, 0, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'adams', 'clerk', 7788, '1987-05-23', 1100, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'james', 'clerk', 7698, '1981-12-03', 950, null, 30);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'ford', 'analyst', 7566, '1981-12-03', 3000, null, 20);
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'miller', 'clerk', 7782, '1982-01-23', 1300, null, 10);
commit;
insert into salgrade (grade, losal, hisal)
values (1, 700, 1200);
insert into salgrade (grade, losal, hisal)
values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal)
values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal)
values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal)
values (5, 3001, 9999);
commit;
-- 一、内连接
-- 交叉连接 cross join
-- 笛卡尔积现象
select * 
from emp
cross join dept;
-- 使用using,只显示指定的同名字段
select * 
from emp e
cross join dept d
using (deptno);
-- 使用on,指定不同名的字段
select *
from emp e
cross join dept d
on(e.deptno = d.deptno);
-- natural join 自然连接 所有同名列只显示一次
select *
from emp
natural join dept;
-- 二、外连接
-- 左外连接  emp左表,dept 右表,左表全部显示,包括没有数据的列
select *
from emp e -- 左表
left join dept d -- 右表
on(e.deptno = d.deptno);
-- 右外连接  emp左表, dept右表,右表全部显示,包括没有数据的列
select * 
from emp e  -- 左表
right join dept d -- 右表
on(e.deptno = d.deptno);
-- 全外连接 ,oracle支持,mysql不支持
-- 可以通过关键字union进行解决,左表和右表的无对应数据列都会显示
select *
from emp e
left join dept d
on(e.deptno = d.deptno);
union 
select * 
from emp e
right join dept d
on(e.deptno = d.deptno);
-- 三、三表查询
select * from emp;
select * from dept;
select * from salgrade;
-- 第一步,先查两张表
select e.empno,e.ename,e.sal,d.deptno,d.dname
from emp e
join dept d
on e.deptno = d.deptno;
-- 第二步,连接第三张表
select e.empno, e.ename,e.sal,d.deptno,d.dname,sg.grade
from emp e
join dept d
on e.deptno = d.deptno 
join salgrade sg
on e.sal between sg.losal and sg.hisal; 
-- 四、自连接
-- 不是所有表都可以进行自连接,只有表中的两列有关联关系,才可以进行自连接查询
-- 将自身分解成两张表
select e.empno,e.ename,e.mgr,m.empno,m.ename
from emp e
left join emp m
on e.mgr = m.empno;