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

时间:2022-09-30 09:04:52

直入主题:

我们做一个操作,将员工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;

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

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

    本文章目的:力求清晰明了讲解SQL语句的内连接的各种应用,没有深奥的理解! 前奏:这篇文章和下篇文章会将内连接和外连接讲解清楚SQL语句的多表查询常用的有以下几种:两表联合查询(1)内连接(2)外连接 ...

  2. sql语句中charindex的用法 可用于截取字符串

    使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.这两个函数是如何运转的,解释他们的区别.同时提供一些例子,通过这些例子,你可以可以考虑使用这两个函数来解决很多不同的字符搜索的问题. ...

  3. 回想sql语句中的各种连接

    1. 内连接(Inner Join) 内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接. 以下是ANSI SQL-92标准 select * from    t_ins ...

  4. SQL语句中不同的连接JOIN

    为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来.通常有以下几种连接方式: JOIN  or  INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何 ...

  5. sql语句中的join连接(左连接、右连接、全连接、内连接)

    内部连接(inner join): select * from d_user a inner join D_ORGANIZATION b on a.COMPANY_XID=b.ID  内部链接也是排他 ...

  6. sql语句中start with用法,用于表达一个复杂的目录树存储在一张表中

    select * from tablename start with 条件1 connect by prior 条件2 where 条件3

  7. Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”

    Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛卡尔积,然后在在里面查询符合的 ...

  8. Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)

    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B

  9. SQL Server中多表连接时驱动顺序对性能的影响

    本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

随机推荐

  1. 深入理解使用ListView时ArrayAdapter、SimpleAdapter、BaseAdapter的原理

    在使用ListView的时候,我们传给setAdapter方法的Adapter通常是ArrayAdapter.SimpleAdapter.BaseAdapter,但是这几个Adapter内部究竟是什么 ...

  2. JavaScript数据结构,队列和栈

    在JavaScript中为数组封装了大量的方法,比如:concat,pop,push,unshift,shift,forEach等,下面我将使用JavaScript提供的这些方法,实现队列和栈的操作. ...

  3. Starter Set of Functional Interfaces

    Java Development Kit 8 has a number of functional interfaces. Here we review the starter set-the int ...

  4. 从一个PHP数据生成 CSV 文件

    这的确是一个很简单的功能,从一个PHP数组生成一个.csv文件.此函数使用 fputcsv PHP 内置函数 <? function generateCsv($data, $delimiter ...

  5. 不容易理解的 lock 和 merge

    Hibernate:不容易理解的 lock 和 merge 目录 背景Lock官方的注释LockMode.NONELockMode.READLockMode.UPGRADEMerge官方注释detac ...

  6. Unity安装问题

    在VS2012中,使用NuGet安装Unity.MVC4的时候,提示以下错误: 'Unity' already has a dependency defined for 'CommonServiceL ...

  7. NABCD--团队项目1

    N: 1.学校中有很多学生是外省的,然后不知道附近有什么地方周末可以去玩. 2.学校中学生有很多用不到的东西但是联系不到合适的买家. A: 我们可以做一个软件,通过学号注册登陆软件,这样可以防止有人去 ...

  8. &OpenCurlyDoubleQuote;五年经验”年薪50W分享Java程序员掌握什么技术才不会被淘汰

    在这个IT系统动辄就是上亿流量的时代,Java作为大数据时代应用最广泛的语言,诞生了一批又一批的新技术,包括HBase.Hadoop.MQ.Netty.SpringCloud等等 . 一些独角兽公司以 ...

  9. Linux命令之tee - 重定向输出到多个文件

    http://codingstandards.iteye.com/blog/833695 tee 将标准输出复制一份 ls -al | tee -a tmpls.log ls -al >> ...

  10. 2018&period;4&period;2 flask web

    from flask import Flask,request from flask import jsonify from flask import render_template app = Fl ...