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

直入主题:

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

使用内连接,查询数据

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

-- 内连接:只显示匹配的数据

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

(1)左外连接:left join

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

(2)右外连接:right join

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

(3)全外连接

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

注意:在oracle中支持full join

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

(4)自连接

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

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

知识扩展:

三表查询:

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

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

第一步:连接emp和dept表

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

第二步:连接第三张表

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

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

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

下面,分享所有的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, '192021年04月13日-17', 800, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7499, 'ALLEN', 'SALESMAN', 7698, '192021年04月13日-20', 1600, 300, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7521, 'WARD', 'SALESMAN', 7698, '192021年04月13日-22', 1250, 500, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7566, 'JONES', 'MANAGER', 7839, '192021年04月13日-02', 2975, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7654, 'MARTIN', 'SALESMAN', 7698, '192021年04月13日-28', 1250, 1400, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7698, 'BLAKE', 'MANAGER', 7839, '192021年04月13日-01', 2850, null, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7782, 'CLARK', 'MANAGER', 7839, '192021年04月13日-09', 2450, null, 10);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7788, 'SCOTT', 'ANALYST', 7566, '192021年04月13日-19', 3000, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7839, 'KING', 'PRESIDENT', null, '192021年04月13日-17', 5000, null, 10);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7844, 'TURNER', 'SALESMAN', 7698, '192021年04月13日-08', 1500, 0, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7876, 'ADAMS', 'CLERK', 7788, '192021年04月13日-23', 1100, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7900, 'JAMES', 'CLERK', 7698, '192021年04月13日-03', 950, null, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7902, 'FORD', 'ANALYST', 7566, '192021年04月13日-03', 3000, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7934, 'MILLER', 'CLERK', 7782, '192021年04月13日-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;

复制代码

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

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

    清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦 直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问 ...

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

    直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问题:找不到SCOTT员工了,只有13条数据,这显然不合理:这就是内连接的缺 ...

  3. groovy怎样从sql语句中截取表名_sql注入mysql篇

    SQL注入 __0x01 ♛Sql注入原理 Sql注入顾名思义是没有对用户输入的参数进行过滤导致测试者可以将一段非正常语句插入到查询语句中,由web应用带入到数据库中执行,从而读取数据库中的数据. _ ...

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

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

  5. MS SQL 语句中的字符串连接

    在MS SqlServer中,需要将几个字段或是几个值连接作为一个字符串值输出时,可以使用"+"字符串连接符来连接即可,如: DECLARE @a nvarchar(30),@b  ...

  6. sql语句中的limit用法

    sql语句中的limit用法 limit 用于限制查询结果返回. 用法: limit a,b 其中a表示查询数据的起始位置,b表示返回的数量. (MySQL数据库中的记录是从0开始的) 举例: SEL ...

  7. oracle修改表结构的sql命令是什么,sql语句中修改表结构的命令是什么?

    sql语句中修改表结构的命令是:"ALTER TABLE"命令. ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中 ...

  8. oracle sql语句中包含‘’ 的解决方法

    oracle sql语句中包含'&' 的解决方法 参考文章: (1)oracle sql语句中包含'&' 的解决方法 (2)https://www.cnblogs.com/hm1990 ...

  9. winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...

    远程连接Oracle数据库的配置文件及sql语句 近期,应朋友的要求,用C#语言开发了一个winform应用程序,要求的是连接到远程的Oracle数据库,用惯了SQL Server的我突然有点懵,然后 ...

最新文章

  1. 使用文件给swap增加空间
  2. php sku添加,php – 在单个产品页面中显示SKU下的自定义字段值
  3. 个人作业——软件工程实践总结
  4. 计算机语言学 自然语言处理程序,利用知网进行(计算机)自然语言处理
  5. 一种RTP接收和解包的程序
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的体育器材管理系统
  7. or导致索引失效的解决方法_电容引脚断裂失效的机理和解决方法
  8. c语言坐标打印佛祖,C语言输入平面上两个点的坐标(double类型),计算两个点之间的距离。看”详细“里哪里写错了谢谢...
  9. CCNP交换实验(5) -- 网关热备冗余
  10. sl跨域访问-学习笔记2
  11. 高清加载具体(如清明上河图)
  12. 论文选题、标题、摘要怎么写
  13. 【论文翻译 AAAI 2020 | 知识图谱综述】A Survey on Knowledge Graphs: Representation, Acquisition and Applications
  14. Goolge-TPU论文解读
  15. 百度正式开放大数据引擎
  16. bootstrap3 侧边导航栏
  17. 弱电机房工程搬迁工作内容(方案)
  18. 基于C#程序触摸屏软件盘开发总结
  19. 异常检测方法梳理,看这篇就够了!
  20. 尚硅谷Java、HTML5前端、全栈式开发视频

热门文章

  1. css实现一个写信的格式
  2. vmstat - Linux系统性能监控工具
  3. conda (picard)
  4. BED文件如何排序,sort按列排序
  5. MySQL的视图、事务和索引
  6. Centos7安装Nginx+PHP
  7. 一文读懂word embedding
  8. HDU 1022[Train Problem I] 栈的应用
  9. 四大传值详解:属性传值,单例传值,代理传值,block传值
  10. 给大家推荐几本经典技术书籍